2017-07-04 2 views
0

Je suis en train de revisiter la programmation du jeu LibGDX et je suis malheureusement obligé de réapprendre des choses que je connaissais. J'utilise actuellement Tiled Map Editor pour créer un niveau très simple de style Donkey Kong. J'ai environ 20 rectangles au total pour le niveau.LibGDX/Box2d - un seul rectangle est en cours de rendu par debugrenderer

J'ai créé un monde box2d dans ma classe GameScreen principale et ai une boucle for pour amener les objets rectangle dans le monde et debugrenderer. Mon problème est que seul le rectangle inférieur (et le premier) que j'ai dessiné apparaît. J'ai vérifié l'échelle, aussi j'ai mis un println() qui me dit que l'information de l'objet a été analysée avec tous les rectangles info corrects (ie les rectangles x, y, w, h valeurs) mais comme je le dis, un seul rectangle montre sur le débugrenderer.

Je viens de rentrer dans la programmation après environ 6 mois de pause et j'espère avoir manqué quelque chose de simple. Le même code dans mes anciens projets fonctionne toujours bien car j'en ai testé quelques-uns.

Voici mon code, toute aide est massivement appréciée. Merci

public class GameScreen implements Screen { 
    SpriteBatch spriteBatch; 
    OrthographicCamera cam; 
    Viewport v; 

    TmxMapLoader mapLoader; 
    TiledMap map; 
    OrthogonalTiledMapRenderer mapRenderer; 

    World world; 
    Box2DDebugRenderer b2dr; 
    float mapScale = 10f/140f; 

    public GameScreen(){ 
     spriteBatch = new SpriteBatch(); 
     cam = new OrthographicCamera(); 
     v = new FitViewport(Constants.V_WIDTH, Constants.V_HEIGHT, cam); 
     cam.setToOrtho(false, v.getWorldWidth(), v.getWorldHeight()); 

     mapLoader = new TmxMapLoader(); 
     map = mapLoader.load("level1.tmx"); 
     mapRenderer = new OrthogonalTiledMapRenderer(map, mapScale); 

     world = new World(new Vector2(0,-9.8f), true); 
     b2dr = new Box2DDebugRenderer(); 

     // box2d local variables 
     BodyDef bdef = new BodyDef(); 
     PolygonShape shape = new PolygonShape(); 
     FixtureDef fdef = new FixtureDef(); 
     Body body; 

     // create platform object rectangles 
     for (MapObject object : map.getLayers().get(2).getObjects().getByType(RectangleMapObject.class)){ 
      Rectangle rect = ((RectangleMapObject)object).getRectangle(); 

      bdef.type = BodyDef.BodyType.StaticBody; 
      bdef.position.set(rect.getX() + rect.getWidth()/2 * mapScale, rect.y + rect.getHeight()/2 * mapScale); 

      body = world.createBody(bdef); 

      shape.setAsBox(rect.getWidth()/2 * mapScale, rect.getHeight()/2 * mapScale); 
      fdef.shape = shape; 

      body.createFixture(fdef); 

     } 
    } 

    @Override 
    public void show() { 

    } 

    @Override 
    public void render(float delta) { 
     update(delta); 
     clearScreen(); 
     draw(); 
    } 

    public void update(float dt){ 
     mapRenderer.setView(cam); 
    } 

    public void clearScreen(){ 
     Gdx.gl.glClearColor(1, 0, 0, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    } 

    public void draw(){ 
     spriteBatch.setProjectionMatrix(cam.combined); 
     mapRenderer.render(); 
     b2dr.render(world, cam.combined); 

     spriteBatch.begin(); 

     spriteBatch.end(); 
    } 

    @Override 
    public void resize(int width, int height) { 
     v.update(width, height); 
    } 

    @Override 
    public void pause() { 

    } 

    @Override 
    public void resume() { 

    } 

    @Override 
    public void hide() { 

    } 

    @Override 
    public void dispose() { 
     spriteBatch.dispose(); 
    } 
} 

Répondre

0

Désolé pour perdre votre temps ici. J'ai réparé ceci.

C'était juste que je n'avais pas appliqué l'échelle de la carte aussi aux x, y des rectangles. Donc, je change une ligne comme ça, et maintenant cela fonctionne:

bdef.position.set(rect.getX() * mapScale + rect.getWidth()/2 * mapScale, rect.y * mapScale + rect.getHeight()/2 * mapScale);