Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 蛇游戏。手柄按键法_Java - Fatal编程技术网

Java 蛇游戏。手柄按键法

Java 蛇游戏。手柄按键法,java,Java,我让蛇跑了下来,现在我试着让keypressed()方法工作。我不认为这是从键盘上听到的。我的想法是,例如,如果按下向下键,变量方向设置为1,switch case语句将处理该问题。我怀疑开关盒没有读取方向变量 我的主要班级: package com.bin.snake; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.KeyE

我让蛇跑了下来,现在我试着让keypressed()方法工作。我不认为这是从键盘上听到的。我的想法是,例如,如果按下向下键,变量方向设置为1,switch case语句将处理该问题。我怀疑开关盒没有读取方向变量

我的主要班级:

package com.bin.snake;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Game extends JPanel{

boolean playingSnake = true;
Snake snake = new Snake();

public Game() {
    addKeyListener(new KeyListener() {

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

        }

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

        }

        @Override
        public void keyPressed(KeyEvent e) {

            snake.keyPressed(e);
        }
    });
    setFocusable(true);
}

public void paint(Graphics g) {// inherit paint method of JPanel class with
    // parameter g type Graphics
    // parameter g is the object to paint things
    super.paint(g); // erase latest image
    Graphics2D g2d = (Graphics2D) g; // casting g to Graphics2D type
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,      RenderingHints.VALUE_ANTIALIAS_ON);// rendering
                                                                                                // image
    snake.paint(g2d);

}

public static void main(String[] args) {
    JFrame frame = new JFrame("Snake!");
    frame.setVisible(true);
    frame.setSize(800, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Game game = new Game();
    frame.add(game);
    while (true) {
        game.updateGame();
        game.repaint();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public void updateGame() {
    snake.moveSnake();
}
}

我的蛇课:

package com.bin.snake;

import java.awt.Graphics2D;
import java.awt.event.KeyEvent;

public class Snake {

private Game game;
int iSnakeLength = 10;
int direction = 1;
final int SIDE = 13;

int[] snakeY = new int[2000];
int[] snakeX = new int[2000];
int xs = 0;
int ys = 0;

public void moveSnake() {

    switch (direction) {
    case 0:// up
        snakeY[0] -=1.5;
        break;
    case 1:// down
        snakeY[0] += 1.5;
        break;
    case 2:// right
        snakeX[0] += 1.5;
        break;
    case 3:// left
        snakeX[0] -=1.5;
        break;
    }

    for (int i = iSnakeLength; i > 0; i--) {
        snakeX[i] = snakeX[i - 1];
        snakeY[i] = snakeY[i - 1];

    }
}

public void paint(Graphics2D g) {
    g.fillRect(snakeX[0], snakeY[0], SIDE, SIDE);
    for (int i = 0; i < iSnakeLength; i++) {
        g.fillRect(snakeX[i + 1], snakeY[i + 1], SIDE, SIDE);
    }

}

public void keyPressed(KeyEvent e){
    if(e.getKeyCode() == KeyEvent.VK_DOWN){
        direction = 1;
    }
    if(e.getKeyCode() == KeyEvent.VK_UP){
        direction = 0;
    }
    if(e.getKeyCode() == KeyEvent.VK_LEFT){
        direction = 3;
    }
    if(e.getKeyCode() == KeyEvent.VK_RIGHT){
        direction = 2;
    }
}
package com.bin.snake;
导入java.awt.Graphics2D;
导入java.awt.event.KeyEvent;
公营蛇{
私人游戏;
int iSnakeLength=10;
int方向=1;
最终内端=13;
int[]snakeY=新int[2000];
int[]snakeX=新int[2000];
int-xs=0;
int ys=0;
公众假期{
开关(方向){
案例0://向上
snakeY[0]-=1.5;
打破
案例1://向下
snakeY[0]+=1.5;
打破
案例2://对
蛇[0]+=1.5;
打破
案例3://左
蛇[0]-=1.5;
打破
}
对于(int i=iSnakeLength;i>0;i--){
蛇[i]=蛇[i-1];
snakeY[i]=snakeY[i-1];
}
}
公共空隙涂料(图2D g){
g、 fillRect(蛇[0],蛇[0],边,边);
for(int i=0;i
}

我不认为这是从键盘上听到的。我的想法

KeyEvents仅调度到具有焦点的组件。默认情况下,JPanel不可聚焦

要使面板可聚焦,请使用:

panel.setFocusable( true );
其他意见:

  • 自定义绘制是通过覆盖
    paintComponent(…)
    方法而不是paint()方法来完成的。有关更多信息和示例,请阅读上的Swing教程

  • 您不应该使用KeyListener。Swing设计用于
    键绑定
    。阅读上的Swing教程。您还可以查看其中包含使用键绑定移动组件的工作示例

  • 对于动画,应该使用摆动计时器来安排动画。检查我已经提供的教程链接的目录。有一节介绍如何使用摆动计时器


  • 使用键绑定,任何其他答案都是错误的