Search code examples
javaandroid-studiolibgdxbox2d

boolean value doesnt change insade class java


I try to change boolean value outside class using method from this class. But my problem is that i can't make my boolean value change in update method.


    public class Snake extends Sprite {
    
        protected boolean removeSnake;
    
        public Snake() {
            removeSnake = false;
    }
    
    public void update(float dt) {
    Gdx.app.log("value inside update : ", String.valueOf(removeSnake));
            if(removeSnake) {
                do something...
            }
    }
    
    public void setRemoveSnake(boolean removeSnake) {
    
            this.removeSnake = removeSnake;
            Gdx.app.log("value: ", String.valueOf(removeSnake));
            Gdx.app.log("this.value: ", String.valueOf(this.removeSnake));
        }
    }

The output after calling method setRemoveSnake(true) is:

[value: ] true
[this.value: ] true
[value inside update : ] false

I use libGDX and Box2D in my game if this is necessary.

Edit. I tried to delete snake insade main game update method but program can't access second for loop in this code:


           for(Integer hashCode : creator.getDeadEnemiesList()) {
                Gdx.app.log("work outside for loops: ", String.valueOf(hashCode));
            }
    
            for(Snake enemy : creator.getEnemies()) {
                Gdx.app.log("work insade enemy for loop", "");
                for(int i = 0; i < creator.getDeadEnemiesList().size(); i++) {
                    Integer hashCode = Integer.valueOf(creator.getDeadEnemiesList().get(i));
                    Gdx.app.log("work insade hashCode for loop", "");
                    Gdx.app.log("list hascode: ", String.valueOf(hashCode));
                    Gdx.app.log("enemy hascode: ", String.valueOf(System.identityHashCode(enemy)));
                    if (hashCode.equals(Integer.valueOf(System.identityHashCode(enemy)))) {
                        for (SnakeTail tailPart : enemy.getTailArray()) {
                            world.destroyBody(tailPart.b2body);
                        }
                        world.destroyBody(enemy.getB2body());
                    }
                }
                enemy.update(dt);
            }

Here is output: (before killing enemy snake)

[work insade enemy for loop] 1356724055

and after:

[work outside for loops: ] 1356724055

Solution

  • Ok so i finally find an answer. That was my ContactListener before i edited my post:

    case BetterSnake.ENEMY_BIT | BetterSnake.PLAYER_TAIL_BIT:
                    if(fixA.getFilterData().categoryBits == BetterSnake.ENEMY_BIT) {
                        for(int i = 0; i < creator.getEnemies().size; i++) {
    
                            if(creator.getEnemies().get(i).equals( fixA.getUserData())) {
                                creator.getEnemies().removeIndex(i);
                            }
                        }
                        ((Snake) fixA.getUserData()).setRemoveSnake(true);
                        
                    }else {
                        for(int i = 0; i < creator.getEnemies().size; i++) {
    
                            if(creator.getEnemies().get(i).equals( fixB.getUserData())) {
                                creator.getEnemies().removeIndex(i);
                            }
                        }
                        ((Snake) fixB.getUserData()).setRemoveSnake(true);
                        
                    }
                    break;
    

    And because i removed Snake from creator.getEnemies() list, my update method:

    
        for(int i = 0; i < creator.getEnemies().size; i++) {
                    Snake enemy = creator.getEnemies().get(i);
                    enemy.update(dt);
                }
    

    didn't work and i simply couldn't remove Snake because Snake was removed from list and program didn't go thru enemy.update(dt).