2D Sprite Collision

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Lunatix

Betreff: 2D Sprite Collision

BeitragSa, Jul 15, 2006 8:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jul 15, 2006 9:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir dein Posting dreimal durchgelesen, aber ich verstehe die Problembeschreibung absolut nicht Wink

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

BeitragSa, Jul 15, 2006 9:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jul 15, 2006 9:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein Gott, er macht es wirklich... er loopt durch ALLE Tiles Shocked Und noch schlimmer: du loopst sogar MEHRFACH durch alle Types! Das ist das schlimmste, das man in einem tile based game machen kann.

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

BeitragSa, Jul 15, 2006 10:29
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, vielen dank, werde das nach dim umbauhen Very Happy

*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

BeitragSa, Jul 15, 2006 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jul 15, 2006 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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...

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group