1

Java でトップダウン シューター クローンの作成に取り組んでいます。約 1 時間後、船のスプライトの方向に対して、レーザーである船の発射体を配置する方法を理解することができました。問題は、船を動かすと、船を動かしたときに発射体が船の方向に対して追従することです。ご覧のとおり、これは問題です。なぜなら、発射時に船がどこにいても、レーザーは独立して移動する必要があるからです。

私の問題を示すコードは次のとおりです。

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();
    }

ここにゲームがあります!:

画像

4

2 に答える 2

1

レーザーのx位置を最初にペイントするときに設定するだけで済みます。そうしないと、再ペイントするたびに、レーザーが船に対して水平に移動するためです。これを行うには、別のブールisFirst(レーザーの最初のペイント用)を追加できます。これは、isLaserが最初にtrueになったときにtrueに設定され、x位置はisFirstがtrueのときにのみ設定されます。

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 に答える
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 に答える