2016-07-06 4 views
0

Я сделал двигатель с LWJGL, и доволен им до сих пор. Естественно, теперь я готов добавить физику к движку, чтобы я мог начать создавать с ним игру. Я решил использовать Jbox2D, поскольку он выглядит довольно гибким, и я импортировал его в проект и выполнил всю необходимую настройку, однако после внедрения системы body в мой класс GameObject и запуска игры все GameObjects, казалось, направлялись в центр окно, я полагаю, что я, возможно, сделал несколько ошибок в коде:Я не уверен, как я могу использовать мой текущий движок lwjgl с 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); 
} 

мир и HashSet тела находится в главном классе, если вам интересно, то я думаю, что я серьезно облажался код каким-то образом. Также я использую устаревший трубопровод lwjgl, поскольку он проще и лучше подходит для двигателя.

+0

Вы считаете, что Box2D использует счетчики вместо пикселей? – Alberto

+0

да вот почему я деляю или умножаю на 30 из которых является предполагаемым алгоритмом обмена, но я сомнительно .... – zipper9998

+0

возможно, это тот факт, что box2D использует центр тела как его источник (именно поэтому я разделив размер на 2), а lwjgl использует другую точку ... – zipper9998

ответ

0

Я просто установить происхождение моих спрайтов в их центре, а не в левом нижнем углу, и решить эту проблему, как это:

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

Я надеюсь, что это помогает кто-то в подобной ситуации (Sx является размер X , sY is sizeY)

Смежные вопросы