1

我正在用 Java 制作一个自上而下的射击游戏克隆。大约一个小时后,我能够弄清楚如何定位船的射弹,它是相对于船的精灵方向的激光。问题是,如果我移动船,当我移动船时,弹丸会相对于船的方向跟随。如您所见,这是一个问题,因为无论发射时船在哪里,激光都应该独立移动。

这是提出我的问题的代码:

private Image ship;
    private int ship_dx = 500;
    private int ship_dy = 400;
    private int ship_velocity = 5;
    private boolean isLaser = false;
    private static final int laser_DyOffSetOfBall = 48;
    private static final int laser_DxOffSetOfBall = 23;
    private Image laser;
    private int laser_dx = ship_dx+laser_DxOffSetOfBall;
    private int laser_dy = ship_dy-laser_DyOffSetOfBall;
    private int laser_velocity= 10;

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(ship, ship_dx, ship_dy, this);
        if(isLaser){

            laser_dy -= laser_velocity;
            laser_dx = ship_dx+laser_DxOffSetOfBall;
            g.drawImage(laser,laser_dx,laser_dy,this);
            if(laser_dy < 50)
            {
                isLaser = false;
                laser_dy = ship_dy-laser_DyOffSetOfBall;
            }
        }
            Toolkit.getDefaultToolkit().sync();
    }

这是游戏!:

IMG

4

2 回答 2

1

错误在行laser_dy = ship_dy - ....

您想绘制独立于船舶位置的弹丸,因此不要使用 ship_dy 和 ship_dy,而是将弹丸 startPos 存储在单独的变量中,该变量在船舶移动期间不会改变;

就像是

laserStartX = ship_dx;
laserStartY = ship_dy;

然后:

laser_dx = laserStartX + laserDxOffsetBall;

与laser_dy 相同

于 2013-01-07T03:53:38.210 回答
1

您只需要在第一次上漆时设置激光的 x 位置,否则在每次重新上漆时,激光都会相对于船水平移动。为此,您可以添加另一个布尔值 isFirst(用于激光的第一次绘制),当 isLaser 第一次变为真时设置为真,并且仅当 isFirst 为真时才设置 x 位置。

boolean isFirst = true;

public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawImage(ship, ship_dx, ship_dy, this);
    if(isLaser){
        laser_dy -= laser_velocity;
        if(isFirst){

            laser_dx = ship_dx+laser_DxOffSetOfBall;
            isFirst = false;

        }
        g.drawImage(laser,laser_dx,laser_dy,this);
        if(laser_dy < 50)
        {
            isLaser = false;
            laser_dy = ship_dy-laser_DyOffSetOfBall;
        }
    } else {
        isFirst = true;
    }
        Toolkit.getDefaultToolkit().sync();
}
于 2013-01-07T03:54:30.870 回答