0

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

DProphet
  • 35
  • 6

1 Answers1

0

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 :)

DProphet
  • 35
  • 6