Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

1

26.03.2017, 17:18

[Java] LibGDX Render-Problem

Hallo,

die Ausgangssituation: Bei unserem Spiel soll ein Spieler gezeichnet werden (inkl. Box2D-Kollisionserkennung).
das Problem: Der Box2D-Debugrenderer rendert den Spieler an die richtige Position. Allerdings ist das dazugehörige Sprite an einer anderen Position, als der Box2D-Body.

Bild:


Code:

[Renderer]

Quellcode

1
2
3
4
5
6
7
8
9
10
11
//Draw the player
batch.begin();
batch.draw(game.getPlayer().getSprite(), game.getPlayer().getSprite().getX(), game.getPlayer().getSprite().getY(), game.getPlayer().getSprite().getOriginX(),
        game.getPlayer().getSprite().getOriginY(), game.getPlayer().getSprite().getWidth(), game.getPlayer().getSprite().getHeight(),
        game.getPlayer().getSprite().getScaleX(), game.getPlayer().getSprite().getScaleY(), game.getPlayer().getSprite().getRotation());
batch.end();
        
//Draw Box2D collision shapes
debugRenderer.render(game.getWorld(), cam.combined);
        
batch.setProjectionMatrix(cam.combined);


[GameScreen]

Quellcode

1
2
3
4
5
6
7
8
9
10
@Override
public void render(float delta) {           
        player.update(delta);
        
    //Move camera to player position
    renderer.getCam().translate(player.getMovement().x*Gdx.graphics.getDeltaTime(), player.getMovement().y*Gdx.graphics.getDeltaTime(), 0);
    renderer.getCam().update();     
        
    renderer.render(delta);
}


[Player]

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class Player{
    private Texture tex;
    private Vector2 movement;
    private float speed;
    private Sprite sprite;
    private Body b2Body;

    
    public Player(GameScreen game) {
        tex = new Texture("smiley.png");
        movement =  new Vector2(0,0);
        speed = 300;
        
        sprite = new Sprite(tex);
        sprite.setScale(0.3f);
        
        sprite.setX(game.getRenderer().getCam().position.x);
        sprite.setY(game.getRenderer().getCam().position.y);
            
        //B2D
        BodyDef bdef = new BodyDef();
        bdef.type = BodyDef.BodyType.DynamicBody;
        b2Body = game.getWorld().createBody(bdef);
        
        CircleShape shape = new CircleShape();
        shape.setRadius(sprite.getWidth()*sprite.getScaleX()/2);
        
        FixtureDef fdef = new FixtureDef();
        fdef.shape = shape;

        b2Body.createFixture(fdef);
    }
    
    public void update(float dt) {
        sprite.setPosition(sprite.getX() + movement.x * dt, sprite.getY() + movement.y * dt);
        b2Body.setTransform(sprite.getX(), sprite.getY(), sprite.getRotation());
    }
    
    public Sprite getSprite() {
        return sprite;
    }
    
    public float getSpeed() {
        return speed;
    }
    
    public Vector2 getMovement() {
        return movement;
    }

    public void setSpeed(float speed) {
        // TODO Automatisch generierter Methodenstub
        this.speed = speed;
    }
    
    public void setMovement(Vector2 movement) {
        this.movement = movement;
    }
}


Wo ist der Fehler?
Vielen Dank im Voraus.

2

26.03.2017, 17:28

Klingt nach einem Skalierungsproblem.

Und nicht dein player kontrolliert box2d. Du benutzt setTransform. Sondern box2d kontrolliert nun die Position des Spielers.

Sprich du verwendet box2d komplett falsch. Siehe deine player update methode.

Die movement deltas bekommt dein body in Sinne einer linearVelocity. Oder du kannst force verwenden. Und du must dann von deinem body dann die Position nehmen und in der update Methode in deine sprite Position update. Und nicht andersrum.

Deine update Methode ist auf jeden Fall sehr quer. Les dir lieber nochmal durch wie man box2d verwendet.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TypeOverride« (26.03.2017, 17:35)