Cần giúp đỡ về hàm getWidth() trong java

Chào mọi người, em mới học làm game được tầm 2 tuần. Trong quá trình làm em gặp lỗi với cách sửu dụng hàm getWidth() trong Player mặc dù em đã set size cho Panel nhưng mà vẫn bị báo lỗi. Mong mọi người giải đáp giúp ạ. Em cảm ơn.

Lỗi cụ thể:

"D:\Intellij\JDK 19\bin\java.exe" "-javaagent:D:\Intellij\IntelliJ IDEA Community Edition 2022.3.1\lib\idea_rt.jar=56867:D:\Intellij\IntelliJ IDEA Community Edition 2022.3.1\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath "D:\Intellij\Doodle Jump\out\production\Doodle Jump" main.DoodleJump
Kich thuoc Panel: java.awt.Dimension[width=416,height=512]Exception in thread "Thread-0" java.lang.NullPointerException: Cannot invoke "main.GamePanel.getWidth()" because "this.gamePanel" is null
	at Entities.Player.updatePos(Player.java:59)
	at Entities.Player.update(Player.java:26)
	at main.Game.update(Game.java:48)
	at main.Game.run(Game.java:67)
	at java.base/java.lang.Thread.run(Thread.java:1589)

image
image

Code:

    public class GamePanel extends JPanel {
            private Game game;
            public GamePanel(Game game) {
                this.game = game;
                addKeyListener(new KeyBoardControl(this));
                getPreferredSize();
                System.out.print("Kich thuoc Panel: " + getPreferredSize());
            }
            public Dimension getPreferredSize() {
                return new Dimension(GAME_WIDTH,GAME_HEIGHT);
            }
            public void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                game.render(g);
            }
            public Game getGame() {
                return game;
            }
        }
    public class Player extends Entity{
        private int aniIndex = 0, aniTick = 0, aniSpeed = 15;
        private boolean right, left, moving = false;
        private int playerSpeed = 3;
        private BufferedImage doodle;
        private float dy = 0, playerSpeedFall = 0.2f;
        private GamePanel gamePanel;
        private Game game;
        public Player(float x, float y, float h) {
            super(x, y, h);
            loadAnimation();
        }
        public void update() {
            updatePos();
            updateAnimationTick();
        }

        public void loadAnimation() {
            try {
                doodle = ImageIO.read(new FileInputStream("resource/player.png"));
            } catch(IOException e) {
                throw new RuntimeException(e);
            }
        }

        private void updateAnimationTick() {
            aniTick++;
            if(aniTick >= aniSpeed)
            {
                aniTick = 0;
                aniIndex++;
                if(aniIndex >= 3) {
                    aniIndex = 0;
                }
            }
        }
        public void updatePos() {
            moving = false;
            if (left && !right) {
                x -= playerSpeed;
                moving = true;
            } else if (!left && right) {
                x += playerSpeed;
                moving = true;
            }
            if (x < 0) x = gamePanel.getWidth();
            if (x > gamePanel.getWidth()) x = 0;
            // fall();
        }
        public void fall() {
            dy += playerSpeedFall;
            y += dy;
        }
        public void render(Graphics g) {
            g.drawImage(doodle, (int) x, (int) y, 180, 180, null);
        }
        public void resetDirBoolean() {
            left = right = false;
        }
        public boolean isRight() {
            return right;
        }
        public void setRight(boolean right) {
            this.right = right;
        }
        public boolean isLeft() {
            return left;
        }
        public void setLeft(boolean left) {
            this.left = left;
        }
    }

Chỗ khởi tạo giá trị (new GamePanel()) cho gamePanel đâu bạn?

1 Like

Em đã thử khởi tạo gamePanel = new gamePanel(game) ở hàm updatePos() rồi nhưng mà sau khi khởi tạo thì không nhận các Keyevent nữa ạ

Sao lại tạo nó ở updatePos() ???
Tại sao không khởi tạo ở hàm dựng Player?

Em cũng đã thử và không nhận được KeyEvent ạ

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?