2015-02-11 4 views
0

UPDATEJBox2D + Slick2D - не конфликтует

У меня есть намек. Это потому, что центр экрана в JBox2D равен (0, 0). Это так странно, потому что x и y не от -1 до 1, зависит от размера экрана.
Это означает, что класс Util, который я скопировал из Интернета (все пользователи этого кода), не обновляется. Мне все еще нужна помощь, потому что я не могу найти никакого «алгоритма», чтобы иметь соотношение сторон + размер экрана.


БАЗА ВОПРОС

Поскольку я добавил «slick2D в jbox2D положение» и наоборот (это как положение в экране = положение в экране/100 для JBox), я не получаю хороший результат. Скриншоты ниже

Я объясняю с кодом:

public class Util { 
    private static final float SCALE = 0.01f; // 1/100 pixels 
    public static float toPosX(float posX) { return (posX * SCALE); } 
    public static float toPosY(float posY) { return (-posY * SCALE); } 
    public static float toScreenX(float posX) { return (posX/SCALE); } 
    public static float toScreenY(float posY) { return (-posY/SCALE); } 
} 

Square.java:

public class Square { 
    private Body body; 
    private Rectangle rectangle; 

    Square(World world, BodyType type, Vec2 pos, Vec2 size) { 
     float x = Util.toPosX(pos.x); 
     float y = Util.toPosY(pos.y); 
     float sx = Util.toPosX(size.x); 
     float sy = Util.toPosY(size.y); 

     //body definition 
     BodyDef bd = new BodyDef(); 
     bd.position.set(x, y); 
     bd.type = type; 

     //define shape of the body. 
     PolygonShape cs = new PolygonShape(); 
     cs.setAsBox(sx, sy); 

     //define fixture of the body. 
     FixtureDef fd = new FixtureDef(); 
     fd.shape = cs; 
     fd.density = 1f; 
     fd.friction = 0.3f; 
     fd.restitution = 1.0f; 

     //create the body and add fixture to it 
     body = world.createBody(bd); 
     body.createFixture(fd); 

     rectangle = new Rectangle(0, 0, size.x, size.y); 
     rectangle.setLocation(pos.x, pos.y); 
    } 

    public Body getBody() { return this.body; } 
    public Rectangle getRectangle() { return this.rectangle; } 
} 

И, наконец, мой класс отображения:

public class DisplayManager extends BasicGame { 

    private GameManager gameManager; 
    private Body b1, b2; 
    private Rectangle r1, r2; 
    private World world; 

    public DisplayManager(GameManager game) { 
     super("Title"); 
     this.gameManager = game; 
    } 

    @Override 
    public void init(GameContainer container) throws SlickException { 
     this.gameManager.initPlayersSprites(); 

     world = new World(new Vec2(0, -10)); 
     Square s1, s2; 
     s1 = new Square(world, BodyType.STATIC, new Vec2(10, 800), new Vec2(1900, 30)); 
     b1 = s1.getBody(); 
     r1 = s1.getRectangle(); 
     s2 = new Square(world, BodyType.DYNAMIC, new Vec2(945, 200), new Vec2(30, 30)); 
     b2 = s2.getBody(); 
     r2 = s2.getRectangle(); 
    } 

    public void render(GameContainer container, Graphics g) throws SlickException { 
     float step = 1.0f/600.0f; 
     world.step(step, 6, 2); 
     r1.setLocation(Util.toScreenX(b1.getPosition().x), Util.toScreenY(b1.getPosition().y)); 
     r2.setLocation(Util.toScreenX(b2.getPosition().x), Util.toScreenY(b2.getPosition().y)); 
     g.draw(r1); 
     g.draw(r2); 
    } 
} 

Вот результат: первый кадр: http://i.stack.imgur.com/WgQPK.png

некоторые кадры позже: http://i.stack.imgur.com/a1XyL.png

(земля не двигалась, это просто еще один скриншот взял из моей руки)

Другими словами, куб падает вниз, как навсегда. Я отлаживал положение куба, и он не останавливался, чтобы спуститься.

С Slick2D DebugDraw это не помогает, потому что куб проходит по земле в любом случае.
Обратите внимание, что в JBox2D он работал с измерениями пикселей (это было неточно, но коллизии хорошо работали)

ответ

0

Это было из-за отрицательного размера. (toPoxY reverse the y pos)

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