微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

坦克游戏JavaFX中的运动

如何解决坦克游戏JavaFX中的运动

我正在创建大学项目,这是一个坦克游戏,在这个游戏中,我们使用二维数组作为地图(我们可以通过更改数组的值来更改地图)并通过 KeyEvent 进行坦克遍历,我需要做一个逐块障碍(这是阵列的单元格之一),如果坦克与块相交,则无法移动。有没有办法在我的代码中做到这一点?

public class Tank extends JPanel implements ActionListener,KeyListener {
Timer tm = new Timer(1,this);
int tankX = 270,tankY = 270,velX = 0,velY = 0,direction = 1;
int bulletX = 330;
int bulletY = 330;


String[][] map = {
        {"B","S","B","B"},{"B","0","W","T","G",};
public Tank() {
    tm.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
}


public void paintComponent(Graphics g) {
    super.paintComponent(g);
    for (int i = 0; i < map.length; i++){
        for (int j = 0; j < map.length; j++){
            switch (map[i][j]){
                case "B":
                    g.setColor(Color.RED);
                    break;
                case "S":
                    g.setColor(Color.LIGHT_GRAY);
                    break;
                case "W":
                    g.setColor(Color.CYAN);
                    break;
                case "T":
                    g.setColor(Color.GREEN);
                    break;
                case "0":
                    g.setColor(Color.WHITE);
                    break;
            }
            g.fillRect(i*64,j*64,64,64);
        }
    }
    g.setColor(Color.BLUE);
    g.fillRect(tankX,tankY,64);
    g.setColor(Color.LIGHT_GRAY);
    if (direction == 1) {
        g.fillRect(tankX + 20,24,24); //UP
    }
    if (direction == 2) {
        g.fillRect(tankX + 20,tankY + 40,24); //DOWN
    }
    if (direction == 3) {
        g.fillRect(tankX + 40,tankY + 20,24); //RIGHT
    }
    if (direction == 4) {
        g.fillRect(tankX,24); //LEFT
    }
    g.setColor(Color.GRAY);
    g.filloval(bulletX,bulletY,14,14);

}

@Override
public void actionPerformed(ActionEvent e) {

    if (tankX < 0){
        velX = 0;
        tankX = 0;
    }

    if (tankX > 530){
        velX = 0;
        tankX = 530;
    }

    if (tankY > 445){
        velY = 0;
        tankY = 445;
    }

    if (tankY < 0){
        velY = 0;
        tankY = 0;
    }


    bulletX = tankX + 24;
    bulletY = tankY + 27;
    tankX = tankX + velX;
    tankY = tankY + velY;
    repaint();
}



boolean Interception(){
    int y = bulletY/64;
    int x = bulletX/64;

    if (map[x][y] == "B"){
        map[x][y] = "0";
        return true;
    }
    return false;
}

public void fire(){
    while (bulletX > 0 && bulletX < 530 && bulletY > 0 && bulletY < 530) {
        if (direction == 1) {
            bulletY--;
        }
        if (direction == 2) {
            bulletY++;
        }
        if (direction == 3) {
            bulletX++;
        }
        if (direction == 4) {
            bulletX--;
        }
        if (Interception()){
        }
        repaint();
    }
        destroyBlock();
}

void destroyBlock(){
    repaint();
}

@Override
public void keypressed(KeyEvent e) {
    int c = e.getKeyCode();
    if (c == KeyEvent.VK_SPACE){
            fire();
    }
    if (c == KeyEvent.VK_LEFT){
        velX = -1;
        velY = 0;
        direction = 4;
    }
    if (c == KeyEvent.VK_RIGHT){
        velX = 1;
        velY = 0;
        direction = 3;
    }
    if (c == KeyEvent.VK_UP){
        velX = 0;
        velY = -1;
        direction = 1;
    }
    if (c == KeyEvent.VK_DOWN){
        velX = 0;
        velY = 1;
        direction = 2;
    }
}
@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyreleased(KeyEvent e) {
    velY = 0;
    velX = 0;
}

public static void main(String[] args) {
    Tank t = new Tank();
    JFrame jf = new JFrame();
    jf.setTitle("Tutorial");
    jf.setSize(576,576);
    jf.setVisible(true);
    jf.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
    jf.add(t);
}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。