首页 文章

按下左箭头键或右箭头键时,角色会对角移动

提问于
浏览
0

我正在尝试用Java创建我的第一个游戏 . 我有我的画布和一个可以移动的小圆圈播放器 . 当我按向左箭头键时,角色向上移动并向左移动 . 当我按下右键时,角色会向下移动并向右移动 . 向上和向下箭头什么都不做 . 我已经检查过看到我的任何变量混乱,但我认为我没有 . 我对此非常陌生,所以如果有人能告诉我为什么以及在哪里出错,那将会非常有帮助

我的Game.java是这样的:

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

public class GamePanel extends JPanel implements Runnable, KeyListener{

    // Fields
    public static int WIDTH = 600;
    public static int HEIGHT = 600;

    private Thread thread;
    private boolean running;

    private BufferedImage image;
    private Graphics2D g;

    private int FPS = 30;
    private double averageFPS;

    private Player player;

    // Constructor
    public GamePanel() {
        super();
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setFocusable(true);
        requestFocus();
    }

    // Functions
    public void addNotify() {
        super.addNotify();
        if (thread == null) {
            thread = new Thread(this);
            thread.start();
        }
        addKeyListener(this);
    }

    public void run() {
        running = true;

        image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        g = (Graphics2D) image.getGraphics();

        player = new Player();

        long startTime;
        long URDTimeMillis;
        long waitTime;
        long totalTime = 0;

        int frameCount = 0;
        int maxFrameCount = 30;

        long targetTime = 1000 / FPS;

        // Game Frame Limiter and Timer
        while (running) {

            startTime = System.nanoTime();

            gameUpdate();
            gameRender();
            gameDraw();

            URDTimeMillis = (System.nanoTime() - startTime) / 1000000;

            waitTime = targetTime - URDTimeMillis;

            try {
                Thread.sleep(waitTime);
            } catch (Exception ignored){

         }

         totalTime += System.nanoTime() - startTime;
         frameCount ++;
         if (frameCount == maxFrameCount) {
                averageFPS = 1000.0 / ((totalTime / frameCount) / 1000000);
                frameCount = 0;
                totalTime = 0;
            }
        }
    }

    private void gameUpdate() {

        player.update();

    }

    private void gameRender() {

        g.setColor(Color.WHITE);
        g.fillRect(0, 0, WIDTH, HEIGHT);
        g.setColor(Color.BLACK);
        g.drawString("FPS: " + averageFPS, 10, 10);

        player.draw(g);

    }

    private void gameDraw() {
        Graphics g2 = this.getGraphics();
        g2.drawImage(image, 0, 0, null);
        g2.dispose();
    }

    public void keyTyped(KeyEvent key){

    }

    public void keyPressed(KeyEvent key){

        int keyCode = key.getKeyCode();
        if (keyCode == KeyEvent.VK_LEFT){
            player.setLeft(true);
        }
        if (keyCode == KeyEvent.VK_RIGHT){
            player.setRight(true);
        }
        if (keyCode == KeyEvent.VK_UP){
            player.setUp(true);
        }
        if (keyCode == KeyEvent.VK_DOWN){
            player.setDown(true);
        }

    }

    public void keyReleased(KeyEvent key){

        int keyCode = key.getKeyCode();
        if (keyCode == KeyEvent.VK_LEFT){
            player.setLeft(false);
        }
        if (keyCode == KeyEvent.VK_RIGHT){
            player.setRight(false);
        }
        if (keyCode == KeyEvent.VK_UP){
            player.setUp(false);
        }
        if (keyCode == KeyEvent.VK_DOWN){
            player.setDown(false);
        }

    }

}

这是我的Player.java

import java.awt.*;

public class Player {

    // Fields
    private int x;
    private int y;
    private int r;

    private int dx;
    private int dy;
    private int speed;

    private boolean left;
    private boolean right;
    private boolean up;
    private boolean down;

    private int lives;
    private Color color1;
    private Color color2;

    // Construtor
    public Player(){

        x = GamePanel.WIDTH /2;
        y = GamePanel.HEIGHT /2;
        r = 5;

        dx = 0;
        dy = 0;
        speed = 5;

        lives = 3;
        color1 = Color.WHITE;
        color2 = Color.BLACK;

    }

    // Functions
    public void setLeft(boolean b){left = b;}
    public void setRight(boolean b){right = b;}
    public void setUp(boolean b){up = b;}
    public void setDown(boolean b){down = b;}

    public void update(){

        if (left){
            dx = -speed;
        }
        if (right){
            dx = speed;
        }
        if (up){
            dy = speed;
        }
        if (down){
            dy = -speed;
        }

        x += dx;
        y += dy;

        if (x < r){
            x = r;
        }
        if (y < r){
            y = r;
        }
        if (x > GamePanel.WIDTH - r){
            x = GamePanel.WIDTH - r;
        }
        if (y > GamePanel.HEIGHT - r){
            y = GamePanel.HEIGHT - r;
        }

        dx = 0;
        dy = 0;

   }

    public void draw(Graphics2D g){

        g.setColor(color1);
        g.fillOval(x - r, x - r, 2 * r, 2 * r);

        g.setStroke(new BasicStroke(3));
        g.setColor(color1.darker());
        g.drawOval(x - r, x - r, 2 * r, 2 * r);
        g.setStroke(new BasicStroke(1));

    }

}

1 回答

  • 0

    在播放器的Draw方法中,该行应为:

    g.fillOval(x - r, y - r, 2 * r, 2 * r);
    
    // and
    
    g.drawOval(x - r, y - r, 2 * r, 2 * r);
    

    g.fillOval(x - r, x - r, 2 * r, 2 * r);
    
    // and
    
    g.drawOval(x - r, x - r, 2 * r, 2 * r);
    

    X和Y变量混合起来,由于某种原因导致角色移动不同 . 现在工作

相关问题