0

我正在使用 GdxLib 做我的第一个 Java 游戏,我想使用 ArrayList 创建敌人(但我不知道该怎么做),并且它们都在随机位置产生,但我遇到的问题很少,

  1. 我创建它们是错误的,因为它们像“线”一样生成,因为我不知道如何随机生成它们。
  2. 当我在屏幕上创建的任何敌人“死亡”(计数 == 20)时,如果我射击任何其他敌人,我就无法杀死它。

这是课程代码:

public class World {

    gameMain game;
    Ship ship;
    ArrayList<Bullet> bullets = new ArrayList<Bullet>();
    ArrayList<Follower> enemies = new ArrayList<Follower>(5);
    WorldRenderer wr;
    Iterator<Bullet> bIter;
    Iterator<Follower> eIter;
    Bullet b;
    Enemy e;
    int count = 0;
    int shipCount = 0;   
    float x = 0;
    float y = 0;

    public World (gameMain game){
        this.game = game;
        ship = new Ship(new Vector2(20, 15), 1, 1, 0, 5f);//Ship Atributes
        for (int i= 0;i<5; i++){ //Creates 5 enemies
             enemies.add(new Follower(5f, 0, 1, 1, new Vector2(x,y)));

             x = x+2;
             y = y+2;

        }

        Gdx.input.setInputProcessor(new InputHandler(this)); 
    }


    public Ship getShip(){
        return ship;
    }

    public ArrayList<Follower> getEnemies(){
        return enemies;
    }

    public void update(){
        ship.update();

        bIter = bullets.iterator();
        while(bIter.hasNext()){
            b = bIter.next();
            b.update(ship);
        }

        eIter = enemies.iterator();
        while(eIter.hasNext()){
            e = eIter.next();

            if(ship.getBounds().overlaps(e.getBounds()))
                Gdx.app.log(gameMain.LOG, "ColisioN!");
            shipCount = shipCount +1;
        }

        bIter = bullets.iterator();
        while(bIter.hasNext()){
            b = bIter.next(); 

            eIter = enemies.iterator();
            while(eIter.hasNext()){
                e = eIter.next();

                if(e.getBounds().overlaps(b.getBounds())){
                    Gdx.app.log(gameMain.LOG, "!");
                    bIter.remove();
                    count = count +1;
                    if (count == 20) {
                        eIter.remove();
                    }
                }
            }

        }
    }

    public void addBullet(Bullet b){
        bullets.add(b);
    }

    public ArrayList<Bullet> getBullets(){
        return bullets;
    }

    public void setRenderer(WorldRenderer wr){
        this.wr = wr;
    }

    public WorldRenderer getRenderer(){
        return wr;
    }

    public void dispose(){

    }
}

另外,我尝试Thread.sleep(2000)在创建敌人之后将 a 放到下一个创建中,但是当我运行游戏时,屏幕会冻结,但是线程正在工作,因为我System.out.println在每次创建后都使用 a 在控制台中打印。还有另一种选择来延迟 bucle 而不使用Thread.sleep?

4

1 回答 1

1

首先,这个方便的小功能应该可以帮助您:

public float randFloat(float Min, float Max) {
    return Min + (float)(Math.random() * (Max - Min + 1));
}

然后你可以这样做:

for (int i = 0; i < 5; i++) {
    float x = randFloat(-50.0, 50.0);
    float y = randFloat(-50.0, 50.0);
    enemies.add(new Follower(5f, 0, 1, 1, new Vector2(x, y)));
}

你的xy变量不应该是全局的,而是你创建敌人的地方。enemies此外,您在声明列表时也不需要指定列表的大小。在上面的代码示例中,我只是将-50.0and50.0作为 and 的最小值/最大值xy实际上你应该通过关卡/世界的界限。

当我在屏幕上创建的任何敌人“死亡”(计数 == 20)时,如果我射击任何其他敌人,我就无法杀死它。

我假设count是指敌人的健康状况,因为您需要 20 次射击才能杀死敌人。在这种情况下,你当然不能杀死另一个敌人,因为你从未重置count变量!你不断增加它,但它会再次成为 20 吗?改为这样做:

if (count == 20) {
    count = 0;
    eIter.remove();
}

我希望这能解决你的问题。

于 2013-09-27T07:09:26.710 回答