Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java libgdx生成后精灵的临时移动_Java_Libgdx_Spawning - Fatal编程技术网

Java libgdx生成后精灵的临时移动

Java libgdx生成后精灵的临时移动,java,libgdx,spawning,Java,Libgdx,Spawning,每秒调用一个新的敌人方法,这就是为什么每秒渲染一个新的精灵 基本上,我想做的是,当一个新的敌人诞生时,它必须向下移动,直到它离开屏幕。但是现在发生的是,敌人只会移动一秒钟。我认为你引入了成员变量new敌手,把事情弄糊涂了。你有一个方法可以创建一个新的敌人并将其添加到你的敌人列表中,之后,不应该有理由将其从列表中单独引用,因此你应该允许丢弃新的敌人引用 因此,您应该从类中删除Sprite new敌方行,并在new敌方方法中声明它 此外,也不需要为位置列出Vector2,因为Sprite类已经存储了

每秒调用一个新的敌人方法,这就是为什么每秒渲染一个新的精灵


基本上,我想做的是,当一个新的敌人诞生时,它必须向下移动,直到它离开屏幕。但是现在发生的是,敌人只会移动一秒钟。

我认为你引入了成员变量new敌手,把事情弄糊涂了。你有一个方法可以创建一个新的敌人并将其添加到你的敌人列表中,之后,不应该有理由将其从列表中单独引用,因此你应该允许丢弃新的敌人引用

因此,您应该从类中删除Sprite new敌方行,并在new敌方方法中声明它

此外,也不需要为位置列出Vector2,因为Sprite类已经存储了位置。您只需要移动单个精灵。因此,删除所有与posCoordinate相关的内容。您的新敌人方法应该如下所示:

public class Player {
    private Sprite enemy;

    public Rectangle bounds;
    private SpriteBatch batch;
    private float deltaTime;
    private float timer;

    private ArrayList<Sprite> enemies;
    private Iterator<Sprite> enemyIterator;
    private ArrayList<Vector2> posCoordinate;
    Sprite newEnemy;

    public void create(){
        batch=new SpriteBatch();
        timer=0;

        enemy=new Sprite(new Texture(Gdx.files.internal("spr_player.png"))); 
        bounds=new Rectangle(200,700,82,80);

        enemies=new ArrayList<Sprite>();
        posCoordinate=new ArrayList<Vector2>();
        newEnemy=Pools.obtain(Sprite.class);

    }

    public void update(){
        deltaTime=Gdx.graphics.getDeltaTime();
        enemyIterator=enemies.iterator();
        timer+=1*deltaTime;

        if(timer>=1f){
            newEnemy();  //method called every second
            timer-=1;
        }

    }

    public void newEnemy(){

        Vector2 position=Pools.obtain(Vector2.class); //vector2 is created for each enemy every second.
        position.set(200,700);
        posCoordinate.add(position);

        newEnemy=Pools.obtain(Sprite.class); //enemy created every second
        newEnemy.set(enemy);

        enemies.add(newEnemy);
    }

    public void draw(SpriteBatch batch){

        //this is where the enemy position is set and movement
        for(Sprite enemy:enemies){
            enemy.draw(batch);
        }for(Vector2 position:posCoordinate){
            newEnemy.setPosition(position.x,position.y);
            position.y-=2;

        }
            }

        }
最后,在你的绘制方法中,这是一个错误的更新位置,你试图只移动最近创建的敌人,而不是移动所有敌人。请注意,循环的每次迭代都会影响同一个实例:new敌军,它只是您创建的最后一个敌军

这是我将如何修改你的课程

1移动速度应该是恒定的,以每秒世界单位来衡量,因此在你的课堂上宣布如下内容:

private void newEnemy(){
    Sprite newEnemy = Pools.obtain(Sprite.class);
    newEnemy.set(enemy); //I recommend renaming your `enemy` variable to something like `prototypeEnemy` for clarity
    newEnemy.setPosition(200, 700); //need to start it at correct location.
    enemies.add(newEnemy);
}
2在更新方法的底部,您可以添加此选项以使所有敌人移动:

private static final float ENEMY_SPEED = -120f;
3在该选项下,您可以在屏幕外添加检查,以便删除它们。必须使用迭代器实例来避免ConcurrentModificationException

for (Sprite sprite : enemies){
    sprite.translateY(deltaTime * ENEMY_SPEED);
}

5在绘制方法中,删除第二个for循环,现在我们正在更新方法中处理位置更新。

我是池新手,当我删除精灵并将其放回池中时,如何再次使用池中的精灵?这是做什么的//Sprite new敌手=Pools.acquinsprite.class;Pools.acquinsprite.class;从池中拉出一个精灵供你使用。如果池是空的,它会自动实例化一个新的精灵并提供给您。你不知道你得到的精灵是新的还是回收的,所以一定要立即设置它的纹理区域和位置。这样你就不需要写额外的代码了,它会自动回收精灵吗?谢谢你的回答,你的帮助很大。这就是游泳课的魅力所在。它会在幕后自动生成所需的一切。但它只适用于具有无参数构造函数的类。对于其他课程,你还需要写更多的东西。
Iterator<Sprite> enemyIterator = enemies.iterator();
while (enemyIterator.hasNext()){
    Sprite sprite = enemyIterator.next();
    if (sprite.getY() + sprite.getHeight() < screenBottom) //screenBottom is something you can calculate from your camera like camera.getPosition().y - camera.getHeight()/2
        removeEnemy(sprite);
}
private void removeEnemy(Sprite sprite){
    enemies.remove(sprite);
    Pools.free(sprite);
}