1

私は小さなスペース インベーダー プロジェクトを作成しており、常にエイリアンを左から右へループさせています。画面の端に到達すると、右側を再描画し、再び左から右に移動します。私はすでにウィンドウ サイズを設定しており、Java でスペース インベーダーを作成する方法に関するさまざまなチュートリアルを見てきましたが、それらのほとんどは私が試したのと同じことを言っています。誰かがコーディングのどこに問題があるかを指摘して、修正方法を知ることができるでしょうか。

これは、エイリアン クラスのコードです。さまざまなエイリアンがいますが、すべてのクラスはこれとほぼ同じに見えます。

package spaceinvaders2;

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;

class Alien extends MoveObject 
{
    Image Alien = new ImageIcon(getClass().getResource("alien.gif")).getImage();
Alien(int x, int y, int w, int h) 
{
    super(x, y);
    bounds.width = w;
    bounds.height = h;
}

public void paint(Graphics g) 
{
    System.out.println("Alien generated");
    bounds.x = bounds.x - 2;

    if ((bounds.x + bounds.width)< 0)
    {
        bounds.x = 750;
        dead = false;
    }

    g.drawImage(Alien,bounds.x,bounds.y,bounds.width, bounds.height, this);
}
}

編集: 私のペイント メソッドは、すべてのグラフィックを描画するメイン ゲーム機能部分で呼び出されています。作画は問題ありませんが、このクラスの宇宙人の動きです。

4

3 に答える 3

2

ペイント メソッドは 1 回だけ実行されていると思います。paint() メソッドを定期的に呼び出すスレッドを追加する必要があります。

于 2012-08-08T10:23:16.437 に答える
1

directionエイリアンに移動方向を示す属性 (+1 または -1)を与える必要があります。エイリアンが画面外に出そうになったら、方向を反転させます。たとえば、方向が +1 の場合は -1 に変更し、その逆も同様です。

これが私が作成した簡単な例です:

public class Alien extends JPanel 

    private int x = 5;
    private int y = 5;
    private int direction = 1;

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.clearRect(x, y, getWidth(), getHeight());

        // draw the alien.
        g.drawRect(x, y, 10, 10);

        // move it
        x = x + 5 * direction;

        // is it about to go off-screen?
        if (x < 0 || x + 10 > getWidth()) {
            // change the direction
            direction *= -1;
        }
    }
}
于 2012-08-08T10:39:44.663 に答える
0

あなたのコメントによると、エイリアンが画面の境界に達したら、反対側から再入するのではなく、左から右に移動するようにします。

解決策は簡単です。エイリアンの方向を追跡する必要があります。これを行う簡単な方法は、ステップ サイズを変数にすることです。

Alien クラスに次のstepようなメンバーを指定します。

int step = -2;

それで:

bounds.x = bounds.x + direction;

if ((bounds.x + bounds.width)< 0)
{
    step = +2;
}
else if ((bounds.x - bound.width) > 750)
{
    step = -2;
}
dead = false;

g.drawImage(Alien,bounds.x,bounds.y,bounds.width, bounds.height, this);

トピック外ですが、あなたの方法dead = falseには属していないと思います。paint

于 2012-08-08T10:39:18.757 に答える