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

13.05.2013, 09:46

SDL Collision detection alle 4 seiten einzeln

Hey Leute

Ich arbeite momentan an einem Tile Base Spiel.

Möchte die Collision mit jeder Seite einzeln durcharbeiten.

Habe mal auf Lazy foo geschaut, doch dasd hilft mir alles leider nicht weiter.

Möchte alle 4 Seiten testen und bei true bei top z.b die gravity funktion ausschalten, denn der Spieler soll ja nicht weiter fallen, wenn er auf einem Tile steht.

Hat vielleicht jemand ein tutorial oder grad einen codeschnipsel zur hand, der dazu passen könnte.

Es soll nicht wie auf lazy foo so geprüft weren.

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
    if( bottomA <= topB )
    {
        return false;
    }

    if( topA >= bottomB )
    {
        return false;
    }

    if( rightA <= leftB )
    {
        return false;
    }

    if( leftA >= rightB )
    {
        return false;
    }

    //If none of the sides from A are outside B
    return true;


sondern halt für jede Seite einzeln in einer funktion


MFG Leri :)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

13.05.2013, 12:40

Dann mach an die Stelle doch kein return sondern ruf dort deine Funktion auf. Du kennst doch die aktuelle Zelle in welcher sich dein Spieler befindet und von der aus kannst du doch gucken welche Zelle über ihm, unter ihm, bzw neben ihm ist. Diese Zellen kannst du nun auf Kollision prüfen. Was du jetzt damit anstellst ist dann abhängig davon was du vor hast. Zum Beispiel wenn unter dem Spieler Boden ist (also Kollision unten), dann schalte die Behandlung aus. Wenn es nicht das ist was du wolltest, dann stell bitte eine Frage;) Ich kann grad nur raten was du möchtest;)
„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.“

TigerClaw25

unregistriert

3

13.05.2013, 12:52

In dem Tutorial wird auch ein Punkt aus der Vogelperspektive bewegt (ala Packman) ;) Da gibts auch nur je eine Kollision rechts, links, oben oder unten. Bin auch gerade dabei das Tutorial abzuarbeiten. Habe mir die vorherigen aber nicht angeschaut, da das Laden von Bildern etc. auch in Heikos C++ Buch beschrieben wird.

4

15.05.2013, 09:49

entschuldigung das ich mich erst so spät melde, habe die tage viel um die ohren gehabt.

Ich möchte lediglich eine collisionserkennung für alle 4 seiten, der punkt ist, jede davon soll wirklich komplett alleine behandelt werden.

Habe schon ein paar dinge probiert aber immer stimmt irgendwas nicht.

nur bei der Top Collisionsprüfung soll eine funktion aufgerufen werden die eine Fall Funktion des Spielers ausschaltet.

Frage mich bloss, wenn ich den Spieler immer um -- zurück setze bei Collision bleibt ja dann eignt auch meine Fall Funktion aktiv.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

15.05.2013, 11:17

Und immer noch keine Frage zu sehen. Stell doch bitte eine Frage wenn du Hilfe benötigst;) Wir sind keine Hellseher:)
„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.“

6

15.05.2013, 11:27

schuldigung

also die abfrage mit wenn player.x+Player.w>Wall.x(Seite) ist mir klar, aber wie frage ich ab, ob der Player sich auf der Höhe des befindlichen Tiles befinden

Sage immer wenn Player.y<Wall.y&&Player.y>Wall.y+Wall.h.

Da kommt aber nicht das richtige ergebnis raus ^^


meine frage wäre hier eigentlich, was ich falsch mache :D

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »leridan« (15.05.2013, 11:36)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

15.05.2013, 12:41

Bei sowas hilft es wenn man sich das ganze aufmalt. Ruhig analog mit echtem Zettel und echtem Stift.

a
|
| p
|
b

p ist dein Spieler. a entspricht wall.y und b entspricht wall.y + wall.h.
Deine Abfrage wäre "ist p kleiner a und p größer b". Check?;)
„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.“

8

15.05.2013, 13:05

:D hab jetzt noch einen versuch gemacht, jetzt haut er mir den Player komplett nach oben


First=player;
Second=Tile;

if(first.y+first.h<second.y&&first.x>second.x&&first.x<second.x+second.w)
{
return top=true;

}

nachdem top dann true ist, erhoehe ich die Player.y position um 1 also Player.y++;


Aber der haut mir den Player grad ganz nach oben

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

15.05.2013, 14:30

Mal dir das ganze mal bitte auf und beschrifte alles vernünftig. Und dann guck noch mal genau was größer und was kleiner sein muss.
„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

15.05.2013, 15:29

okay die Collision klappt nun

hab aber ein weiteres problem

ich habe eine fall funktion, die denn Spieler immer bis zum nächsten rect fallen lässt.

da ich den Spieler immer um den Betrag zurück setze, den er seit dem letzten Collisionscheck zurück gelegt hat, wird ja colli wieder zu false und somit auch die Fall Funktion wieder auf true gesetzt :D

Jetzt wackelt das bild ein wenig, was wäre denn nun ein guter weg das zu verhindern?

Habe eine Klasse namens PhysX und die enthält die Fall Funktion, die die Spieler Y achse um 100 punkte nach zeit nach unten bewegt, also jede sekunde um 100 pixel.

Nun ist meine Wall y100 und x50,

Der Letzte Collisionscheck war also bei Spieler y99 und x50
Bei True Collision setze ich die Fallfunktion auf false, und den Spieler um den differenzbetrag von true Collision und false Collision also um 100 und 99 ist ja 1.

Das heißt mein Spieler wird auf 99 zurück gesetzt.

heißt aber auch, das die Collisionsfunktion Fall wieder auf true setzt und somit das Bild wackelt.


Und danke erstmal wegen der hilfestellung mit dem Papier ^^ klappt super :D

Werbeanzeige