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

我认为绘画方法只运行一次。您必须添加一个线程来调用 paint() 方法 periodi。

于 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 回答