Java 2d 游戏-游戏中非常奇怪的 "bug"

标签 java user-interface jframe jpanel 2d

我使用 Java 制作的 2d 游戏中有一个非常奇怪的错误。 游戏说明:玩家可以用鼠标移动火箭 Sprite ,必须躲避一个跟随玩家的矩形并杀死玩家(通过碰撞)。它不会跟随玩家,而是仅移动到玩家的起始坐标,即 400,400。它应该向玩家移动的方向移动。如果您知道出了什么问题,请帮助我。

主类:

import javax.swing.*;

public class Main extends JFrame{
    private static final long serialVersionUID = 1L;
    final static int WW = 800;
    final static int WH = 600;
    public Main(){
        setSize(WW,WH);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setTitle("Space Game");
        add(new GameClass());
        setVisible(true);
    }
    public static void main(String[] args) {
        new Main();
    }
}

GameClass 类:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GameClass extends JPanel implements ActionListener, KeyListener{
    private static final long serialVersionUID = 1L;
    Enemy enemy = new Enemy();
    Player player = new Player();

    public GameClass(){
        Timer time = new Timer(15, this);
        time.start();
        this.addKeyListener(this);
        this.setFocusable(true);
        player.openImage();
    }

    public void update(){
        player.update();
        enemy.update();
    }

    public void paintComponent(Graphics g){
        g.setColor(Color.BLACK);
        g.fillRect(0,0,Main.WW,Main.WH);
        player.paint(g);
        enemy.paint(g);
        g.dispose();
    }

    public void actionPerformed(ActionEvent e){
        update();
        repaint();
    }

    public void keyPressed(KeyEvent e){
        if(e.getKeyCode() == KeyEvent.VK_LEFT){
            player.setSpeed(-5);
        }
        else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
            player.setSpeed(5);
        }
        else if(e.getKeyCode() == KeyEvent.VK_UP){
            player.setFly(-5);
        }
        else if(e.getKeyCode() == KeyEvent.VK_DOWN){
            player.setFly(5);
            Player.goDown = true;
        }
    }

    public void keyReleased(KeyEvent e){
        if(e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_RIGHT){
            player.setSpeed(0);
        }
        if(e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN){
            player.setFly(0);
            Player.goDown = false;
        }
    }

    public void keyTyped(KeyEvent e){

    }
}

敌人类别:

import java.awt.*;

public class Enemy {
    private int x = -100;
    private int y = -100;
    Player player = new Player();

    public void update(){
        System.out.println(player.getX());
        if(player.getX() < this.x){
            this.x -= 5;
        }
        if(player.getX() > this.x){
            this.x += 5;
        }
        if(player.getY() > this.y){
            this.y += 5;
        }
        if(player.getY() < this.y){
            this.y -= 5;
        }

    }

    public void paint(Graphics g){
        g.setColor(Color.ORANGE);
        g.fillRect(x, y, 50, 50);
    }
}

玩家等级:

import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.*;

public class Player {
    private Image image;
    private int player_x = Main.WW/2;
    private int player_xspeed = 0;
    private int player_y = Main.WH/2;
    private int player_yspeed = 0;
    private int flamey = player_y + 100;
    private int flamex;
    private int newx;
    private int newy;
    static boolean goDown = false;

    public Player(){
        newx = player_x;
        newy = player_x;
    }

    public void openImage(){
        try {
            image = ImageIO.read(new File("spaceship.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void paint(Graphics g){
        flamex = player_x + 20;
        g.drawImage(image,player_x,player_y,null);
        g.setColor(Color.YELLOW);
        g.fillRect(flamex, flamey+5, 6, 6);
        g.fillRect(flamex+10, flamey, 6, 6);
        g.fillRect(flamex+10, flamey+15, 6, 6);
        g.fillRect(flamex+20, flamey+5, 6, 6);
    }

    public void update(){
        player_x += player_xspeed;
        player_y += player_yspeed;
        if(flamey < (player_y + 125)){
            if(goDown == false)
                flamey += 5;
            else
                flamey += 10;
        }else
            flamey = player_y + 100;
        newx = player_x;
        newy = player_y;
    }

    public void setSpeed(int speed){
        player_xspeed = speed;
    }

    public void setFly(int speed){
        player_yspeed = speed;
    }

    public int getX(){
        return newx;
    }

    public int getY(){
        return newy;
    }
}

对不起,我的英语不好,请帮助我。 任何帮助表示赞赏:)

最佳答案

这是因为它跟随的Player是通过以下行在Enemy内部创建的:

public class Enemy {
  //...
  Player player = new Player();
  //...
}

因此,它是与您正在控制的玩家实例不同的玩家实例,它是通过以下方式在 GameClass 中创建的:

public class GameClass extends JPanel implements ActionListener, KeyListener{
    Enemy enemy = new Enemy();
    Player player = new Player();
    //...
}

您需要将受控玩家实例作为 Enemy 的构造函数参数注入(inject),例如

public class GameClass extends JPanel implements ActionListener, KeyListener{
    Player player = new Player();
    Enemy enemy = new Enemy(player);
    //...
}

public class Enemy {
  //...
  Player player;

  public Enemy(Player player) { this.player = player; }
  //...
}

或通过 setter 。

关于Java 2d 游戏-游戏中非常奇怪的 "bug",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32254560/

相关文章:

java - Eclipse m2eclipse clean、构建项目、自动构建命令,它们是什么?

运行 .sh 文件的 Java 方法

java - bluej 中的纸牌游戏

java - 可以在 JTree 中设置颜色吗?

java - JProgressbar 未出现在框架中

java - 制作一个 JFrame 按钮创建一个警告对话框。 Java-Netbeans

java - 分离的条件抛出 ClassCastException 异常

user-interface - PyPy 的 GUI 库

javascript - 当我们尝试关闭窗口时鼠标悬停并弹出的弹跳

swing - 如何在 swing 中运行 javaFX MediaPlayer?