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.
/// 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
Tolles Beispiel. :good: Dazu gibt's wohl keine Fragen mehr.
Cheers
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
@Schranz0r,
habe den Code Editiert.
Von mir aus, Move it. :)
Ja wohin den nur ^^
Sags du :D
Code schnipsel ist wohl ok, für ein Tutorial ist es zu mager.
OK .
Move To Code-schnipsel ;)