Quantcast
Channel: Question and Answer » libgdx
Viewing all articles
Browse latest Browse all 434

My characters do not reverse their velocity, why? libGDX

$
0
0

I have been programming my game in libGDX for a while now and even watched a tutorial on youtube from Brent Aureli. The game I’m going for is kinda like Super Mario Bros but there is one problem that is just not working like it should. When my enemies collide with each other or any other object in the game they don’t reverse their velocity at all. I even gone so far to copy Brents code bit by bit into my game but it is still not working.

Here is the code I’m using up till now:

/**
* Class that helps generate Enemies in general
*/
public abstract class Enemy extends Sprite {
   protected World world;
   protected PlayScreen screen;
   public Body b2body;
   public Vector2 velocity;
   protected boolean toDestroy;
   protected boolean destroyed;

public Enemy(PlayScreen screen, float x, float y){
    this.world = screen.getWorld();
    this.screen = screen;
    toDestroy = false;
    destroyed = false;
    setPosition(x, y);
    defineEnemy();
    velocity = new Vector2(-1, -2);
    b2body.setActive(false);
}

protected abstract void defineEnemy();
public abstract void update(float dt);
public abstract void hitOnHead(Link link);
public abstract void hitByEnemy(Enemy enemy);

public  abstract void destroy();


public void reverseVelocity(boolean x, boolean y){
    if(x)
        velocity.x = - velocity.x;
    if(y)
        velocity.y = - velocity.y;
}
}

and this is the class for a specific enemy:

/**
* Generates the Horrorkid as a second enemy
*/
public class Kid extends Enemy{

//variables for the animation
private float stateTime;
private Animation walkAnimation;
private Array<TextureRegion> frames;
private boolean setToDestroy;
private boolean destroyed;
float angle;


public Kid (PlayScreen screen, float x, float y) {
    super(screen, x, y);
    frames = new Array<TextureRegion>();
    for(int i = 4; i < 6; i++)
        frames.add(new TextureRegion(screen.getAtlas().findRegion("kid"), i * 16, 0, 16, 16));
    walkAnimation = new Animation(0.1f, frames);
    stateTime = 0;
    setBounds(getX(), getY(), 16 / GetTheTriforce.PPM, 16 / GetTheTriforce.PPM);
    setToDestroy = false;
    destroyed = false;
    angle = 0;
}

public void update(float dt){
    stateTime += dt;
    if(setToDestroy && !destroyed){
        world.destroyBody(b2body);
        destroyed = true;
        setRegion(new TextureRegion(screen.getAtlas().findRegion("kid"), 48, 0, 16, 16));
        stateTime = 0;
    }
    else if(!destroyed) {
        b2body.setLinearVelocity(velocity);
        setPosition(b2body.getPosition().x - getWidth() / 2, b2body.getPosition().y - getHeight() / 2);
        setRegion(walkAnimation.getKeyFrame(stateTime, true));
    }
}



@Override
protected void defineEnemy() {
    BodyDef bdef = new BodyDef();
    bdef.position.set(getX(), getY());
    bdef.type = BodyDef.BodyType.DynamicBody;
    b2body = world.createBody(bdef);

    FixtureDef fdef = new FixtureDef();
    CircleShape shape = new CircleShape();
    shape.setRadius(6 / GetTheTriforce.PPM);
    fdef.filter.categoryBits = GetTheTriforce.ENEMY_BIT;
    fdef.filter.maskBits = GetTheTriforce.GROUND_BIT |
            GetTheTriforce.STONE_BIT |
            GetTheTriforce.BRICK_BIT |
            GetTheTriforce.ENEMY_BIT |
            GetTheTriforce.OBJECT_BIT |
            GetTheTriforce.LINK_BIT|
            GetTheTriforce.HOLE_BIT;

    fdef.shape = shape;
    b2body.createFixture(fdef).setUserData(this);

    PolygonShape head = new PolygonShape();
    Vector2[] vertice = new Vector2[4];
    vertice[0] = new Vector2(-5, 8).scl(1 / GetTheTriforce.PPM);
    vertice[1] = new Vector2(5, 8).scl(1 / GetTheTriforce.PPM);
    vertice[2] = new Vector2(-3, 3).scl(1 / GetTheTriforce.PPM);
    vertice[3] = new Vector2(3, 3).scl(1 / GetTheTriforce.PPM);
    head.set(vertice);

    fdef.shape = head;
    fdef.restitution = 0.5f;
    fdef.filter.categoryBits = GetTheTriforce.ENEMY_HEAD_BIT;
    b2body.createFixture(fdef).setUserData(this);

}

public void draw(Batch batch){
    if(!destroyed || stateTime < 1)
        super.draw(batch);
}

@Override
public void hitOnHead(Link link) {
    setToDestroy = true;
    GetTheTriforce.manager.get("audio/sounds/stomp.wav", Sound.class).play();
    Hud.addScore(350);

}

@Override
public void hitByEnemy(Enemy enemy) {

    reverseVelocity(true, false);
}
public void destroy(){
    setToDestroy= true;
}


}

and that is the code I’m using in the ContactListener Class:

case GetTheTriforce.ENEMY_BIT | GetTheTriforce.OBJECT_BIT:
            if(fixA.getFilterData().categoryBits == GetTheTriforce.ENEMY_BIT)
                ((Enemy)fixA.getUserData()).reverseVelocity(true, false);
            else
                ((Enemy)fixB.getUserData()).reverseVelocity(true, false);
            break;

I don’t know where the problem/ mistake is. Any ideas?


Viewing all articles
Browse latest Browse all 434

Trending Articles