GLBasic forum

Codesnippets => Code Snippets => Topic started by: D2O on 2008-Mar-21

Title: Wie kann man eine Tilekollision erstellen?
Post by: D2O on 2008-Mar-21
Hi,
es ist nicht immer ein Pixelkollision nötig, oft reicht es bei einer Tileengine aus wenn man weis
was neben einem im Tile ist.

Der kleine Code sollte eigendlich für jeden lesbar sein, ansonsten nochmals fragen.
Hier wird die Aktuelle Position von der Maus angezeigt und die Werte der Tiles die angrenzen.
Anhand der werte kann man festlegen ob das tile Passiebar ist oder nicht, usw..

Das bleib dann jedem selber überlassen.

Anlass dafür war folgendes Posting.
http://www.glbasic.com/forum/viewtopic.php?id=1718

Edit:// Code etwas  verbessert und kommentiert.
Es werden nun nur die nebenstehenden Felder Maskiert die den gleichen wert haben.

Code (glbasic) Select
///  Sprites erstellen

// Hier werden 2 Quadrate erstellt damit wir das ganze Grafisch darstellen können
// welches Tile benutzt und welche angrenzen.

DRAWRECT 0,0,32,32,RGB(0xff, 0x00, 0x00)
GRABSPRITE 0,0,0,32,32

BLACKSCREEN

DRAWRECT 0,0,32,32,RGB(0xff, 0xff, 0x00)
GRABSPRITE 1,0,0,32,32

BLACKSCREEN



//...............................................................


SYSTEMPOINTER TRUE // Der Mousepfeil wird mit angezeigt

DIM tile[10][10] //Das Array für die Tiles, 10 x 10 Felder gross
DIM wert[5] //Array für die Rückgabewerte der angrenzenden tiles



FOR iy = 0 TO 9
FOR ix = 0 TO 9

tile[ix][iy] = RND(5) // zufalls befüllung des Array, 0 - 5
NEXT
NEXT

// Startposition für das Tile, sie ist um 32 pixel verschoben, für die bessere sichtkontrolle
GLOBAL posx = 32
GLOBAL posy = 32

//Mainloop
WHILE TRUE
MOUSESTATE mx,my,b1,b2 //Mauskoordinaten abfragen

// Die Tiles in zwei forschleifen zeichnen
// von links nach rechts, oben nach unten

FOR iy = 0 TO 9
FOR ix = 0 TO 9

PRINT tile[ix][iy] ,posx+ix*32,posy+iy*32

// Das gelbe Sprite an der Mousposition innerhalb in einem Tile zeichnen
IF mx > posx+ix*32 AND mx < posx+((ix*32)+32) AND my > posy+iy*32 AND my < posy+((iy*32)+32)
wert[0] = tile[ix][iy]
ALPHAMODE -0.3
DRAWSPRITE 1,posx+ix*32,posy+iy*32 // Gelbes Sprite

tilecoll(tile[ix][iy]) // Angrenzende Tiles maskieren

ALPHAMODE 0


ENDIF


NEXT
 
NEXT

// Ausgabe der angrenzenden werte
PRINT "Feld mitte  = "+wert[0],100,350
PRINT "Feld oben   = "+wert[1],100,360
PRINT "Feld unten  = "+wert[2],100,370
PRINT "Feld links  = "+wert[3],100,380
PRINT "Feld rechts = "+wert[4],100,390


FOR p = 0 TO 4
wert[p] = 0
NEXT

SHOWSCREEN
WEND
END





FUNCTION tilecoll: l_in


// Sicheitsabfrage damit man nich ausserhalb des speierbereichs vom Array zugreift
IF iy > 0
// Nur Rot maskieren wenn der wert gleich der Mouseposition ist
IF l_in = tile[ix][iy-1] THEN DRAWSPRITE 0,posx+ix*32,posy+(iy-1)*32
wert[1] = tile[ix][iy-1]
// Ergänzug für -->[iy-1]<--
//wir fragen ja den aktuellen wert mit der mouse von tile[ix][iy] ab
// Möchten wir nun den wert des genau darüberliegenden feld haben
// müssen wir ein fach um eine zeile nach oben springen.
// Also die y Achse ein weiter oben abfragen, und das machen wir
// in dem wir einfach bei [iy] ein [iy-1] einfügen
//analog dazu für unten links und rechts
ENDIF

IF iy < 9

IF l_in = tile[ix][iy+1] THEN DRAWSPRITE 0,posx+ix*32,posy+(iy+1)*32
wert[2] = tile[ix][iy+1]
ENDIF

IF ix > 0  

IF l_in = tile[ix-1][iy] THEN DRAWSPRITE 0,posx+(ix-1)*32,posy+iy*32
wert[3] = tile[ix-1][iy]
ENDIF


IF ix < 9

IF l_in = tile[ix+1][iy] THEN DRAWSPRITE 0,posx+(ix+1)*32,posy+iy*32
wert[4] = tile[ix+1][iy]
ENDIF


ENDFUNCTION
Title: Wie kann man eine Tilekollision erstellen?
Post by: BumbleBee on 2008-Mar-21
Tolles Beispiel. :good: Dazu gibt's wohl keine Fragen mehr.

Cheers
Title: Wie kann man eine Tilekollision erstellen?
Post by: Schranz0r on 2008-Mar-21
Subba, würde aber eher zu Codeshnippsel tendieren :)
Wenn der Code noch schön beschrieben wär, dann wär es aber durchaus ein HowTo... sprich Tutorial.
Anderseits hast du den Thread auch wieder Clever benannt ^^

Ich bin verwirrt :D
Title: Wie kann man eine Tilekollision erstellen?
Post by: D2O on 2008-Mar-22
@Schranz0r,
habe den Code Editiert.
Von mir aus, Move it.  :)
Title: Wie kann man eine Tilekollision erstellen?
Post by: Schranz0r on 2008-Mar-22
Ja wohin den nur ^^
Sags du :D
Title: Wie kann man eine Tilekollision erstellen?
Post by: D2O on 2008-Mar-22
Code schnipsel ist wohl ok, für ein Tutorial ist es zu mager.
Title: Wie kann man eine Tilekollision erstellen?
Post by: Schranz0r on 2008-Mar-22
OK .

Move To Code-schnipsel ;)