Java 2D“坦克”游戏:从旋转的精灵射击“导弹”不起作用

时间:2014-01-04 15:00:46

标签: java sprite angle

编辑:问题解决了。我忘了把Math.toRadians()放到我做Math.cos或Math.sin的任何地方。 :)

我正在开发一个简单的Java 2D游戏,涉及两个射击导弹并在屏幕上移动的坦克。 对于这个问题,让我们假设只有一个坦克。

控制:

  • 逆时针调整移动角度:左箭头键
  • 顺时针调整移动角度:右箭头键
  • 前进:向上箭头键
  • 射击导弹:输入

按左或右也旋转精灵

我试图对游戏进行编码,以便导弹从“tank barrerl”射出(点标记为绿色)。但是,我写的代码没有达到这个目的。

相反,当按下ENTER时,导弹出现在精灵或其周围的一个点上,这似乎是随机的。

(橙色点是坦克的起源:tank.getX(),tank.getY())。

enter image description here

如果没有坦克旋转的事实,那么编码就不会有问题。每次用户旋转水箱时,绿点的位置都会发生变化。

我的代码出了什么问题?这个代码应该使导弹从“桶”的任何地方“射击”。正如我所说,不起作用。

这是用户按ENTER键时运行的内容。

enterAction = new AbstractAction(){
    public void actionPerformed(ActionEvent e){

        double missileXposition, missileYposition;
        double tankMiddleX,tankMiddleY;
        double angle, radius;

        tankMiddleX = tank1.getX() + (tank1.getWidth()/2);
        tankMiddleY = tank1.getY() + (tank1.getHeight()/2);

        angle = tank1.getAngle();
        radius = tank1.getWidth()/2;

        missileXposition = tankMiddleX + ( Math.cos(angle) * radius );
        missileYposition = tankMiddleY + ( Math.sin(angle) * radius );

        missiles1.add( new Missile( missileXposition, missileYposition , "red" , tank1.getAngle() , tank1) );

    }
};

Missile类:

public class Missile extends Entity {

    public Missile(double x, double y, String type, double angle, Tank tank){

        this.x = x;
        this.y = y;
        this.dx = dx;
        this.dy = dy;
        this.type = type;
        this.angle = angle;

        if(type.equals("red")) image = new ImageIcon(this.getClass().getResource("sprites/redrocket1.png")).getImage();
        if(type.equals("blue")) image = new ImageIcon(this.getClass().getResource("sprites/bluerocket1.png")).getImage();

        width = image.getWidth(null);
        height = image.getHeight(null);

        if(type.equals("blue")) dx = (-1) * ( 6 * Math.cos(Math.toRadians(tank.getAngle())) );
        if(type.equals("red")) dx = 6 * Math.cos(Math.toRadians(tank.getAngle()));

        if(type.equals("blue"))  dy = (-1) * ( 6 * Math.sin(Math.toRadians(tank.getAngle()) ) );
        if(type.equals("red"))  dy = 6 * Math.sin(Math.toRadians(tank.getAngle()));

    }

}

非常感谢

1 个答案:

答案 0 :(得分:1)

确定精灵的原点(橙色)和导弹起点(绿色)(d)之间的距离以及精灵上缘和橙绿色a之间的角度。

现在你将导弹的起点设置为

tank1.getX()+Math.cos(d*Math.toRadians(a+tank1.getAngle()));
tank1.getY()+Math.sin(d*Math.toRadians(a+tank1.getAngle()));

我不知道它是否100%正确,但我认为这是正确的方向。