Apfelschiessen

Status
Nicht offen für weitere Antworten.

777

Bekanntes Mitglied
Ich möchte gerne ein Spiel proggen, was Apfelschiessen heißt.
Bisher funktioniert alles mit allein dem Fehler das das viel zu lahm ist! :(
Woran liegt das jetzt genau?


Code:
import java.awt.*;
import java.applet.*;

public class Applecatch extends java.applet.Applet implements Runnable
{
 int f1=0,f2=0,f3=0,f4=0,a=0,b=0,h=0,posx=0,posy=0;
 
 Thread Apfelschiessen = null;
  
 public void init()
 {
  setLayout(null);
  setSize(400,400);
 }  
 
 public void run()
 {
        while(true)
        {
        repaint();
        }
 }
 
 public void start()
 {
 Thread Apfelschiessen = new Thread(this);   
 Apfelschiessen.start();
 } 
 
      public void paint(Graphics g)
      {
        f1=(int)(Math.random()*200);
        f2=(int)(Math.random()*200);
        f3=(int)(Math.random()*200);
        f4=(int)(Math.random()*200);
        
        posx=(int)(Math.random()*300+10);
        posy=(int)(Math.random()*300+10);
        b=(int)(Math.random()*100+10);

        g.setColor(new Color(f1,f2,f3,f4));  
        g.fillOval(posx,posy,b,b); 
      }   
     
}


Ob ich die Sachen im Paint oder im Run ausführe ist irgendwie egal....
David
 

Redfrettchen

Bekanntes Mitglied
Hi,
also in Eclipse reinkopiert und gestartet seh ich ein Applet, wo dauernd irgendwelche Kreise auftauchen und wieder verschwinden (flackernd). Was ist daran jetzt zu lahm?

Code:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;

public class Applecatch extends Applet implements Runnable {
    private int
        f1 = 0,
        f2 = 0,
        f3 = 0,
        f4 = 0, 
        a = 0, 
        b = 0, 
        h = 0, 
        posx = 0,
        posy = 0;

    public void init() {
        setLayout(null);
        setSize(400, 400);
    }

    public void run() {
        while (true) {
            repaint();
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {

            }
        }
    }

    public void start() {
        (new Thread(this)).start();
    }

    public void paint(Graphics g) {
        f1 = (int) (Math.random() * 200);
        f2 = (int) (Math.random() * 200);
        f3 = (int) (Math.random() * 200);
        f4 = (int) (Math.random() * 200);

        posx = (int) (Math.random() * 300 + 10);
        posy = (int) (Math.random() * 300 + 10);
        b = (int) (Math.random() * 100 + 10);

        g.setColor(new Color(f1, f2, f3, f4));
        g.fillOval(posx, posy, b, b);
    }
}

Der obige Code ist lediglich ein bisschen schöner und angenehmer zu sehen (ohne Flackern). Aber die Performance ist nicht besser (sie war vorher schon exzellent).
 

Leroy42

Top Contributor
Grundregel 1: Keine Endlosschleifen in der paint()-Methode :noe:

Die paint-Methode wird vom sogenannten Event-Dispatch-Thread (EDT) aufgerufen
und ist für die gesamte GUI zuständig. Wenn du diese Methode nicht verläßt
oder lange darin bleibst, friert deine gesamte Anwendung ein. Das heißt,
dein Applet reagiert auf keine Buttonklicks mehr, kann keine Mauskoordinaten
auslesen (was du in deinem Spiel sicher später brauchst) und auch sonst
auf nichts reagieren.

Ein Aufruf von repaint bewirkt dahingehend keinen direkten Aufruf
von paint, sondern teilt dem EDT nur mit, daß er, sobald er Zeit hat, die
paint-Methode selbst aufruft. Der repaint-Aufruf kehrt also ohne was zu
Zeichnen sofort wieder zurück.

Grundregel 1: Keine Endlosschleifen in der run()-Methode von Threads ohne sleep() :noe:

Du teilst dem EDT in deiner unentwegt mit, daß er neu zeichnen soll.
Da du daß ohne Unterbrechung machst, müllst du ihn bestimmt mehrere
100.000 mal pro Sekunde zu (100% CPU-Auslastung). Wenn er dann mal zum
Atem holen kommt, ruft er zwar jedesmal nur einmal paint() auf, aber
der Effekt ist ziemlich chaotisch. Du mußt den "Aufruf-Thread" also
kurz schlafen legen:

Code:
public void run() {
  while(true) {
    repaint();
    try {Thread.sleep(750);} catch (InterruptedException e) {}
  }
}
Wie lange er schlafen soll mußt du ausprobieren.

Außerdem wirst du später noch eine Abbruchbedingung
einbauen müssen. Aber das später: Mach erst mal weiter
so und viel Erfolg
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben