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 |
if(Collision::BoundingBoxTest(ball, bar)) { Yspeed = 150.f; } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »denniro« (07.11.2011, 16:32)
Der Code oben ist richtig, falls es sich bei ball und bar um sf:prites handelt.
Ich vermute aber, dass du die Collision Klasse einfach falsch eingebunden hast und die Funktion daher nicht bekannt ist.
Lg
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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
#include <iostream> #include <SFML\Graphics.hpp> using namespace std; sf::FloatRect RectAll(sf::Sprite &sprite) { sf::FloatRect Rect( sprite.GetSubRect().Left, sprite.GetSubRect().Top, sprite.GetSubRect().Right, sprite.GetSubRect().Bottom); return Rect; } int main() { sf::RenderWindow app(sf::VideoMode(400, 300,32), "Pong"); sf::Image image; sf::Image image2; if(!image.LoadFromFile("bar.png")) { return EXIT_FAILURE; } if(!image2.LoadFromFile("ball.png")) { return EXIT_FAILURE; } sf::Sprite bar(image); sf::Sprite bar2(image); sf::Sprite ball(image2); bar.SetPosition(app.GetWidth() / 2 - bar.GetSize().x / 2,0); bar2.SetPosition(app.GetWidth() / 2 - bar2.GetSize().x / 2,app.GetHeight()-bar2.GetSize().y); ball.SetPosition(app.GetWidth() / 2 - 5,app.GetHeight() / 2 - 5); ball.SetScale(0.45f,0.5f); float Xspeed = 0.f; float Yspeed = 150.f; while(app.IsOpened()) { sf::Event Event; while(app.GetEvent(Event)) { if(Event.Type == sf::Event::Closed) { app.Close(); } } float ElapsedTime = app.GetFrameTime(); if (app.GetInput().IsKeyDown(sf::Key::Left) && (bar2.GetPosition().x > 0)) { bar2.Move(-100 * ElapsedTime, 0); } if (app.GetInput().IsKeyDown(sf::Key::Right) && (bar2.GetPosition().x < app.GetWidth()-bar2.GetSize().x)) { bar2.Move(+100 * ElapsedTime, 0); } if (app.GetInput().IsKeyDown(sf::Key::A) && (bar.GetPosition().x > 0)) { bar.Move(-100 * ElapsedTime, 0); } if (app.GetInput().IsKeyDown(sf::Key::D) && (bar.GetPosition().x < app.GetWidth()-bar.GetSize().x)) { bar.Move(+100 * ElapsedTime, 0); } ball.Move(Xspeed * ElapsedTime,Yspeed * ElapsedTime); if(ball.GetPosition().x < 0) { } if(ball.GetPosition().x > app.GetWidth()-ball.GetSize().x) { } if(Collision::BoundingBoxTest(ball, bar)) { Yspeed = 150.f; } app.Clear(); app.Draw(bar); app.Draw(bar2); app.Draw(ball); app.Display(); } return EXIT_SUCCESS; } |
Omg.. Wie dumm kann man nur sein, ich dachte die ganze Zeit, dass dieses Collision in SFML drin ist, also dass ich nichts anderes inkludieren muss...Was heißt denn unterstrichen? Gibt's Fehlermeldungen? Wenn ja, welche? Inkludierst Du überhaupt collision.hpp? Diese Kollisionsfunktionen sind nämlich nicht Bestandteil von SFML.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »denniro« (07.11.2011, 20:40)
Community-Fossil
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
sf::FloatRect RectAll(sf::Sprite &sprite) { sf::FloatRect Rect( sprite.GetSubRect().Left, sprite.GetSubRect().Top, sprite.GetSubRect().Right, sprite.GetSubRect().Bottom); return Rect; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
sf::FloatRect RectAll(sf::Sprite &sprite) { return sf::FloatRect(sprite.GetSubRect().Left, sprite.GetSubRect().Top, sprite.GetSubRect().Right, sprite.GetSubRect().Bottom); } |
C-/C++-Quelltext
1 2 3 4 5 6 7 8 9 sf::FloatRect RectAll(sf::Sprite &sprite) { sf::FloatRect Rect( sprite.GetSubRect().Left, sprite.GetSubRect().Top, sprite.GetSubRect().Right, sprite.GetSubRect().Bottom); return Rect; }
So funktioniert das nicht. Mit dem Subrect kannst du angeben welchen Teil des Bildes du Zeichnen willst.
Du musst das Rect mithilfe von GetPosition und GetSize berechnen.
Du kannst es übrigens auch gleich so schreiben:
C-/C++-Quelltext
1 2 3 4 5 6 7 sf::FloatRect RectAll(sf::Sprite &sprite) { return sf::FloatRect(sprite.GetSubRect().Left, sprite.GetSubRect().Top, sprite.GetSubRect().Right, sprite.GetSubRect().Bottom); }
Nun ja, das Problem ist, mit dem SubRect gibst Du quasi bei deiner Bilddatei an, welchen Ausschnitt Du nehmen (und später zeichnen) willst. In der Regel hat man bei einem 80x80 Bild dann eben ein Rect mit (0, 0, 80, 80). Beim Rect, welches Du für die Kollisionsüberprüfung brauchst, muss es sich aber auf das gesamte Fenster beziehen (also an welcher Position es anfängt und wie groß es ist), wenn Du oben genanntes Bild mit einem Sprite (Position: sf::Vector2f(100, 500)) zeichnest, dann wäre das Rect (100, 500, 80, 80).
Werbeanzeige