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

Saik0

Treue Seele

  • »Saik0« ist der Autor dieses Themas

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

1

21.09.2011, 12:47

[SFML]Kollisionspunkt am rechten Fensterrand ermitteln

Hallo zusammen,

ich arbeite mich seit paar Tagen in SFML ein. Habe auch schon einige Tutorials etc. durch gearbeitet und angefangen einen kleinen Pong-Klon zu schreiben. Für das Spiel habe ich Grafiken für den Ball und den Balken erstellt und diese als Sprite eingebunden. Danach habe ich die Bewegung des Balken implementiert. Das Verhalten des Balkens habe ich so programmiert, dass man diesen nicht über den Rand hinaus bewegen kann.

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
float elapsedTime = window.GetFrameTime();

    //der Balken darf nur nach links und rechts bewegt werden.
        if(window.GetInput().IsKeyDown(sf::Key::Left)) {
                //Prüfe, ob der Balken die linke Seite des Fensters erreicht hat und stoppe
                //die Bewegung.
                float left_x = s_balken.GetPosition().x;
                if(left_x > -0) {
                        s_balken.Move(-300 * elapsedTime, 0);
                }
        }

        if(window.GetInput().IsKeyDown(sf::Key::Right)) {

                //das selbe für die rechte seite.
                float right = window.GetDefaultView().GetRect().Right - 150;
                if(s_balken.GetPosition().x <= right) {
                        s_balken.Move(300 * elapsedTime, 0);
                }
        }


Das ganze funktioniert soweit auch aber der Code bzw. der Vorgang für die Rechte Seite ist etwas unschön. Für den Linken Fensterbereich reicht es, dass ich prüfe, ob der Balken bis zur Position -0 gekommen ist. Mir stellt sich jetzt nur die Frage, ob es eine bessere Möglichkeit gibt, die exakte Position des rechten Fensterbereiches zu ermitteln, anstatt auf ungefairen Werten basierend wie in dieser Zeile:

C-/C++-Quelltext

1
float right = window.GetDefaultView().GetRect().Right - 150;


Hat da jmd eine Idee?

grüße
Saik0

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

21.09.2011, 12:56

du erzeugst dein SFML-Window mit übergabe der Größe. Diese kannst du doch in Konstanten auslagern und diese bei der Kollision wiederverwenden. Selbiges kannst du für deine Paddlegrößen machen :)

Saik0

Treue Seele

  • »Saik0« ist der Autor dieses Themas

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

3

21.09.2011, 13:15

Ach verdammt. An Konstanten habe ich jetzt nicht gedacht ^^ Danke für den Tipp

grüße
Saik0

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

21.09.2011, 13:38

Jap verwende sie Ruhig extensiv. Allein wenn du dein Scenario bedenkst: möchtest du die Werte wie Fenstergröße und Paddelgröße variabel halten, so musst du aus den Konstanten nur Variablen machen und die restliche Logik funktioniert - Frage ist natürlich, wo man die Variablen hintut. Wenn du aber die Deklaration der Konstanten entfernst, wird dir der Compiler sagen, wo was fehlt ;)

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

5

21.09.2011, 14:21


Das ganze funktioniert soweit auch aber der Code bzw. der Vorgang für die Rechte Seite ist etwas unschön. Für den Linken Fensterbereich reicht es, dass ich prüfe, ob der Balken bis zur Position -0 gekommen ist. Mir stellt sich jetzt nur die Frage, ob es eine bessere Möglichkeit gibt, die exakte Position des rechten Fensterbereiches zu ermitteln, anstatt auf ungefairen Werten basierend wie in dieser Zeile:

C-/C++-Quelltext

1
float right = window.GetDefaultView().GetRect().Right - 150;



Aus welchem Grund sollte das ein ungefairer Wert sein? Das ist genau der Wert den du suchst.
Es geht allerdings auch einfacher. Es gibt die Funktion sf::RenderWindow::GetWidth(), welche dir die Breite deines Fensters liefert. Konstanten sind ja schön und gut, aber man muss sie nicht verwenden, wenn man sie nicht braucht. Und diese Funktion liefert dir nichts anderes als den Wert, den du in einer Konstante speichern würdest.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

21.09.2011, 14:28

Zitat

ungefairer Wert

Absicht? :D
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Saik0

Treue Seele

  • »Saik0« ist der Autor dieses Themas

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

7

21.09.2011, 14:39

Aus welchem Grund sollte das ein ungefairer Wert sein? Das ist genau der Wert den du suchst.
Es geht allerdings auch einfacher. Es gibt die Funktion sf::RenderWindow::GetWidth(), welche dir die Breite deines Fensters liefert. Konstanten sind ja schön und gut, aber man muss sie nicht verwenden, wenn man sie nicht braucht. Und diese Funktion liefert dir nichts anderes als den Wert, den du in einer Konstante speichern würdest.

ungefähr, weil ich eben nicht sicher sein kann, dass dieser Wert exakt ist. z.B wenn sich das Fenster vergrößern würde etc. Die -150 sind nur durchs ausprobieren zu stande gekommen. Die von dir beschriebende Funktion ist genau das was mir am besten gefällt ^^ Werde es heute Abend ausprobieren und mich dann an die Bewegung, Kollision des Balls etc. ran wagen und die Funktionsreferenzen etwas genauer studieren.

Zitat

ungefairer Wert

Absicht? :D

Absicht haha :D

grüße
Saik0

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

8

21.09.2011, 14:59

Niemals könnte mir so etwas versehentlich passieren, ganz sicher nicht... ;)

Bzgl. der 150.0f. Dein Spriteursprung ist schätzungsweise in der linken oberen Ecke des Schlägersprites. Deswegen musst du natürlich von der Breite des Fensters, die Breite des Schlägers abziehen, um zu verhindern, dass der Schläger sich aus dem Bildschirmbereich bewegt.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Fred« (21.09.2011, 15:54)


Werbeanzeige