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

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

11

13.06.2011, 20:17

Also verstehen tue ich es jetzt danke :)
Leider weiß ich nicht wie ich das genau in den Code rein bringen soll =( Langsam glaube ich, desto mehr ich das versuche, desto dümmer werde ich >.<

Ich schreib am besten mal, was ich bisher habe:

Geschwindigkeit für Spieler: float vxPlayer, vyPlayer .. beide sind auf 0.2f gestellt
Position für Gold: float xGold, yGold;
Position für Spieler: float xSpieler, ySpieler;

Dann halt das ganze drum und dran mit der Bewegung des Spielers und dann zur Kollision folgende Zeilen:
sf::Rect<float> Spieler1(xSpieler, ySpieler, Spieler.GetWidth(), Spieler.GetHeight());
sf::Rect<float> Gold1(xGold, yGold, Gold.GetWidth(), Gold.GetHeight());

if(Spieler1.Intersects(Gold1))
{
//Ab hier fehlt mir einiges... Wie frage ich denn jetzt das ab was du mir da grafisch dargestellt hast? =/
}

Du meintest ja, dass man das mit dem zweiten Parameter der Intersects-Methode machen kann, aber ich weiß nicht genau wie ich das umsetzen soll...

Tut mir leid für meine dummen Fragen, aber ich komme einfach nicht wirklich dahinter, wie man das machen soll. Außerdem habe ich mal versucht, ob das geht, indem ich einen Text darstellen lasse, wenn es eine Kollision gab, also wenn ich in die momentane If-Abfrage einfach nur geschrieben habe: Text.SetText("KOLLISION");
Aber es kam nichts?

MAAN ich will das endlich verstehen wie man das programmiert :cursing: (sry^^)
Naja aber danke noch einmal für die grafische Darstellung :) Verstanden hab ich das jetzt auf jeden Fall, nur anwenden kann ich das noch nicht so wirklich =/
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

valentin

Treue Seele

Beiträge: 212

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

12

13.06.2011, 20:55

Nur "Text.SetText("KOLLISION"); " bringt rein garnichts. Du musst es schon noch ausgeben lassen... (App.Draw(Text);)
@ Topic: Ich weiss nichtmehr, was es noch mehr anzufügen gibt. Ansonsten kannst du auch prüfen, ob der Spieler das Gold im nächsten Schritt berührt, und dann stehenbleiben. Dann musst du den Spieler nicht zurücksetzten...

Btw: Das da

Koordinaten der linken, oberen Ecke sowie die Größe (Breite, Höhe) deines Rechtecks.

ist falsch. Du musst die Koordinaten von Links, von Oben, von Rechts und von unten angeben. Vielleicht lags daran.
visit me on deviantArt!
http://v-alentin.deviantart.com/

There is no programming language, no matter how structured, that will prevent programmers from making bad programs. //Larry Flon

13

13.06.2011, 20:59

Hey,

so sollte es eigentlich funktionieren, habe den Code aber noch nicht getestet.

Ich habe die Bewegung des Spielers außerdem mal in einem sf::Vector2 zusammengefasst. Das ist eigentlich nichts anderes als deine zwei float-Variablen. Nur halt das sie in einem Objekt zusammengefasst sind.

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
sf::Vector2<float> Bewegung(0.2f, 0.2f);
sf::Rect<float> Spieler1(xSpieler, ySpieler, Spieler.GetWidth(), Spieler.GetHeight());
sf::Rect<float> Gold1(xGold, yGold, Gold.GetWidth(), Gold.GetHeight());

sf::Rect<float>* intersection = null;  // Hier der Zeiger, der nach dem Aufruf der Intersects()-Methode auf das "Überlagerungs-Rect" zeigt.

if(Spieler1.Intersects(Gold1, intersection))
{
     if(intersection.GetWidth() >= intersection.GetHeight())  // Breite und Höhe des "Überlagerungs-Rect" geben an, wie weit Spieler1 und Gold1 sich überlagern.
     {
          // Die Funktion Offset bewegt ein Rect relativ zur Position.
          // Bewegung.x / abs(Bewegung.x) ermittelt das Vorzeichen von Bewegung.x und multipliziert mit -1 ergibt sich die Richtung für die Korrektur
          Spieler1.Offset(-1 * Bewegung.x / abs(Bewegung.x) * intersection.GetHeight() * Bewegung.x / Bewegung.y, -1 * Bewegung.y / abs(Bewegung.y) * intersection.GetHeight());     
     }
     else
     {
          Spieler1.Offset(-1 * Bewegung.x / abs(Bewegung.x) * intersection.GetWidth(), -1 * Bewegung.y / abs(Bewegung.y) * intersection.GetWidth() * Bewegung.y / Bewegung.x);
     }

}

delete intersection;



Hoffe das hilft.

Gruß
SaRu_

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

14

13.06.2011, 20:59

Und wie wären die Koordinaten von LINKS OBEN UNTEN UND RECHTS?^^ Hehe, ne das hab ich nur vergessen hier zu schreiben^^ aber App.Draw(Text) hab ich selbst verständlich da stehen :p
Ich glaube auch, dass es deswegen nicht angezeigt wird, nur wie gesagt: was ist LINKS OBEN UNTEN und RECHTS? :D
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

15

13.06.2011, 21:16


Btw: Das da

Koordinaten der linken, oberen Ecke sowie die Größe (Breite, Höhe) deines Rechtecks.

ist falsch. Du musst die Koordinaten von Links, von Oben, von Rechts und von unten angeben. Vielleicht lags daran.

Naja, sollte vllt. nächstes mal erwähnen, dass ich SFML 2.0 meine.
http://www.sfml-dev.org/documentation/2.…6d4e95cff7c381d
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

16

13.06.2011, 21:19

Ach so ich habe da noch einmal ne Frage, die nicht zu dem Thema gehört:
Alle Sachen, die in der SFML 1.6 verwendet werden ( also in den Tutorials ) funktionieren doch auch mit der SFML 2.0 oder? Weil ich dann vielleicht umsteigen würde.^^
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

17

13.06.2011, 21:54

Wie Architekt hier schon geschrieben hat haben sich einige Dinge zur Version 2.0 hin geändert. Häufig nur die Bezeichnungen, manchmal - wie in obigem Fall - aber auch das ganze Konzept hinter einer Klasse etc.

Der Umstieg ist also ein klein wenig Arbeit, weil manches angepasst werden muss.

Gruß
SaRu_

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

18

13.06.2011, 22:20

Hmm ok, dann bleibe ich lieber bei der Version 1.6 und probiere mich hier erst einmal ein wenig rum. Nur eine Frage bleibt mir dann noch: Wie finde ich denn dann die Koordinaten für die linke, rechte, untere und obere Seite heraus?
Ohne die werde ich nämlich nicht weiter kommen =/ also in der 1.6er Version von der SFML werden ja, um die Schnittstellen dann herauszufinden diese Koordinaten benötigt.
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

19

13.06.2011, 22:50

Hmm ok, dann bleibe ich lieber bei der Version 1.6 und probiere mich hier erst einmal ein wenig rum. Nur eine Frage bleibt mir dann noch: Wie finde ich denn dann die Koordinaten für die linke, rechte, untere und obere Seite heraus?

Programmieren besteht darin lösungen für mehr oder weniger schwierige Probleme zu finden. Mir würde kein Problem einfallen, dass leichter zu lösen wäre und es wäre eine gute Übung für dich, es alleine zu lösen. Zur Not kannst du es dir ja aufzeichnen... Wenn dir das Lösen von solchen Problemen nicht liegt, könntest du dir ein Hobby suchen, bei dem du das nicht ständig machen musst^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

20

13.06.2011, 23:23

:D ja ok tut mir leid^^ Ich bin nur schon vor meiner Pause daran verzweifelt und jetzt so kurz vor der Lösung zu sein da wollte ich einfach fragen :D Ne, ich werde jetzt wieder mehr nachdenken, bevor ich hier was schreibe.

Danke für die Hilfe :) Jetzt macht mir programmieren gleich wieder mal Spaß :D

Edit:
Die die es interessiert: Ich habe eine etwas unelegante, aber funktionierende Methode gefunden, damit mein Spieler von dem Gold geblockt wird: http://codepad.org/jWuF6Bmy

Ich habe einfach nur für jede Seite des Würfels ein Quadrat mit einem Pixel Größe mal die Länge gelegt. Jetzt funktioniert alles bestens :) nur wenn ich damit nen ganzes Level machen will, dann habe ich wieder ein Problem :D Aber vorerst reicht das so.
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Jawaiica« (14.06.2011, 01:32)


Werbeanzeige