Applet Tetris flackert

Java und so~

Mitglied
Alsooo~
ich schreibe momentan an einem Tetris programm (noch gaaaaaaanz am Anfang) und habe das Problem, dass ein Rechteck, was sich von oben nach unten bewegt nicht unten stehen bleibt, sondern aus dem Applet verschwindet und am unteren Rand wieder auftaucht und wieder verschwindet usw.
Mein Problem-Code dazu sieht so aus:
Java:
	public void run ()
	{

	    // Erniedrigen der ThreadPriority
	    Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

	    // Solange true ist läuft der Thread weiter
	    
	    while (true)
	    {
		    if (y_pos > appletsize_y + radius)
		    {

		        // Ändern der Position des Balles
		        y_pos = 280;

		    } 
		    
	    	//Verändere y Koordinate des Balls
	    	y_pos+=y_speed;
	        // Neuzeichnen des Applets
	        repaint();
	        
	        

	        try
	        {
	            // Stoppen des Threads für in Klammern angegebene Millisekunden
	            Thread.sleep (20);
	        }
	        catch (InterruptedException ex)
	        {
	            // do nothing
	        }

	        // Zurücksetzen der ThreadPriority auf Maximalwert
	        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
	    } 
	    
	}

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

public class Tetris extends Applet implements Runnable {

	int x_pos = 100;
	int y_pos = 10;
	int radius = 20;
	int y_speed = 1;
	int appletsize_x = 300;
	int appletsize_y = 300;
	private Image dbImage;
	private Graphics dbg;
	int w = this.getSize().width;
	int h = this.getSize().height;
	
	public void init() {
			this.resize(350,300);
	}

	public void start ()
	{

	    // Schaffen eines neuen Threads, in dem das Spiel läuft
	    Thread th = new Thread (this);
	    // Starten des Threads
	    th.start ();

	} 

	public void stop() { }

	public void destroy() { }

	public void run ()
	{

	    // Erniedrigen der ThreadPriority
	    Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

	    // Solange true ist läuft der Thread weiter
	    
	    while (true)
	    {
		    if (y_pos > appletsize_y + radius)
		    {

		        // Ändern der Position des Balles
		        y_pos = 280;

		    } 
		    
	    	//Verändere y Koordinate des Balls
	    	y_pos+=y_speed;
	        // Neuzeichnen des Applets
	        repaint();
	        
	        

	        try
	        {
	            // Stoppen des Threads für in Klammern angegebene Millisekunden
	            Thread.sleep (20);
	        }
	        catch (InterruptedException ex)
	        {
	            // do nothing
	        }

	        // Zurücksetzen der ThreadPriority auf Maximalwert
	        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
	    } 
	    
	} 

	public void paint (Graphics g)
	{

	    // Setzten der Zeichenfarbe auf Rot
	    g.setColor (Color.red);

	    // Zeichen eines gefüllten Rechtecks
	    g.fillRect (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);

	} 
	
	public void update (Graphics g)
	{

	    // Initialisierung des DoubleBuffers
	    if (dbImage == null)
	    {
	        dbImage = createImage (this.getSize().width, this.getSize().height);
	        dbg = dbImage.getGraphics ();
	    }

	    // Bildschirm im Hintergrund löschen
	    dbg.setColor (getBackground ());
	    dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

	    // Auf gelöschten Hintergrund Vordergrund zeichnen
	    dbg.setColor (getForeground());
	    paint (dbg);

	    // Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
	    g.drawImage (dbImage, 0, 0, this);

	}
	
	
}

Danke schonmal für jegliche hilfreiche Hinweise~
 
Zuletzt bearbeitet von einem Moderator:
Java:
if (y_pos > appletsize_y + radius)
            {
 
                // Ändern der Position des Balles
                y_pos = 280;
 
            }

Um es mal in Worte zu fassen:
Wenn dieses Objekt den unteren Rand unterschritten hat, dann bringe es (zurück) auf Position 280. Wenn das Applet höher ist, dann ist es klar, dass es immer hin und her springt.

Java:
public void init() {
            this.resize(350,300);
    }
 
Wenn ich die zahl y_pos auf 260 ändere wird es höher zurück gesetzt und geht wieder raus etc. und wenn ich es auf 320 setzte geht es raus und falckert außerhalb des Applets weiter... (20 als Differenz immer, da der "Radius" 20 beträgt)
Also wie soll ich es jetzt genau ändern?
 
Naja, du wirst irgendwann mehr als einen Stein haben. Dann würde ich empfehlen dafür eine eigene Klasse zu schreiben. Diese Objekte kannst du in einer LinkedList oder ArrayList lagern und bei jedem Threadaufruf über die Liste iterieren. Wenn dann ein Stein den Boden erreicht hast, dann musst du das Objekt aus der genannten Liste entfernen und in eine neue packen, deren Objekte nur gezeichnet aber nicht weiter bewegt werden. Natürlich empfiehlt es sich, diese ganzen Bewegungen in einer extra Methode auszulagern.
Quaxlies Tutorial, welches du im Spieleprogrammierungsbereich im Tutoriale-Thread findest, ist für das Grundgerüst eines Spiels seehr zu empfehlen.
 
Ich hab mir mal das Tut von Quaxlie angeguckt und den Code mal in Eclipse geschrieben um das zu Testen, allerdings zeigt Eclips mir immer nur "Exception in thread "main" java.lang.Error: Unresolved compilation problem: Cannot make a static reference to the non-static method GamePanel(int, int) from the type Tet" an.
Das Problem liegt bei der Methode GamePanel die nicht static ist, aber in der statischen main-Methode aufgerufen wird.

Code:
Java:
	public static void main (String[]args) {
		GamePanel(800, 600);
	}
	
	public void GamePanel (int w, int h){
		this.setPreferredSize(new Dimension(w, h));
		frame = new JFrame ("Tetris");
		frame.setLocation(100, 100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);
		
		doInitalizations();
		Thread th = new Thread(this);
		th.start();
	}
 
da groß geschrieben, ist im Original sicher der Konstruktor einer Klasse, und Aufruf = Objekterstellung mit new gemeint, richtig?

das und generell das Wissen, ob statische Methoden nicht-statische aufrufen können, bzw. was man dabei an Änderungsalternativen hat, sind ziemlich tiefe Grundlagen,
sehr fraglich dass du dann überhaupt verstehst was du da machst in komplizierten Applets mit GUI, Threads usw...
 
da groß geschrieben, ist im Original sicher der Konstruktor einer Klasse, und Aufruf = Objekterstellung mit new gemeint, richtig?

das und generell das Wissen, ob statische Methoden nicht-statische aufrufen können, bzw. was man dabei an Änderungsalternativen hat, sind ziemlich tiefe Grundlagen,
sehr fraglich dass du dann überhaupt verstehst was du da machst in komplizierten Applets mit GUI, Threads usw...

Ich habe im WS Programmieren I studiert (also alles ohne GUI etc.) und mache jetzt ein Praktikum indem ich mir GUI etc selbst beibringen soll (falls sich jemand darüber wundern sollte, dass ich nicht einfach weiter studiert habe: Habe nur ein Frühstudium im WS mit Programmieren I gemacht und mache nun an der gleichen Uni ein Schulpraktikum)
Den größten Teil verstehe ich ja bis jetzt schonmal, nur es verwirrt mich halt, dass es bei Quaxlie funktioniert und bei mir nicht...
 
aber das ist nun geklärt? Konstruktor vs. Methode?
spätestens, als du noch den im Original wie für Konstruktoren üblich fehlenden Rückgabetyp void ergänzen musstest,
hätte dir auffallen sollen, dass da was nicht stimmt
 
Zuletzt bearbeitet von einem Moderator:
Ich habe im WS Programmieren I studiert (also alles ohne GUI etc.) und mache jetzt ein Praktikum indem ich mir GUI etc selbst beibringen soll (falls sich jemand darüber wundern sollte, dass ich nicht einfach weiter studiert habe: Habe nur ein Frühstudium im WS mit Programmieren I gemacht und mache nun an der gleichen Uni ein Schulpraktikum)
Den größten Teil verstehe ich ja bis jetzt schonmal, nur es verwirrt mich halt, dass es bei Quaxlie funktioniert und bei mir nicht...

Weil Qiaxlie es anders geschrieben hat.

Java:
...
public static void main(String[] args){
 new GamePanel(800, 600);
}

public GamePanel(int w, int h){
...
}
...

bei den ... denk dir den Code der da hingehört.

In der main-Methode sollte hier ein Objekt erzeugt werden damit es funktioniert. Und Konstruktoren schreibt man ohne ein "void" bzw immer ohne Rückgabewert.

Edit: War ich wohl ein wenig zu langsam 😛
 

Neue Themen


Zurück
Oben