Gå til innhold

KeyListener som ikke fungerer etter hensikten


Anbefalte innlegg

Driver og lager ett Snake-spill, men sitter fast når jeg prøver å få slangehodet til å bevege seg automatisk bortover med jevne mellomrom, uten at jeg må konstant trykke eller holde inne piltastene. Problemet er at selv når jeg trykker en annen tast etter å ha klikket opp-tasten, fortsetter hodet oppover. While-løkka skulle tilsi at den stoppet opp.

 

Har bare lagt inn oppover så langt, de andre retningene er gammel kode.

 

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
public class Snake2 extends JFrame implements KeyListener {
boolean opp, ned, venstre, hoyre;
Snakeelement2 hode = new Snakeelement2();
public Snake2() {
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.setBounds(0, 0, 600, 600);
	this.getContentPane().setBackground(Color.black);
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.setResizable(false);
	this.setVisible(true);
	this.addKeyListener(this);

}
@Override
public void keyPressed(KeyEvent arg) {
	if (arg.getKeyCode() == arg.VK_RIGHT) {
		System.out.println("Trykket hoyre");
		hode.x += 30;
		opp = false;
		ned = false;
		hoyre = true;
		venstre = false;

	} else if (arg.getKeyCode() == arg.VK_LEFT) {
		System.out.println("Trykket venstre");
		hode.x -= 30;
		opp = false;
		ned = false;
		hoyre = false;
		venstre = true;
	} else if (arg.getKeyCode() == arg.VK_UP) {
		System.out.println("Trykket opp");
		opp = true;
		ned = false;
		hoyre = false;
		venstre = false;
	} else if (arg.getKeyCode() == arg.VK_DOWN) {
		hode.y += 30;
		System.out.println("Trykket ned");
		opp = false;
		ned = true;
		hoyre = false;
		venstre = false;
	}
	  while (opp) {
		try {
			Thread.sleep(250);
		} catch (InterruptedException ex) {
			Logger.getLogger(Snake2.class.getName()).log(Level.SEVERE, null, ex);
		}
		hode.y -= 30;
		drawStuff();
	}
	repaint();
}

public void drawStuff() {
	System.out.println("paint");
	Graphics g = this.getGraphics();
	g.clearRect(0, 0, this.getWidth(), this.getHeight());
	g.setColor(Color.BLACK);
	g.fillRect(0, 0, this.getWidth(), this.getHeight());
	hode.drawMe(g);
}
public void paint(Graphics g) {
	drawStuff();
}
@Override
public void keyTyped(KeyEvent sadf) {
}
@Override
public void keyReleased(KeyEvent asdf) {
}
public static void main(String[] argklpks) {
	Snake2 sol = new Snake2();
}
}

 

import java.awt.Color;
import java.awt.Graphics;
public class Grafikkelement3 {
int bredde = 30;
int hoyde = 30;
int x,y;
Color farge;

  public void drawMe(Graphics g) {
   g.setColor(farge);
   g.fillRect(x,y,bredde,hoyde);
  }

}

 

import java.awt.Color;
public class Snakeelement2 extends Grafikkelement3 {
public Snakeelement2(){
	super();
	x = 300;
	y = 300;
	farge=Color.green;
}
  }

Endret av Irrelevant
Lenke til kommentar
Videoannonse
Annonse

Jeg fant ut av det, tror jeg. Sleep-funksjonen stopper opp hele prosessen, så jeg måtte hatt flere tråder om løkka skulle lyttet til tastaturet. Vet ikke hvordan jeg bruker tråder ennå, og gidder ikke finne ut av det, så jeg løste det ved å bruke ActionListenerens timer-funksjon. Uansett litt rart med buggen i det ferdige spillet (se under) som gjør at slangen begynner å bevege seg umiddelbart når en gang ny omgang startes om man klikker en piltast mens slangen driver og blinker etter at den døde. :hmm:

 

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.Timer;
public class Snake extends JFrame implements KeyListener, ActionListener {
boolean opp, ned, venstre, hoyre, veggkollisjon, selvkollisjon;
Snakeelement hode = new Snakeelement(280, 280);
Eple eple = new Eple();
ArrayList<Snakeelement> kropp = new ArrayList<>();
Timer tidtaker;
int forflytning = 20;
int ge = 20;
int counter, gammelHodeX, gammelHodeY, sisteX, sisteY, score, highscore0, highscore1, highscore2, highscore3, forrigescore, vanskelighetsgrad, hastighet;
double gjvpoengsum = 100;
Color darkgreen = new Color(50, 200, 50);
Random rg = new Random();
String[] dialogboksvalg = {"Sandkasse", "Lett", "Middels", "Vanskelig"};
public Snake() {
	hente();
	plasserEple();
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.setBounds(0, 0, ge * 32, ge * 31);
	this.getContentPane().setBackground(Color.black);
	this.setResizable(true);
	this.setVisible(true);
	this.addKeyListener(this);
	hode.farge = Color.green;
	velgVanskelighet();

	repaint();
}
public void velgVanskelighet() {
	vanskelighetsgrad = (int) JOptionPane.showOptionDialog(null, "Velg vanskelighetsgrad.", "", 0, 3, null, dialogboksvalg, null);
	if (vanskelighetsgrad == 0) {
		hastighet = 75;
		veggkollisjon = false;
		selvkollisjon = false;
	} else if (vanskelighetsgrad == 1) {
		hastighet = 100;
		veggkollisjon = false;
		selvkollisjon = true;
	} else if (vanskelighetsgrad == 2) {
		hastighet = 75;
		veggkollisjon = true;
		selvkollisjon = true;
	} else {
		hastighet = 50;
		veggkollisjon = true;
		selvkollisjon = true;
	}
	tidtaker = new Timer(hastighet, this);
	drawStuff();
}
public void keyPressed(KeyEvent arg) {
	if (arg.getKeyCode() == arg.VK_SPACE && (opp || ned || hoyre || venstre)) {
		if (tidtaker.isRunning()) {
			tidtaker.stop();
		} else {
			tidtaker.start();
		}
	}
	if (arg.getKeyCode() == arg.VK_ESCAPE) {
		restart();
		drawStuff();
		velgVanskelighet();
	}
	if (arg.getKeyCode() == arg.VK_RIGHT && !venstre) {
		opp = false;
		ned = false;
		hoyre = true;
		venstre = false;
		tidtaker.start();
	} else if (arg.getKeyCode() == arg.VK_LEFT && !hoyre) {
		opp = false;
		ned = false;
		hoyre = false;
		venstre = true;
		tidtaker.start();
	} else if (arg.getKeyCode() == arg.VK_UP && !ned) {
		opp = true;
		ned = false;
		hoyre = false;
		venstre = false;
		tidtaker.start();
	} else if (arg.getKeyCode() == arg.VK_DOWN && !opp) {
		opp = false;
		ned = true;
		hoyre = false;
		venstre = false;
		tidtaker.start();
	} else {
	}
}
@Override
public void actionPerformed(ActionEvent e) {
	counter++;
	double counter2 = (double) counter / 80;
	if (eple.farge == Color.blue) {
		gjvpoengsum = 400 - counter * 5;
		if (gjvpoengsum < 100) {
			gjvpoengsum = 100;
		}
	} else {
		gjvpoengsum = 100 - counter * 1.5;
		if (gjvpoengsum < 20) {
			gjvpoengsum = 20;
		}
	}
	gammelHodeX = hode.x;
	gammelHodeY = hode.y;
	if (!kropp.isEmpty()) {
		sisteX = kropp.get(kropp.size() - 1).x;
		sisteY = kropp.get(kropp.size() - 1).y;
	}
	if (opp) {
		hode.y -= forflytning;
	} else if (ned) {
		hode.y += forflytning;
	} else if (hoyre) {
		hode.x += forflytning;
	} else {
		hode.x -= forflytning;
	}
	if (veggkollisjon) {
		if (hode.x >= ge * 29 || hode.x < ge * 2 || hode.y >= ge * 28 || hode.y < ge * 3) {
			blink();
			restart();
		}
	} else {
		if (hode.x >= ge * 29) {
			hode.x = ge * 2;
		} else if (hode.x < ge * 2) {
			hode.x = ge * 28;
		} else if (hode.y >= ge * 28) {
			hode.y = ge * 3;
		} else if (hode.y < ge * 3) {
			hode.y = ge * 27;
		} else {
		}
	}
	for (int i = kropp.size() - 1; i > 0; i--) {
		kropp.get(i).x = kropp.get(i - 1).x;
		kropp.get(i).y = kropp.get(i - 1).y;
	}
	if (!kropp.isEmpty()) {
		kropp.get(0).x = gammelHodeX;
		kropp.get(0).y = gammelHodeY;
	}
	if (counter2 == counter / 80) {
		plasserEple();
	}
	sjekkKollisjonEple();
	if (selvkollisjon) {
		sjekkKollisjonSlange();
	}
	if (vanskelighetsgrad == 0) {
		if (score > highscore0) {
			highscore0 = score;
			lagre();
		}
	}
	drawStuff();
}
public void sjekkKollisjonEple() {
	Rectangle r1 = new Rectangle(hode.x, hode.y, hode.bredde, hode.hoyde);
	Rectangle r2 = new Rectangle(eple.x, eple.y, eple.bredde, eple.hoyde);
	if (r1.intersects(r2)) {
		counter = 0;
		score += (int) gjvpoengsum;

		int tilfeldigtall = rg.nextInt(100);
		if (tilfeldigtall > 89) {
			eple.farge = Color.blue;
			eple.bredde = 25;
			eple.hoyde = 25;
		} else {
			eple.farge = Color.red;
			eple.bredde = 20;
			eple.hoyde = 20;
		}
		plasserEple();
		if (kropp.isEmpty()) {
			kropp.add(new Snakeelement(gammelHodeX, gammelHodeY));
		} else {
			kropp.add(new Snakeelement(sisteX, sisteY));
		}
	}
}
public void sjekkKollisjonSlange() {
	for (int i = 0; i < kropp.size(); i++) {
		Rectangle r3 = new Rectangle(hode.x, hode.y, hode.bredde, hode.hoyde);
		Rectangle r4 = new Rectangle(kropp.get(i).x, kropp.get(i).y, kropp.get(i).bredde, kropp.get(i).hoyde);
		if (r3.intersects(r4)) {
			blink();
			restart();
		}
	}
}
public void restart() {
	kropp.clear();
	hode.x = 280;
	hode.y = 280;
	if (vanskelighetsgrad == 0) {
		if (score > highscore0) {
			tidtaker.stop();
			highscore0 = score;
		}
	} else if (vanskelighetsgrad == 1) {
		if (score > highscore1) {
			tidtaker.stop();
			highscore1 = score;
			JOptionPane.showMessageDialog(null, "Ny highscore: " + highscore1 + "!");
		}
	} else if (vanskelighetsgrad == 2) {
		if (score > highscore2) {
			tidtaker.stop();
			highscore2 = score;
			JOptionPane.showMessageDialog(null, "Ny highscore: " + highscore2 + "!");
		}
	} else if (score > highscore3) {
		tidtaker.stop();
		highscore3 = score;
		JOptionPane.showMessageDialog(null, "Ny highscore: " + highscore3 + "!");
	} else {
	}
	forrigescore = score;
	lagre();
	score = 0;
	opp = false;
	ned = false;
	hoyre = false;
	venstre = false;
	counter = 0;
	tidtaker.stop();
	gjvpoengsum = 100;
}
public void blink() {
	for (int i = kropp.size() - 1; i > 0; i--) {
		kropp.get(i).x = kropp.get(i - 1).x;
		kropp.get(i).y = kropp.get(i - 1).y;
	}
	if (!kropp.isEmpty()) {
		kropp.get(0).x = gammelHodeX;
		kropp.get(0).y = gammelHodeY;
	}
	for (int i = 0; i < 8; i++) {
		hode.farge = Color.black;
		for (int j = 0; j < kropp.size(); j++) {
			kropp.get(j).farge = Color.black;
		}
		drawStuff();
		try {
			Thread.sleep(100);
		} catch (InterruptedException ex) {
			Logger.getLogger(Snake.class.getName()).log(Level.SEVERE, null, ex);
		}
		hode.farge = Color.green;
		for (int j = 0; j < kropp.size(); j++) {
			kropp.get(j).farge = darkgreen;
		}
		drawStuff();
		try {
			Thread.sleep(100);
		} catch (InterruptedException ex) {
			Logger.getLogger(Snake.class.getName()).log(Level.SEVERE, null, ex);
		}
	}
}
public void plasserEple() {
	if (eple.farge == Color.blue) {
		eple.x = ge * 2 + forflytning * rg.nextInt(26);
		eple.y = ge * 3 + forflytning * rg.nextInt(24);
	} else {
		eple.x = ge * 2 + forflytning * rg.nextInt(27);
		eple.y = ge * 3 + forflytning * rg.nextInt(25);
	}
	for (int i = kropp.size() - 1; i > 0; i--) {
		if ((eple.x == kropp.get(i).x && eple.y == kropp.get(i).y) || (hode.x == kropp.get(i).x && hode.y == kropp.get(i).y)) {
			plasserEple();
			System.out.println("eple slange");
		}
	}
}
public void drawStuff() {
	Graphics g = this.getGraphics();
	g.clearRect(0, 0, this.getWidth(), this.getHeight());
	g.setColor(Color.BLACK);
	g.fillRect(0, 0, this.getWidth(), this.getHeight());
	g.setColor(Color.white);
	g.drawRect(ge * 2 - 1, ge * 3 - 1, ge * 27 + 1, ge * 25 + 1);
	eple.drawMe(g);
	for (int i = 0; i < kropp.size(); i++) {
		kropp.get(i).drawMe(g);
	}
	hode.drawMe(g);
	g.setFont(new Font("sansserif", Font.BOLD, 15));
	g.setColor(Color.white);
	g.drawString("Score: " + score, 470, 50);
	g.drawString("" + (int) gjvpoengsum, 50, 50);
	if (vanskelighetsgrad == 0) {
		g.drawString("Highscore: " + highscore0, 130, 50);
	} else if (vanskelighetsgrad == 1) {
		g.drawString("Highscore: " + highscore1, 130, 50);
	} else if (vanskelighetsgrad == 2) {
		g.drawString("Highscore: " + highscore2, 130, 50);
	} else {
		g.drawString("Highscore: " + highscore3, 130, 50);
	}
	g.drawString("Forrige score: " + forrigescore, 280, 50);
}
public void paint(Graphics g) {
	drawStuff();
}
public static void main(String[] as) {
	Snake s = new Snake();
}
private void lagre() {
	// Write to disk with FileOutputStream
	try (FileOutputStream f_out = new FileOutputStream("snakedata.txt");
			ObjectOutputStream obj_out = new ObjectOutputStream(f_out) {
		obj_out.writeObject(highscore0);
		obj_out.writeObject(highscore1);
		obj_out.writeObject(highscore2);
		obj_out.writeObject(highscore3);
		obj_out.writeObject(forrigescore);
	} catch (FileNotFoundException ex) {
		Logger.getLogger(Snake.class.getName()).log(Level.SEVERE, null, ex);
	} catch (IOException ex) {
		Logger.getLogger(Snake.class.getName()).log(Level.SEVERE, null, ex);
	}
}
private void hente() {
	try (FileInputStream f_in = new FileInputStream("snakedata.txt");
			ObjectInputStream obj_in = new ObjectInputStream(f_in) {
		highscore0 = (int) obj_in.readObject();
		highscore1 = (int) obj_in.readObject();
		highscore2 = (int) obj_in.readObject();
		highscore3 = (int) obj_in.readObject();
		forrigescore = (int) obj_in.readObject();
	} catch (Exception e) {
		System.out.println(e.getMessage());
	}
}
@Override
public void keyTyped(KeyEvent sadf) {
}
@Override
public void keyReleased(KeyEvent asdf) {
}
}

 

 

import java.awt.Color;
public class Snakeelement extends Grafikkelement {
Color darkgreen = new Color(50,200,50);
public Snakeelement(int x, int y){
	super();
	this.x = x;
	this.y = y;
	farge=darkgreen;
}


}

 

import java.awt.Color;
import java.awt.Graphics;
public class Grafikkelement {
int bredde = 20;
int hoyde = 20;
int x,y;
Color farge;

  public void drawMe(Graphics g) {
   g.setColor(farge);
   g.fillRect(x,y,bredde,hoyde);

  }

}

 

import java.awt.Color;
public class Eple extends Grafikkelement {

public Eple() {
	super();
	farge = Color.red;

}

}

Endret av Irrelevant
Lenke til kommentar
  • 2 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...