簡體   English   中英

按下向左或向右箭頭鍵時,角色對角移動

[英]Character moves diagonally when left or right arrow keys are pressed

我正在嘗試用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));

    }

}

在播放器的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變量混合在一起,由於某種原因導致角色移動不同。 現在工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM