2017-03-08 6 views
-1

私はリンゴを食べる古典的なヘビゲームを作ろうとしていますが、私は動きに問題があります。ヘビは斜めに動くことができます。たとえば、スネークが右に移動しているときに矢印キーをクリックすると、斜め上に移動します。この問題を解決するにはどうすればよいですか?ありがとうございました。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

一方向の移動のみを許可する「排他性」ロジックを実装する必要があります – UnholySheep

答えて

1

あなたは他の軸上での移動から蛇を停止する必要があります。これはトリックを行う必要があります。

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

あなたは1と-1に座標を設定していますが、一度1にY設定した場合、あなたは、あなたが1にXを設定するので、0に設定したことがない、それは斜めの動き(1、になります1)。対角線を移動したくない場合は、xを1または-1に設定すると、yをゼロに設定する必要があります。この後

ので

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

あなただけまっすぐに移動することができます。 (最も美しい解決策ではないかもしれませんが、これがあなたの質問です)

関連する問題