Java游戏开发:奇怪的运动bug

Java游戏开发:奇怪的运动bug,java,eclipse,youtube,Java,Eclipse,Youtube,我一直在关注这些教程,学习如何从youtube上的eclipse中用java制作自顶向下的快照 但是我遇到了一个奇怪的错误,玩家在不射击时可以对角移动,但是当玩家射击时,他们不能同时移动到北方和西方,我看了更深一点,但我什么也找不到 以下是玩家移动代码: if(left) { dx = (0 - speed); } if(right) { dx = speed; } if(down) { dy = speed; } if(up) { dy = (0 - sp

我一直在关注这些教程,学习如何从youtube上的eclipse中用java制作自顶向下的快照

但是我遇到了一个奇怪的错误,玩家在不射击时可以对角移动,但是当玩家射击时,他们不能同时移动到北方和西方,我看了更深一点,但我什么也找不到

以下是玩家移动代码:

if(left) {
    dx = (0 - speed);
}

if(right) {
    dx = speed;
}

if(down) {
    dy = speed;
}

if(up) {
    dy = (0 - 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.WIDTH - r) y = GamePanel.WIDTH - r;

dx = 0;
dy = 0;

if(firing) {
    long elapsed = (System.nanoTime() - firingTimer) / 1000000;
    if(elapsed > firingDelay) {
        GamePanel.bullets.add(new Bullet(270, x, y));
        firingTimer = System.nanoTime();
    }
}
if(左){
dx=(0-速度);
}
如果(右){
dx=速度;
}
如果(向下){
dy=速度;
}
如果(向上){
dy=(0-速度);
}
x+=dx;
y+=dy;
如果(xGamePanel.WIDTH-r)x=GamePanel.WIDTH-r;
如果(y>GamePanel.WIDTH-r)y=GamePanel.WIDTH-r;
dx=0;
dy=0;
如果(发射){
长时间运行=(System.nanoTime()-firingTimer)/1000000;
如果(经过>飞行延迟){
游戏面板。子弹。添加(新子弹(270,x,y));
firingTimer=System.nanoTime();
}
}
这是整个子弹等级:

package games.duphus.wave;

import java.awt.*;

public class Bullet {
private double x;
private double y;
private int r;

private double dx;
private double dy;
private double rad;
private int speed= 10;

private Color color1;
public Bullet(double angle, int x, int y) {
    this.x = x;
    this.y = y;
    r = 2;

    rad = Math.toRadians(angle);
    dx = Math.cos(rad) * speed;
    dy = Math.sin(rad) * speed;

    color1 = Color.YELLOW;
}

public boolean update() {
    x += dx;
    y += dy;

    if(x < -r || x > GamePanel.WIDTH + r || y < -r || y > GamePanel.HEIGHT + r) {
        return true;
    }

    return false;
}

public void draw(Graphics2D g) {
    g.setColor(color1);
    g.fillOval((int) (x - r), (int) (y - r), 2 * r, 2 * r);
}
}
package games.duphus.wave;
导入java.awt.*;
公营子弹{
私人双x;
私人双y;
私人INTR;
私人双dx;
私人双重身份;
私人双无线电;
私人整数速度=10;
私人色彩1;
公共项目符号(双角度,整数x,整数y){
这个.x=x;
这个。y=y;
r=2;
rad=数学托拉半径(角度);
dx=数学cos(rad)*速度;
dy=数学sin(rad)*速度;
color1=Color.YELLOW;
}
公共布尔更新(){
x+=dx;
y+=dy;
如果(x<-r | | x>GamePanel.WIDTH+r | | y<-r | | y>GamePanel.HEIGHT+r){
返回true;
}
返回false;
}
公共作废图纸(图形2D g){
g、 setColor(color1);
g、 圆形((int)(x-r),(int)(y-r),2*r,2*r);
}
}

非常感谢您的帮助。

我没有仔细阅读代码,但我认为您有键盘重影问题。我不能告诉你如何解决这个问题,除了改变你用来发射和移动的键。

我不能完全确定,但我认为它必须有键的感觉。当你按下第三个键时,它会忘记你按下的第一个键。我做了同样的教程,这就是我的结论

玩家的移动逻辑看起来正常,可能是在你发射子弹的地方(
firing=true
)或者改变移动(
left=true
right=true
…等等)。它在发射时允许其他方向吗?比如南部和东部?或任何其他对角线方向?