Java游戏 - 如何使用Arraylist添加敌人?

时间:2013-09-27 06:00:46

标签: java random arraylist

我正在使用GdxLib进行我的第一个Java游戏,我想使用ArrayList创建敌人(但我不知道该怎么做),并且所有这些都是随机产生的,但是我问题很少,

  1. 我创造它们是错误的,因为它们像'线'那样产卵,因为我不知道如何随机产生它们。
  2. 当我在屏幕上创建的任何敌人“死亡”时(数= = 20),如果我射杀任何其他敌人,我就无法杀死它。
  3. 这是类代码:

    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)放到下一个创建中,但是当我运行游戏时屏幕会冻结,但线程正在运行,因为我使用了System.out.println来打印每次创建后在控制台中。 还有另一种方法可以在不使用Thread.sleep的情况下延迟bucle?

1 个答案:

答案 0 :(得分: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.050.0作为xy的最小/最大值,实际上你应该传递你的关卡/世界的范围。 / p>

  

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

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

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

我希望能解决你的问题。