Search code examples
objectrangecocos2d-android

Cocos2d removing objects in distance (java)


Hi i have sprite which is granade ^^

Problem is when it exploding. It should kill all targets in distance (in this case all on screen) but it kills them randomly.

public void Explode(Object sender)
{
    ArrayList<Enemy> targetsToBlow = new ArrayList<Enemy>();
    targetsToBlow.addAll(targets);
    Bullet bullet = (Bullet)sender;
    float x = bullet.getPosition().x;
    float y = bullet.getPosition().y;
//  Log.i("Explode", "boom");
//  Log.i("Target",String.valueOf(y));
    for (int i=0;i<targetsToBlow.size();i++) 
    {
        Enemy enemy = targetsToBlow.get(i);
        float xd = enemy.getPosition().x - x;
        float yd = enemy.getPosition().y - y;
        float distance = (float) Math.sqrt(xd*xd + yd*yd);
        Log.i("Distance", String.valueOf(distance));
        if(distance<20000/2)
        {
            enemy.setHp(bullet.dmg);
            Log.i("Explode", "boomed1");
        }
        else if(distance<=20000)
        {
            enemy.setHp(bullet.dmg/2);
            Log.i("Explode", "boomed2");
        }
        if(enemy.getHp()<=0)
        {               
            targets.remove(enemy);
            removeChild(enemy, true);
            money++;
            moneyLabel.setString("GOLD: "+money);
        }
        targetsToBlow.remove(i);
    }
    projectiles.remove(bullet);
    removeChild(bullet, true);

}

I tried to do it from last index, but then it's not killing and granade stays on screen. I have no idea what is wrong :/ Please help


Solution

  • The problem was in arraylist items index after removing them. I think that was reason why some of them stays on scene.

    I made it same like in simple shoot:

    public void Explode(Object sender)
    {
        ArrayList<Enemy> targetsToDelete = new ArrayList<Enemy>();      
    
        Bullet bullet = (Bullet)sender;
    
    
             for (Enemy enemy : targets){
                 if(isEnemyInRange(bullet, enemy, 100))
                    {
                        enemy.setHp(bullet.dmg);
                        if(enemy.getHp()<=0)
                        {
                            targetsToDelete.add(enemy);
                        }
                    }
    
                }
                for (Enemy target : targetsToDelete){
                    targets.remove(target);
                    removeChild(target, true);
                }
    
        projectiles.remove(bullet);
        removeChild(bullet, true);
    
    }
    

    So items index isn't changed and after first loop i can destroy and remove all items that i need :)