2017-07-04 2 views
0

gerendert Ich erneuten Besuch LibGDX Spiele-Programmierung und ich leider habe Sachen wieder zu lernen, ich kannte.Libgdx/Box2D - nur ein Rechteck von debugrenderer wird

Ich verwende derzeit Tiled Map Editor, um eine sehr einfache Donkey Kong Stilstufe zu erstellen. Ich habe ungefähr 20 Rechtecke für das Level.

Ich habe eine Box2D-Welt in meiner Haupt-GameScreen-Klasse erstellt und habe eine for-Schleife, um die Rechteck-Objekte in die Welt und den DebugRenderer zu bekommen.

Mein Problem ist, dass nur das untere (und erste) Rechteck, das ich gezeichnet habe, angezeigt wird. Ich habe die Waage überprüft, auch habe ich ein println(), die mir die Objektinformationen erzählt hat mit allen Rechtecken Informationen korrekt zeigen analysiert wurde (dh. Die Rechtecken x, y, w, h-Werte), aber wie gesagt, nur ein Rechteck zeigt auf dem DebugRenderer.

Ich bin gerade wieder in Programmierung nach ca. 6 Monaten Pause und so hoffe ich, ich habe etwas Einfaches verpasst. Derselbe Code in meinen alten Projekten funktioniert immer noch gut, da ich einige getestet habe.

Hier ist mein Code, jede Hilfe wird massiv geschätzt. Danke

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

Antwort

0

Entschuldigung für Zeitverschwendung hier. Ich habe das behoben.

Es war nur, dass ich die Skala der Karte nicht auch auf die x, y der Rechtecke angewendet hatte. So ändern i eine Zeile wie so, und jetzt funktioniert es:

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