ich bin ziemlich neu in Java und bin verwirrt, wie dies zu tun ist. Ich habe einen Key-Listener, der auf WASD hört, was auf die Bewegung meiner Snake hinweist. Der Key-Listener ändert die X- und Y-Positionen meiner Snakes-Segmente. Ich habe einen Timer, der mit einem Listener namens "Listener" verbunden ist, der die Bewegungen in einen Puffer und auf den Bildschirm überspielt. Meine Frage ist, warum die Bewegung, die von meinem Schlüsselhörer angezeigt wird, es nicht in den Puffer schafft? Außerdem weiß ich, dass meine Bewegungsfunktion becuase snek.move (4) ist; arbeitet im Timer. Schlussbemerkung, dies ist ein Snake-Spiel, das ich gerade erst begonnen habe.Kommunikation zwischen einem Hörer und einem Timer
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
public class SnekePanel extends JPanel
{
private static final int FRAME1 = 1000;
private static final int FRAME2 = 1000;
private static final Color BACKGROUND = new Color(0, 0, 0);
private BufferedImage myImage;
private Graphics myBuffer;
private Sneke snek;
private Food food;
private Timer t;
private int points = 0;
public SnekePanel()
{
myImage = new BufferedImage(FRAME1, FRAME2, BufferedImage.TYPE_INT_RGB);
myBuffer = myImage.getGraphics();
myBuffer.setColor(BACKGROUND);
myBuffer.fillRect(0, 0, FRAME1,FRAME2);
int xPos = (int)(Math.random()*(FRAME1-100) + 50);
int yPos = (int)(Math.random()*(FRAME2-100)+ 50);
food = new Food(xPos, yPos, 10, Color.RED);
snek = new Sneke(200,200,1,Color.WHITE);
t = new Timer(5, new Listener());
t.start();
addKeyListener(new Key());
setFocusable(true);
}
public void paintComponent(Graphics g)
{
g.drawImage(myImage, 0, 0, getWidth(), getHeight(), null);
}
private class Key extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_W)
{
snek.move(1);
}
if(e.getKeyCode() == KeyEvent.VK_A)
{
snek.move(2);
}
if(e.getKeyCode() == KeyEvent.VK_S)
{
snek.move(3);
}
if(e.getKeyCode() == KeyEvent.VK_D)
{
snek.move(4);
}
}
}
private class Listener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if(snek.checkBlock() != 0)
{
myBuffer.setColor(BACKGROUND);
myBuffer.fillRect(0,0,FRAME1,FRAME2);
snek.move(4);
collide(snek, food);
food.draw(myBuffer);
snek.draw(myBuffer);
myBuffer.setColor(Color.BLACK);
repaint();
}
}
}
private void collide(Sneke b, Food pd)
{
int sx = b.getX(snek.getLength()-1);
int sy = b.getY(snek.getLength()-1);
int fx = pd.getX();
int fy = pd.getY();
if(sx == sy && fx == fy)
{
snek.setLength(snek.getLength()+1);
}
}
}
gut, da der Schlüssel Zuhörer das ändern Schlangenfelder, dann wird die Schlange im Timer neu gezeichnet, ich erwarte, dass der Timer die E/A des Haupthörers widerspiegelt. –
@SompTingWong: Nun, da Ihr Timer das Feld zurück ändert, müssen Sie Ihre Erwartungen anpassen. Vielleicht solltest du den Status der Schlange nicht im Timer einstellen. –
@SompTingWong: siehe Beispiel mit Tastenbelegung bitte –