Snake pausieren

Warrior7777

Bekanntes Mitglied
Hallo miteinander

ich wollte mal Snake programmieren. Bitte keine Hinweise zu Bewegung der Schlange, daran will ich selbst noch ein wenig knobeln.🙂
Nun zu meinem Problem: Ich würde das Spiel gerne pausieren durch Drücken von p. Dadurch soll eine Variable pause auf true gesetzt werden und anschliessend der Thread angehalten werden.

Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

class Snake extends Frame implements Runnable{

	Thread thread;
	SnakeElement[] snake=new SnakeElement[15];
	int vx=5;
	int vy=0;
	int startx=350;
	int starty=350;
	int elementwidth=(new SnakeElement(0, 0)).getWidth();
	boolean pause=false;
	
	
	Snake(){
		super("Snake");
		setBounds(300, 300, 300, 300);
		addWindowListener(new ClosingAdapter());
		addKeyListener(new SnakeKeyAdapter());
		
		snake[0]=new SnakeElement(startx, starty);
		snake[1]=new SnakeElement(startx-elementwidth, starty);
		snake[2]=new SnakeElement((startx-2*elementwidth), starty);
		
		setVisible(true);
		thread=new Thread(this);
		thread.start();
	}
	
	public void run(){
		try{
			while(true){
				repaint();
				thread.sleep(10);
			}
		}catch(InterruptedException e){}
	}
	
	public void paint(Graphics g){
		for(int i=0; snake[i]!=null; i++){
			g.drawImage(snake[i].img, snake[i].x, snake[i].y, this);
		}
		moveSnake();
	}
	
	public void moveSnake(){
		for(int i=0; snake[i]!=null; i++){
			snake[i].x=snake[i].x+vx;
			snake[i].y=snake[i].y+vy;
		}
	}
	
	void pause(){
		try{
			if(pause){
				thread.wait();
			}else{
				thread.notify();
			}
		}catch(InterruptedException e){}
	}
	
	public static void main(String[] args){
		new Snake();
	}
}

Hier mein KeyListener:

Java:
import java.awt.*;
import java.awt.event.*;

class SnakeKeyAdapter extends KeyAdapter{

	static int vx=20;
	static int vy=20;
	
	public void keyPressed(KeyEvent e){
		//up
		if(e.getKeyCode()==38){
			((Snake)e.getComponent()).vy=-vy;
		}
		//down
		if(e.getKeyCode()==40){
			((Snake)e.getComponent()).vy=vy;
		}
		//left
		if(e.getKeyCode()==37){
			((Snake)e.getComponent()).vx=-vx;
		}
		//right
		if(e.getKeyCode()==39){
			((Snake)e.getComponent()).vx=vx;
		}
		//pause
		if(e.getKeyCode()==80){
			((Snake)e.getComponent()).pause=!((Snake)e.getComponent()).pause;
			((Snake)e.getComponent()).pause();
		}
	}
}

Beim Drücken von p gibt die JRE eine Fehlermeldung aus. Ich glaub es hat etwas mit dem Thread zu tun. Wird der Hauptthread durch p beendet (was ja nicht die Absicht ist). Oder ist es ein Synchronisationsproblem mit pause?

Danke schon im Voraus und Entschuldigung für den halben Roman. Denke aber lieber zu viele als zu wenige Infos.🙂
 
Wie wär´s denn, wenn du pause = true setzt und in deinem gameloop erstmal schaust, ob der pausiert ist.
lass den loop doch laufen und mach einfach nichts weiter, solange pause == true 😛

quasi sowas:
Java:
while(true){
   if(!pause){
      repaint();
   }
  thread.sleep(10);
}

[EDIT]poste dochmal deine Fehlermeldung, dann kann man auch etwas dazu sagen[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
Java:
    public void paint(Graphics g){
        for(int i=0; snake[i]!=null; i++){
            g.drawImage(snake[i].img, snake[i].x, snake[i].y, this);
        }
        moveSnake();
    }
In der paint bzw. paintComponent Methode solltest du ausschließlich zeichnen. Logik hat da nichts zu suchen.
Normalerweise hast du irgendwo nen Gameloop der deine Werte verändert. Am Ende der Loop würde dann einmal repaint() aufgerufen werden dass dein Spielfeld aktualisiert.
 
Das IST nur Zeichnen...Die Schleife zeichnet lediglich die einzelnen Elenente anhand derer x- und y-Werte. Diese werden durch moveSnake() gesetzt.
Kann man eine JRE Fehlermeldung irgendwie speichern? Hab keine Lust 30Zeilen abzuschreiben.
Trotzdem danke für den Hinweis!
 

Neue Themen


Zurück
Oben