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

1

20.03.2016, 15:37

[Box2d + SMFL] SFML Sprite sitzt nicht auf Box2d Koordinaten

Guten tach,

ich arbeite imoment mit Box2d und SFML. Allerdings schein ich ein Scale problem zu haben. weiß aber nicht wie ich es umsetzen soll.
Es sollen 2 Boxen in Box2d erstellt werden, aufdiese ich dann ein Sprite von SFML lege.
Nun "fahre" ich mit der Charakter-Box gegen die Wall-Box. Dabei fällt mir jedoch auf, dass der Colider um exakt 64 Pixel in Richtung oberer linker Bildschirmecke verschoben ist.
Das problem scheint jedoch nur bei der Wall-Box der Fall zu sein, obwohl es sich um die gleiche Klasse und Initialisierung handelt.

Erzeugung der Boxen

C-/C++-Quelltext

1
2
Charakter = new CBody_Sprite("Data/128.png", 200, 300, 128, 128, b2BodyType::b2_dynamicBody, World);
Wall = new CBody_Sprite("Data/256.png", 400, 300, 256, 256, b2BodyType::b2_staticBody, World);


Init der Boxen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CBody_Sprite::CBody_Sprite(const std::string Path, const unsigned short posX, const unsigned short posY, const unsigned short sizeW, const unsigned short sizeH, b2BodyType type, b2World * World)
{
    
    bodyDef.fixedRotation = true;
    bodyDef.type = type;

    bodyDef.position.Set(posX, posY);
    //bodyDef.position.Set(posX + 64, posY + 64); //mit +64 scheint es zu Funktionieren

    box.SetAsBox((sizeW / 2), (sizeH / 2), b2Vec2(0, 0), 0);
     

    body = World->CreateBody(&bodyDef);
    body->CreateFixture(&box, 0);

    Texture.loadFromFile(Path);
    Sprite.setTexture(Texture);
    Sprite.setPosition(posX, posY);

}


Was ich nur sehr komisch finde ist, dass sobald ich +64 an die Position aufrechne, warum dann der Colider des Charakters nicht verrückt spielt? :pillepalle:
Koords habe ich schon 1000x geprüft. Jeweil die SFML als auch die Box2d Koords behaupten aufeinander zu liegen. Jedoch ist nur das SFML Sprite auch auf der Richtigen Posi.

Bild im Anhang!

Mfg Urprimat
»Urprimat« hat folgendes Bild angehängt:
  • Unbenannt.png
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

2

20.03.2016, 16:53

Caution
Box2D is tuned for MKS units. Keep the size of moving objects roughly between 0.1
and 10 meters. You'll need to use some scaling system when you render your
environment and actors. The Box2D testbed does this by using an OpenGL viewport
transform. DO NOT USE PIXELS.


Vielleicht liegt es daran, sonst sehe ich erstmal nix.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

3

23.03.2016, 17:10

Hey,
OK ich werd mal versuchen die ganzen Objekte zu Skalieren.
Wenn ich das richtig verstehe sollen die Objekte nicht zu groß sein?

Sollte machbar sein. Ich melde mich dann wieder

MFG Urprimat
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

4

23.03.2016, 19:29

Wenn ich das richtig verstehe sollen die Objekte nicht zu groß sein?

Ja die Box2d Objekte. Wenn SFML 100 px groß ist soll das Box2d-Object z.B. nur 10 px großsein (oder auch eine andere Skalierung).
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

23.03.2016, 22:09

Eine Box2D Einheit entspricht 1 Meter. Versuch dich in etwa daran zu richten. Das macht die Entwicklung etwas einfacher. Erst bei Objekten welche sich extrem schnell bewegen kann das Probleme bereiten. Da kann es dir halt passieren dass sich Objekte durcheinander durch bewegen ohne dass Box2D das bemerkt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

6

24.03.2016, 15:06

Hey,
Habe gerade kleinere Objekte eingefügt und es Funktioniert.
Werde nun alles Skalieren und dann sollte das laufen!

Vielen Dank ;)
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

7

24.03.2016, 17:11

hmm,
ich verstehe die Welt nicht mehr.
Setze ich kleinere Objekte ein zb SetAsBox(4,4), also eine 8x8 Box, Funktioniert alles super.

Jetzt wollte ich ein Skaliersystem einbauen. Jedoch ist es genau so fehlerhaft wie davor.

C-/C++-Quelltext

1
2
    Charakter = new CBody_Sprite("Data/128.png", 200, 300, 128, 128, b2BodyType::b2_dynamicBody, World);
    test = new CBody_Sprite("Data/256.png", 400, 300, 256, 256, b2BodyType::b2_staticBody, World);


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CBody_Sprite::CBody_Sprite(const std::string Path, const float posX, const float posY, const unsigned short sizeW, const unsigned short sizeH, b2BodyType type, b2World * World)
{
    
    bodyDef.fixedRotation = true;
    bodyDef.type = type;
    bodyDef.position.Set(posX / SCALE  , posY / SCALE);
    
    box.SetAsBox(((sizeW / 2) / SCALE ),((sizeH / 2) / SCALE), b2Vec2(0, 0), 0);

    body = World->CreateBody(&bodyDef);
    body->CreateFixture(&box, 0);

    Texture.loadFromFile(Path);
    Sprite.setTexture(Texture);
    Sprite.setPosition(body->GetPosition().x * SCALE, body->GetPosition().y * SCALE);
}


Was mache ich falsch?
bentuze ich für beide Sprites das 128x128 bild Funktioniert es jedoch wieder!

hat jemand Rat?
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

8

24.03.2016, 19:09

Box2d = sfml / Scale
Sfml = box2d * Scale

Aber box2d / Scale != sfml * scale

Edit: habe jetzt erst gesehen das die Pos vom Body holst, das wäre natürlich richtig. Nimm doch mal direkt posX und posY für die Sfml werte.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

9

27.03.2016, 19:22

Hmm,

Ich denke, dass das nicht das Problem ist.
Das SFML-Sprite liegt ja korrekt. Nur der Kolider ist ja versetzt.

Hast du ne idee?
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

10

27.03.2016, 23:13

Vielleicht ist Dein Sprite nicht richtig ausgerichtet, bei der Fixture liegt der Bezug für die Position imo mittig.

Werbeanzeige