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
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; } |
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 habenDie Positionen bleiben trotzdem gleich, man ändert ja auch nur ein paar Werte.
Mastermind
unregistriert
Also Box2D arbeit mit den Einheiten Meter-Kilogramm und noch irgendwas 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.
ja, hast Recht. Müsste sogar, wenn ich mich nicht irre, mit der Funktion void sf::View:etSize(const Vector2f & size) gehen und die sf::View natrülich auf des RenderWindow anwenden.Also Box2D arbeit mit den Einheiten Meter-Kilogramm und noch irgendwas 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.
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; } |
Mastermind
unregistriert
Werbeanzeige