2D Sprite Collision
Übersicht

![]() |
LunatixBetreff: 2D Sprite Collision |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi.
Folgendes : 1) Ich habe eine TileMap 2) Alles 128*128 Tiles Alles besteth aus sprites (SingelSurfacing). Jetz hab ich einen Spieler (drausicht), dieser spieler muss ja, damit es richtig ist, auf Graphicswidth()/2 und GraphicsHeight()/2 gerendert werden. Das geht auch noch. Da man sprites nicht collidieren lassen kann, muss also z.b RectsOVerlap her. Soweit geht das auch, allerdings ist das ein Multiplayer game, mit veränderbarer auflösung. Das heisst, fals der Server eine auflösung von 800*600 hat, berechnet er alle spieler positionen auf 800*600. Solte der spiler auber 1024*768 haben, sind die collisionen falsch. ich hab die variablen PLAYER_X und PLAYER_Y, die werden (beim server ) mit Sin/Cos mit dem spieler speed verechnet. Testen tuhe ich mit Rectsoverlap alle 4 Seiten des spielers, um rauszufinden wo er kollidiert. Problem ist einfach die auflösung, aber ich weiss gerade echt nicht, wie ich das ohne testen soll.... MFG Junkie |
||
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen... |
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe mir dein Posting dreimal durchgelesen, aber ich verstehe die Problembeschreibung absolut nicht ![]() Grundsätzlich benutzt man ja Arrays, wenn man mit Tiles arbeitet. Man errechnet einfach die Arrayposition des Spielers (Spalte, Reihe) und prüft dann ganz gezielt, ob in der Array-Map an dieser Position (oder den angrenzenden) ein Hindernis eingetragen ist. Das ist eine simple Variablenabfrage, da ist gar keine Kollisionsabfrage nötig. Und gerade bei 2D-Grafiken ist die Auflösung doch völlig egal, da die Grafiken ja nicht, wie bei 3D, skaliert werden, sondern bei höheren Auflösungen einfach nur mehr Tiles auf den Bildschirm gezeichnet werden. Das heisst also, das 2D-Tiles bei jeder Auflösung immer gleich gross sind, in deinem Fall also immer 128x128 -und deswegen kannst du auch jederzeit errechnen, auf welcher Spalte / Reihe deiner Tilemap sich der Player befindet. In tile based games muss man eigentlich niemals mit RectsOverlap oder irgendwelchen langsamen Kollisionsbefehlen arbeiten. Beschreib doch bitte mal ganz exakt, was das Problem ist, vielleicht kann ich dann weiterhelfen. |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
Lunatix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, da scheint schon der erste Fehler zu sein : ich hab Types genommen.
Also, sagen wir ein Tile auf 256,0 - wenn der spieler jetz bei 640*480 draauf steht, steht er bei 800*600 eben gerade nicht dort, weil er ja auf GraphicsWidth()/2,GraphicsHeight/2 gereendert wird. also berechne ich die Kollision auch so. Code: [AUSKLAPPEN] Local tp$[4],px#,py#,ph#,pw# For i = 1 To 4 Select i Case 1 px = g_width/225 ;------; py = g_height/2-30 pw = 50 ph = 1 Case 2 px = g_width/2+30 ; |; py = Pg_height/2-25 pw = 1 ph = 50 Case 3 px = g_width/2-25 ;_______; py = g_height/2+30 pw = 50 ph = 1 Case 4 px = f_width/2-30 ;| py = g_height/2-25 pw = 1 ph = 50 End Select For mt.MapTile = Each MapTile If RectsOverlap(px,py,pw,ph,mt\sx,mt\sy,mt\width,mt\height) ;If tp[i]="" Then tp[i] = mt\FuncType If tp[i] <> "" For f.FuncType = Each FuncType If f\fName = mt\functype For f2.functype = Each functype If f2\fname = tp[i] If f2\PiD > f\PiD tp[i] = mt\FuncType EndIf EndIf Next EndIf Next EndIf EndIf Next Next Das ist eben das problem, ich möcht es gern so berechnen, das ich GraphicsWidth und Height NICHT brauche, um die auflösung beliebig einzustellen. |
||
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen... |
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mein Gott, er macht es wirklich... er loopt durch ALLE Tiles ![]() Noch mal: bei einem tile based game funktioniert doch alles über Gitter, also über Zeilen und Spalten, nicht über Pixelpositionen. Und das ist ja gerade der grosse Vorteil. Also: 1. Lege dir eine Tilemap an (Array), falls noch nicht geschehen, und speichere deine Types doch in diesem Array: Code: [AUSKLAPPEN] Dim Tilemap.MapTile (maxspalten, maxreihen)
Alternativ (wenn du nicht Types für leere Felder erzeugen möchtest): Code: [AUSKLAPPEN] Dim Tilemap% (maxspalten, maxreihen)
Und dann das Handle jedes Types in der Tilemap speichern: Tilemap(10,20) = Handle(MeinType) Ich denke, das Prinzip ist klar. 2. Herausfinden, auf welcher Spalte / Reihe der Tilemap sich der Spieler gerade aufhält: Code: [AUSKLAPPEN] ; POSITION DER FIGUR AUF TILEMAP
spalte% = ((player_x+player_width /2 ) / tilesize) * tilesize zeile% = ((player_y+player_height/2 ) / tilesize) * tilesize player_x und player_y sind die linke, obere Ecke der Figur (Pixelkoordinate). Da wir aber vom Mittelpunkt der Figur ausgehen möchten, zählen wir einfach von der linken oberen Ecke figure_width / 2 und figure_height / 2 hinzu. 3. So, jetzt wissen wir, wo in der Tilemap die Figur steht (Spalte und Zeile) und können gezielt im Array nachsehen, ob sich z.B. eine Mauer unterhalb der Figur befindet: Wenn du ein Array aus Types benutzt: Code: [AUSKLAPPEN] If Tilemap(spalte,zeile+1) <> NULL Then ... ; ÜBER DER FIGUR IST EIN HINDERNIS
Wenn du nur die Handles der Types im Array gespeichert hast: Code: [AUSKLAPPEN] If Tilemap(spalte,zeile+1) <> 0 Then ... ; ÜBER DER FIGUR IST EIN HINDERNIS
Es gibt also keinen Grund, Pixelkollision zu benutzen, oder alle Tiles durchzulaufen. Alles geht über Spalten und Zeilen, da man ja bei einem tile based game mit Tiles und einem Spalten / Zeilen-Gitter arbeitet. |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
Lunatix |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok, vielen dank, werde das nach dim umbauhen ![]() *motivatiolnsschub* |
||
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen... |
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, wirst sehen, daß das vieeel schneller ist -ausserdem kannst du so ja ganz einfach jedes Tile über seine Spalte und Zeile ansprechen. | ||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
Lunatix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jop, danke : )
Klappt auch schon fast, bin noch ein bisl am Tiles setzen dran, danach kommt dann kolision... |
||
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen... |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group