Wie kann man eine Tilekollision erstellen?

Previous topic - Next topic

D2O

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
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

BumbleBee

Tolles Beispiel. :good: Dazu gibt's wohl keine Fragen mehr.

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Schranz0r

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
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

D2O

@Schranz0r,
habe den Code Editiert.
Von mir aus, Move it.  :)
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

D2O

Code schnipsel ist wohl ok, für ein Tutorial ist es zu mager.
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard