libGDX如何从数组中删除特定值

时间:2016-09-12 07:19:35

标签: java arrays for-loop libgdx

我为entity.MyList和外星人创建了一个数组,playerShots是所有playerShots的外星人,外星人是在屏幕顶部产生的所有外星人。< / p>

每个外星人和子弹周围都有一个碰撞圈。因为它们是在数组中,当我搜索是否发生碰撞时;它会说是真的,但我似乎无法指定删除特定碰撞的两个对象。我花了半个晚上试图找出一些没有运气的东西。

我曾尝试给每个外星人一个值,例如在1级。有10个外星人。因此它们产生的值从0到9。 然后我抓住我杀死的那个的值,并从数组中删除它(例如,杀死数字7,删除第7个索引)。但是我有另一种方法是用来将所有外星人的值(在索引被杀之后)下拉1;这是为了用索引大小来纠正外星人的值,但是在杀死一个外星人后它实际上不会扣除这些值,所以我会得到一个错误,因为程序最终会尝试删除一个没有的数组索引存在。我不确定为什么。这是我的代码:我已经删除了解决问题的可怕尝试。

playersShots

我认为这就是展示我遇到的问题所需的全部内容。正如你所知,我现在被迫使用private void didCollisionOccur() { for(Alien alien : aliens) { for(PlayerShot playerShot : playerShots) { if(Intersector.overlaps(alien.getCircle(), playerShot.getCircle())) { alien = aliens.removeIndex(0); playerShot = playerShots.removeIndex(0); } } } } 。这无济于事,因为无论我杀死哪个外星人,它都会删除(0)处的那个。

我会重新创建我希望成为我解决方案的方法,如果这可能会有所帮助,也许你可能知道我哪里出错了。

removeIndex(0)

以下是Alien.class

private void didCollisionOccur()
{
    for(Alien alien : aliens)
    {
        for(PlayerShot playerShot : playerShots)
        {
            if(Intersector.overlaps(alien.getCircle(), playerShot.getCircle()))
            {
                getCountHolder = alien.getCount();
                alien = aliens.removeIndex(alien.getCount());
                playerShot = playerShots.removeIndex(0);
            }
        }
    }
    for(Alien alien : aliens)
    {
        if(alien.getCount() >= getCountHolder)
        {
            alien.takeFromCount(1);
        }
    }
}

编辑&gt;

public void takeFromCount(int value)
    {
        count -= value;
    }

    public int getCount()
    {
        return count;
    }

Array Javadoc here

1 个答案:

答案 0 :(得分:0)

您是否尝试过方法removeValue()?

https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/utils/Array.html#removeValue-T-boolean-

我想你可以解决你的问题。

private void didCollisionOccur()
{
    for(Alien alien : aliens)
    {
        for(PlayerShot playerShot : playerShots)
        {
            if(Intersector.overlaps(alien.getCircle(), playerShot.getCircle()))
            {
                aliens.removeValue(alien,true);
                playerShots.removeValue(playerShot,true);
            }
        }
    }
}

现在可能是java导致当前修改异常。如果是这种情况,您需要引用循环外的两个对象并在之后将其删除。

private void didCollisionOccur()
{
    Alien tmpAlien = null;
    PlayerShot tmpPlayerShot = null;
    for(Alien alien : aliens)
    {
        for(PlayerShot playerShot : playerShots)
        {
            if(Intersector.overlaps(alien.getCircle(), playerShot.getCircle()))
            {
                 tmpAlien = alien;
                 tmpPlayerShot = playerShot;
            }
        }
    }
    if(tmpAlien != null && tmpPlayerShot != null)
    {
        aliens.removeValue(tmpAlien,true);
        playerShots.removeValue(tmpPlayerShot,true);
    }
}