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

11

04.11.2011, 21:03

Ich experimentiere hier schon seit etwa 1Std. rum, aber kriege es trotzdessen immer noch nicht hin.
Ich bitte um Hilfe bei der Kollision zwischen Brett und Ball!
Was mache ich falsch? Hier der Code:

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
89
90
#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(RectAll(ball).Bottom >= RectAll(bar2).Top)
{
  Yspeed = -150;
}
if(RectAll(ball).Top <= RectAll(bar).Bottom)
{
  Yspeed = 150;
}

app.Clear();
app.Draw(bar);
app.Draw(bar2);
app.Draw(ball);
app.Display();
}
return EXIT_SUCCESS;
}
Only God can judge me.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »denniro« (04.11.2011, 21:13)


12

04.11.2011, 21:15

Ich hab mir zwar deinen Code jetzt nicht angeschaut, aber: Es gibt dafür in der SFML sf::Rect<T>::Intersects, ansonsten gibt's im Wiki ein schönes Beispiel.

13

04.11.2011, 21:28

Ich hab mir zwar deinen Code jetzt nicht angeschaut, aber: Es gibt dafür in der SFML sf::Rect::Intersects, ansonsten gibt's im Wiki ein schönes Beispiel.
Danke erstmal für die Antwort, jedoch gibt es ein Problem, ich verstehe nichts vom beiden, kann sich jemand etwas Zeit nehmen und mir das in einem informativen Text näher bringen ? Wäre sehr hilfreich ;)
Only God can judge me.

14

04.11.2011, 21:33

Was genau verstehst Du denn nicht? Die Überprüfung an sich oder die Umsetzung als Code? Bei ersterem könnte es Dir helfen, einfach eine Skizze zu zeichnen und die Abfrage dort mal durchzugehen. Sofern Du das Buch "C++ für Spieleprogammierer" besitzt, kannst Du auch im Kapitel des Spaceshooters nachschauen, da wird das auch beschrieben.

Die "Intersects"-Methode von sf::Rect prüft, ob sich zwei Rects überschneiden, wenn ja, wird true zurückgegeben, ansonsten false. Übergeben musst Du der Methode nur ein Rect. Wenn Du beispielsweise SpielerRect.Intersects() aufrufst, so übergibst Du das Rect des Balles.

15

04.11.2011, 21:40

Was genau verstehst Du denn nicht? Die Überprüfung an sich oder die Umsetzung als Code? Bei ersterem könnte es Dir helfen, einfach eine Skizze zu zeichnen und die Abfrage dort mal durchzugehen. Sofern Du das Buch "C++ für Spieleprogammierer" besitzt, kannst Du auch im Kapitel des Spaceshooters nachschauen, da wird das auch beschrieben.

Die "Intersects"-Methode von sf::Rect prüft, ob sich zwei Rects überschneiden, wenn ja, wird true zurückgegeben, ansonsten false. Übergeben musst Du der Methode nur ein Rect. Wenn Du beispielsweise SpielerRect.Intersects() aufrufst, so übergibst Du das Rect des Balles
Ich weiß/kenne die Logik, aber die Umsetzung als Code, da habe ich ein riesiges Fragezeichen. Vielleicht könntest du ja Postschnipsel posten :S
Only God can judge me.

16

04.11.2011, 21:47

Den gesamten Code gibt's im Grunde ja schon auf der Wiki-Seite. ;)

17

04.11.2011, 21:49

---
Only God can judge me.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »denniro« (04.11.2011, 22:47)


Werbeanzeige