2017-03-08 17 views
-1

Ich versuche, das klassische Schlangenspiel zu machen, das den Apfel isst, aber ich habe Probleme mit den Bewegungen. Die Schlange kann sich diagonal bewegen. Zum Beispiel, wenn die Schlange sich nach rechts bewegt und ich die Pfeiltaste nach oben klicke, wird sie diagonal verlaufen, nicht gerade nach oben y-Koordinate. Wie kann ich dieses Problem beheben? Vielen Dank.Wie erstellt man die Bewegung in Snake Game?

Game.java

public class Game extends Canvas implements Runnable, KeyListener { 

public static int width = 300; 
public static int height = width/16 * 9; 
public static int scale = 3; 

private Thread thread; 
private JFrame frame; 
private Snake snake; 
private boolean running = false; 


public Game(){ 
    Dimension size = new Dimension(width * scale, height * scale); 
    setPreferredSize(size); 
    setFocusable(true); 
    setFocusTraversalKeysEnabled(false); 
    addKeyListener(this); 

    frame = new JFrame(); 
    snake = new Snake(200, 200); 
} 

public synchronized void start(){ 
    running = true; 
    thread = new Thread(this, "Display"); 
    thread.start(); 
} 

public synchronized void stop(){ 
    running = false; 
    try{ 
     thread.join(); 
    }catch (InterruptedException e){ 
     e.printStackTrace(); 
    } 
} 

@Override 
public void run(){ 
    while (running){ 
     update(); 
     render(); 
    } 
} 

public void update(){ 

} 

public void render(){ 
    BufferStrategy bs = getBufferStrategy(); 
     if(bs == null){ 
      createBufferStrategy(3); 
      return; 
     } 

     Graphics g = bs.getDrawGraphics(); 
     g.setColor(Color.black); 
     g.fillRect(0, 0, getWidth(), getHeight()); 

     snake.draw(g); 

     g.dispose(); 
     bs.show(); 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_W) { 
     snake.setYD(-1); 
    } 

    if(key == KeyEvent.VK_S){ 
     snake.setYD(1); 
    } 


    if(key == KeyEvent.VK_A){ 
     snake.setXD(-1); 
    } 

    if(key == KeyEvent.VK_D){ 
     snake.setXD(1); 
    } 

} 

@Override 
public void keyReleased(KeyEvent e) { 

} 

@Override 
public void keyTyped(KeyEvent e) { 
    // TODO Auto-generated method stub 

} 

public static void main (String[] args){ 
    Game game = new Game(); 

    game.frame.setResizable(false); 
    game.frame.setTitle("Snake"); 
    game.frame.add(game); 
    game.frame.pack(); 
    game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    game.frame.setLocationRelativeTo(null); 
    game.frame.setVisible(true); 

    game.start(); 
} 
} 

Entity.java

public abstract class Entity { 

protected int x, y; 

public Entity(int x, int y){ 
    this.x = x; 
    this.y = y; 
} 

public void draw(Graphics g){ 
} 

public int getX() {return x;} 
public int getY() {return y;} 

} 

Snake.java

public class Snake extends Entity { 

private int xDirection, yDirection; 

public Snake(int x, int y) { 
    super(x, y); 
} 

public void draw(Graphics g){ 
    move(); 

    g.setColor(Color.blue); 
    g.fillRect(x, y, 15, 15); 
} 

public void move(){ 
    x += xDirection; 
    y += yDirection; 
} 



public void setXD(int value){ 
    xDirection = value; 
} 

public void setYD(int value){ 
    yDirection = value; 
} 
+1

Sie müssen einige "Exklusivität" Logik implementieren, die nur eine Richtung einziehen erlaubt – UnholySheep

Antwort

1

Sie müssen eine Bewegung auf der anderen Achse, die Schlange zu stoppen. Dies sollte den Trick machen.

if (key == KeyEvent.VK_W) { 
    snake.setYD(-1); 
    snake.setXD(0); 
} 

if(key == KeyEvent.VK_S){ 
    snake.setYD(1); 
    snake.setXD(0); 
} 


if(key == KeyEvent.VK_A){ 
    snake.setXD(-1); 
    snake.setYD(0); 
} 

if(key == KeyEvent.VK_D){ 
    snake.setXD(1); 
    snake.setYD(0); 
} 
1

Sie legen die Koordinaten 1 und -1, aber man es nie so auf 0 gesetzt, wenn Sie einmal y auf 1 gesetzt, dann setzen Sie x 1 ist, dann wird es eine diagonale Bewegung (1, 1). Sie sollten y auf Null setzen, wenn Sie x auf 1 oder -1 setzen, wenn Sie nicht diagonal verschieben möchten.

So

if (key == KeyEvent.VK_W) { 
    snake.setYD(-1); 
    snake.setXD(0); 
} 

Danach können Sie nur gerade bewegen. (Vielleicht ist es nicht die schönste Lösung, aber das ist die Antwort Ihre Frage)

Verwandte Themen