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

29.11.2011, 22:50

Box2D: Box fällt nicht

Hallo!
Ich wollte das Hallo-Welt-Programm von Box2D nur mit Hilfe der Auflistung der Funktionen erarbeiten und dies auch weiterführen.
Nun kann ich den Fehler, trotz dessen ich sogar doch in der Schritt-Für-Schritt-Anleitung nachschaute, nicht finden.
Die Werte bleiben immer gleich. Ermittelt wird dies mithilfe der Ausgabe in der Konsole.
Jede einzelne Zeile habe ich überprüft, aber ich finde es nicht. Wahrscheinlich ein Flüchtigkeitsfehler?
Könnt ihr mal gucken? :)

C-/C++-Quelltext

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
#include <Box2D\Box2D.h>
#include <iostream>
#include <SFML\Graphics.hpp>

int main()
{
    sf::RenderWindow RenderApp(sf::VideoMode(800, 600, 32), "SFML Graphics", sf::Style::Default);
    b2World B2world(b2Vec2(0, -9.8));
    //Boden//
    b2BodyDef bd;
    bd.position.Set(0, -10);
    b2Body *ground = B2world.CreateBody(&bd);
    b2PolygonShape B2_GROUNDPOLYGON;
    B2_GROUNDPOLYGON.SetAsBox(50, 10);
    ground->CreateFixture(&B2_GROUNDPOLYGON, 0.0f);
    //Boden//
    
    //Rectangle//
    b2BodyDef bd2;
    bd2.position.Set(300.f, 25.f);
    bd2.angle = 266;
    bd2.type = b2_dynamicBody;
    b2Body *rectangle = B2world.CreateBody(&bd2);
    
    b2PolygonShape B2_RECTANGLE;
    B2_RECTANGLE.SetAsBox(5.f, 5.f);
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &B2_RECTANGLE;
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;
    rectangle->CreateFixture(&fixtureDef);
    //Rectangle//

    //Rec//
    sf::Shape rec = sf::Shape::Rectangle(sf::FloatRect(0, 0, 50, 50), sf::Color(255, 0, 0, 120), 0.5f, sf::Color(255, 0, 0, 255));
    sf::Shape groundShape = sf::Shape::Rectangle(sf::FloatRect(0, 0, 1200, 800), sf::Color(0, 255, 0, 50), 1.0f, sf::Color(0, 255, 0, 255));
    //Rec//

    groundShape.SetPosition(0, 575);

    while(RenderApp.IsOpened())
    {
        if(sf::Keyboard::IsKeyPressed(sf::Keyboard::Escape))
            RenderApp.Close();

        B2world.Step(1/60, 6, 2);
        rec.SetPosition(rectangle->GetPosition().x, rectangle->GetPosition().y);
        rec.SetRotation(rectangle->GetAngle());
        std::cout << rectangle->GetPosition().x << "  " << rectangle->GetPosition().y << "  " << rectangle->GetAngle() << std::endl;

        RenderApp.Clear();
        RenderApp.Draw(rec);
        RenderApp.Draw(groundShape);
        RenderApp.Display();
    }
    return 0;
}



MfG
Check

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

2

30.11.2011, 13:58

Also Box2D arbeit mit den Einheiten Meter-Kilogramm und noch irgendwas :D und dein sfml programm arbeitet mit pixel und deshalb solltest du einen Faktor mit deinen Positionen multiplizieren.
Ich hab z.b. 100 Pixel = 1 Meter gemacht dann multiplizierst du jede deiner Box2D Positionen mit 0.01 und wenn du deine sfml sprite position setzt musst du halt mit die Box2d Body-Position mit 100 multiplizieren, dann sollte es gehen.

Edit: und sfml setRotation will die Rotation in Grad und deine Box2D Rotationen, die du zurück bekommst sind in Radians, also solltest du die auch umwandeln.
New Project: Operation CityRacer

3

30.11.2011, 14:34

Die Positionen bleiben trotzdem gleich, man ändert ja auch nur ein paar Werte. Trotzdem habe ich deinen Vorschlag umgesetzt.
Doch herunterfallen tut sie, wie erwähnt, leider immer noch nicht.

MfG
Check

PS: Rad in Grad wäre in diesem Falle doch (3/2*3.141)*(rectangle->GetAngle()/3.141), oder?

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

4

30.11.2011, 14:56

Die Positionen bleiben trotzdem gleich, man ändert ja auch nur ein paar Werte.
Das Problem wäre halt dann gewesen dass sich dein Sprite wegen der geringen Gravitation alle 10 Sekunden um vllt. ein pixel oder so bewegt hätte, das war bei mir der Fehler, und das mit dem Faktor solltest du nicht nur auf die Position machen, sondern auch auf die Größen der Boxen, da jetzt vllt. sein kann, dass die 2 Objekte sich verhackt haben

Ich hab jetzt eigentlich sonst keinen Fehler gesehn.

Von Rad in Grad kannst du einfach mit 57,295 multiplizieren ansonsten halt grad = rad*(180/pi) (wenn ich mich nicht irre)
New Project: Operation CityRacer

Mastermind

unregistriert

5

30.11.2011, 15:06

Also Box2D arbeit mit den Einheiten Meter-Kilogramm und noch irgendwas :D und dein sfml programm arbeitet mit pixel und deshalb solltest du einen Faktor mit deinen Positionen multiplizieren.
Ich hab z.b. 100 Pixel = 1 Meter gemacht dann multiplizierst du jede deiner Box2D Positionen mit 0.01 und wenn du deine sfml sprite position setzt musst du halt mit die Box2d Body-Position mit 100 multiplizieren, dann sollte es gehen.

Edit: und sfml setRotation will die Rotation in Grad und deine Box2D Rotationen, die du zurück bekommst sind in Radians, also solltest du die auch umwandeln.


Ich meine doch mich zu erinnern dass es mit SFML relativ einfach möglich war von Pixeln zu abstrhieren und mit Einheite zu arbeiten was ja auch nur sinnvoll ist. Ich glaube die Views ermöglichen das. Ist aber mehr als ein Jahr her, dass ich da was mit gemacht habe.

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

6

30.11.2011, 15:21

Also Box2D arbeit mit den Einheiten Meter-Kilogramm und noch irgendwas :D und dein sfml programm arbeitet mit pixel und deshalb solltest du einen Faktor mit deinen Positionen multiplizieren.
Ich hab z.b. 100 Pixel = 1 Meter gemacht dann multiplizierst du jede deiner Box2D Positionen mit 0.01 und wenn du deine sfml sprite position setzt musst du halt mit die Box2d Body-Position mit 100 multiplizieren, dann sollte es gehen.

Edit: und sfml setRotation will die Rotation in Grad und deine Box2D Rotationen, die du zurück bekommst sind in Radians, also solltest du die auch umwandeln.


Ich meine doch mich zu erinnern dass es mit SFML relativ einfach möglich war von Pixeln zu abstrhieren und mit Einheite zu arbeiten was ja auch nur sinnvoll ist. Ich glaube die Views ermöglichen das. Ist aber mehr als ein Jahr her, dass ich da was mit gemacht habe.
ja, hast Recht. Müsste sogar, wenn ich mich nicht irre, mit der Funktion void sf::View::SetSize(const Vector2f & size) gehen und die sf::View natrülich auf des RenderWindow anwenden.
New Project: Operation CityRacer

7

30.11.2011, 15:34

Also, es schaut nun so aus:

C-/C++-Quelltext

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
#include <Box2D\Box2D.h>
#include <iostream>
#include <SFML\Graphics.hpp>

int main()
{
    sf::RenderWindow RenderApp(sf::VideoMode(800, 600, 32), "SFML Graphics", sf::Style::Default);
    b2World B2world(b2Vec2(0.f, -9.8f));
    B2world.SetAllowSleeping(false);
    //Boden//
    b2BodyDef bd;
    bd.position.Set(0.f, -0.1f);
    b2Body *ground = B2world.CreateBody(&bd);
    b2PolygonShape B2_GROUNDPOLYGON;
    B2_GROUNDPOLYGON.SetAsBox(12, 8);
    ground->CreateFixture(&B2_GROUNDPOLYGON, 0.0f);
    //Boden//
    
    //Rectangle//
    b2BodyDef bd2;
    bd2.position.Set(3.f, 0.25f);
    bd2.angle = 266;
    bd2.type = b2_dynamicBody;
    b2Body *rectangle = B2world.CreateBody(&bd2);
    
    b2PolygonShape B2_RECTANGLE;
    B2_RECTANGLE.SetAsBox(0.5f, 0.5f);
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &B2_RECTANGLE;
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;
    rectangle->CreateFixture(&fixtureDef);
    //Rectangle//

    //Rec//
    sf::Shape rec = sf::Shape::Rectangle(sf::FloatRect(0, 0, 50, 50), sf::Color(255, 0, 0, 120), 0.5f, sf::Color(255, 0, 0, 255));
    sf::Shape groundShape = sf::Shape::Rectangle(sf::FloatRect(0, 0, 1200, 800), sf::Color(0, 255, 0, 50), 1.0f, sf::Color(0, 255, 0, 255));
    //Rec//

    groundShape.SetPosition(0, 575);

    while(RenderApp.IsOpened())
    {
        if(sf::Keyboard::IsKeyPressed(sf::Keyboard::Escape))
            RenderApp.Close();

        B2world.Step(1/60, 6, 2);
        rec.SetPosition(rectangle->GetPosition().x*100, rectangle->GetPosition().y*100);
        rec.SetRotation((3/2*3.141f)*(rectangle->GetAngle()/3.141f));
        std::cout << rectangle->GetPosition().x << "  " << rectangle->GetPosition().y << "  " << rectangle->GetAngle() << std::endl;
        

        RenderApp.Clear();
        RenderApp.Draw(rec);
        RenderApp.Draw(groundShape);
        RenderApp.Display();
    }
    return 0;
}


Durch die Ausgabe über cout ist klar erkennbar, dass die Werte immer noch gleich bleiben.
Ich finde den Fehler nicht. ;(

MfG
Check

Mastermind

unregistriert

8

30.11.2011, 15:59

setzt du irgendwo die Masse von deinem Rectangle? Physikengines brauchen das normalerweise.
Denity sollte das wohl erledigen.

9

30.11.2011, 17:22

Density = Dichte

MfG
Check

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

10

01.12.2011, 12:32

ich habs jetzt mal bei mir getestet, da ich gerade auch mit box2d arbeite und hab echt auch nichts gefunden und nach langem Nachdenken bin ich darauf gekommen, dass 1/60 immer null ergibt weil es ne Integer Division ist, also 1.0f/60.0f dann MUSS es funktionieren.
New Project: Operation CityRacer

Werbeanzeige