2016-07-06 5 views
0

J'ai fait un moteur avec LWJGL et j'en suis content jusqu'ici. Naturellement, je suis maintenant prêt à ajouter de la physique au moteur afin que je puisse réellement commencer à créer un jeu avec lui. J'ai choisi d'utiliser Jbox2D comme il semble assez flexible et je l'ai importé dans le projet et fait toute l'installation nécessaire, mais après avoir implémenté le système de corps dans ma classe GameObject et exécuté le jeu tous les GameObjects semblaient aller au centre du fenêtre, je crois que je l'ai fait quelques erreurs dans le code:Je ne suis pas sûr de la façon dont je pourrais utiliser mon moteur basé sur lwjgl avec Jbox2D

private BodyDef bodyDef = new BodyDef(); 
private Body box = world.createBody(bodyDef); 

public float MOVE_SPEED = 7.0f; 

public TAG tag; 

public static int direction = 0; 
public int jumpsRemaining; 

public float xSpeed = MOVE_SPEED; 
public float ySpeed = MOVE_SPEED; 
public float x, y; 
public float sX = 32, sY = 32; 

public boolean jumpPressed, jumpWasPressed; 
public boolean jumping = false; 
public boolean falling = true; 

//public int collidingX = 0; 
//public int collidingY = 0; 
public Time time = new Time(); 

protected static final int UP = 1; 
protected static final int RIGHT = 2; 
protected static final int DOWN = 3; 
protected static final int LEFT = 4; 

private boolean left = true; 
private boolean right = true; 
private boolean up = true; 
private boolean down = true; 

private Sprite spr; 

public GameObject(float sX, float sY, float posX, float posY, BodyType type) { 
    this.sX = sX; 
    this.sY = sY; 
    this.x = posX; 
    this.y = posY; 
    initPhysics(type); 

} 

public GameObject(float posX, float posY, BodyType type) { 
    this.x = posX; 
    this.y = posY; 
    initPhysics(type); 
} 

public abstract void update(); 

public abstract void input(); 

private void initPhysics(BodyType type){ 
    bodyDef.type = type; 
    bodyDef.position.set(x/30,y/30); 
    PolygonShape boxShape = new PolygonShape(); 
    boxShape.setAsBox(sX/30/2, sY/30/2); 
    FixtureDef fixture = new FixtureDef(); 
    fixture.density = 1; 
    fixture.shape = boxShape; 
    box.createFixture(fixture); 
    physicsBodies.add(box); 
} 

/**protected GameObject Colliding() { 
    for (GameObject gob : gameObjects) { 
     if (gob != this) { 
      if (Collision.checkCollision(gob, this) != null) { 
       return gob; 
      } 
     } 
    } 
    return null; 
}**/ 

public void render() { 

    if (spr != null) { 
     glPushMatrix(); 
     { 
      glTranslatef(box.getPosition().x * 30, box.getPosition().y * 30, 0); 
      spr.renderSprite(); 
     } 
     glPopMatrix(); 
    } 
} 

public void setTexture(String tex) { 
    spr = new Sprite(sX, sY, tex); 
} 

le monde et HashSet du corps sont dans la classe principale si vous vous demandez, je pense que je l'ai sérieusement foiré le code en quelque sorte. J'utilise également le pipeline hérité de lwjgl car il est plus simple et s'adapte mieux au moteur.

+0

Considérez-vous le fait que Box2D utilise des mètres plutôt que des pixels? – Alberto

+0

oui c'est pourquoi je divise ou multiplie par 30 dont est l'algorithme supposé d'échange mais je suis douteux .... – zipper9998

+0

peut-être c'est le fait que box2D utilise le centre d'un corps comme son origine (c'est pourquoi je suis divisant la taille par 2) et lwjgl utilise un autre point ... – zipper9998

Répondre

0

J'ai simplement mis l'origine de mes sprites à leur centre plutôt que en bas à gauche et qui a résolu le problème, comme celui-ci:

glVertex2f(-sX/2, -sY/2); 
glTexCoord2f(0, 0); 

glVertex2f(-sX/2, sY/2); 
glTexCoord2f(1, 0); 

glVertex2f(sX/2, sY/2); 
glTexCoord2f(1, 1); 

glVertex2f(sX/2, -sY/2); 
glTexCoord2f(0, 1); 

J'espère que cela aide quelqu'un dans une situation similaire (Sx est de taille X , sY est sizeY)