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

1

04.06.2011, 17:58

[SFML]Sprite so verschieben das es nicht durch eine Wand läuft

Hallo

Demletzt habe ich ein kleines Spiel programmiert bin jetzt fast fertig ich brauche nur noch die Kollisionsüberprüfung. Ich habe jetzt einen Code für Kollisionen geschrieben komme aber nicht mehr weiter. Bis jetzt sieht der Code so aus das wenn es kollidiert eine Textnachricht im Konsolenfenster auftaucht. Es funktioniert auch alles so weit. Das einzigste Problem ist das ich nicht weiss wo die Daten von dem Sprite liegen und welche ich verädnern muss das mein Sprite nicht durch die wand durchläuft.

Code

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for( int i = 0; i < map_hoehe; i++)
            {
                // alle zeilen durchlaufen
                for( int j = 0; j < map_breite; j++)
                {
                    int Sprite_WhichImage = tile [i][j];
                    int Sprite_WhichImages = tileCollission [i][j];

                    Sprite[Sprite_WhichImage].SetPosition(j*tile_breite, i*tile_hoehe);

                    if ( Sprite_WhichImages == 18 )
                    {
                        if (Collision::PixelPerfectTest ( SpPacman, Sprite[Sprite_WhichImage], 0 ))
                        {
                            std::cout << "Collision";
                        }
                    }
                }
            }

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

04.06.2011, 19:03

Nur um auch mal was beizutragen: ich denke es geht effektiver als alle Pixel deines Bildes durch zu laufen.
Und wenn du eine Kollision hast kannst du einfach (?) den Bewegungsvektor für den Sprite auf 0 setzen, so das er sich nicht mehr verschiebt oder den Vektor umdrehen.
Generell sind das recht wenige Informationen von dir.

(Sagt falls ich mist schreibe).

MfG

3

04.06.2011, 19:12

Nur um auch mal was beizutragen: ich denke es geht effektiver als alle Pixel deines Bildes durch zu laufen.
Und wenn du eine Kollision hast kannst du einfach (?) den Bewegungsvektor für den Sprite auf 0 setzen, so das er sich nicht mehr verschiebt oder den Vektor umdrehen.
Generell sind das recht wenige Informationen von dir.

(Sagt falls ich mist schreibe).

MfG



Ich überprüfe ja nicht alle Pixel von meinem Spiel sondern nur die tiles der Tilemap.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

04.06.2011, 19:18

Du hast noch nicht gesagt wie sich dein Sprite "verhält". Bewegt er sich z.B. auf die Wand zu, steht er einfach nur?

5

04.06.2011, 20:12

Du hast noch nicht gesagt wie sich dein Sprite "verhält". Bewegt er sich z.B. auf die Wand zu, steht er einfach nur?


Der Sprite sind mehrere Tiles die wie eine Wand zusammengebaut ist um es besser zu verstehen poste ich mal ein Bild.


(Link)

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

05.06.2011, 11:55

Ach Pacman^^ sag das doch gleich. Naja du wirst ja wohl die Bewegungsrichtung jedes Sprites irgendwo speichern.

C-/C++-Quelltext

1
int move[] = {1, 0}; // Laeuft einen nach rechts pro Frame


Dann kannst du ja bei Kollision auf X-Ebene:

C-/C++-Quelltext

1
move[0] *= -1;


Aber ich glaube das ist nicht dein Problem? Wenn du nicht weißt wo die Daten zu deinem Sprite liegen (Position, Bewegungsrichtung, Größe?) ist das natürlich auch alles ziemlich schlecht :D

7

05.06.2011, 12:13

Ich beschreib nochmal mein Problem.

Ich habe letztens eine funktion in der Dokumentation gefunden die Sprite.GetPosition () heisst. Die Funktion gibt einen Vektor mit den Koordinaten x und y zurück. Mein Problem ist jetzt das ich nicht weiss wie ich diesen Vektor so verändere das wenn es mit der Wand kollidiert mein Pacman nicht weiterlaufen kann und man eine andere Richtung auswählen muss damit er weiterläuft.

8

05.06.2011, 12:38

/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »E333« (02.09.2021, 04:08)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

05.06.2011, 12:53

Du bewegst den Spieler doch irgendwo.
Jetzt guckst du einfach bevor du die Sprite bewegst, ob eine Kollision auftritt.

Quellcode

1
p = Positionn = neue Position(nach der Bewegung)wenn an Stelle n eine Kollision ist, dann nicht bewegen.Ansonsten p = n



So in etwa könnte der Code doch aussehen. Und du musst nicht mit jedem Teil auf eine Kollision prüfen.
Du kannst auch direkt gucken ob map[p.x][p.y] ein Wandstück ist oder nicht. Du kennst ja die Position vom Spieler und kannst darüber dann auf den Index im Array schließen. Dann brauchste nicht mit jedem Tile testen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

10

17.06.2011, 16:28

Ich glaube ihr versteht mich falsch oder ich habe mein Problem nicht gut beschrieben Meine Kollisionserkennung funktioniert bisher ohne Probleme. Mein Problem ist es wenn mein Sprite mit der Wand kollidiert ich zwar weiss wie man die Koordinaten von meinem Sprite holt nämlich mit dieser Funktion (SpPacman.GetPosition ()) ich aber nicht weiss wie ich die Position von meinem Sprite so verändere dass es nicht durch die Wand durchläuft sondern einfach immer wieder die koordinaten so setzt das mein Pacman vor der Wand stehen bleibt

Werbeanzeige