Kollision auf ner Tilemap
Übersicht

![]() |
FreemanBetreff: Kollision auf ner Tilemap |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich beschäftige mich grad mit der Kollision von den Tiles es gibt zwar ne möglichkeit alles abzufragen ( siehe 2. RPG Tutorial von Robsite ) allerdings is mir das zu umständlich. Geht das auch einfacher? erzählt mal wie ihr das am besten macht mit der Kollision eures Charas aufnere 2D Map. thx | ||
MacBook | MacOSX 10.5 | 80GB HDD | 1GB | BlitzMax 1.28 |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
K.A. wie du das machst, aber ich brauche 24 codezeilen um imageframe zu ermitteln die tile xy hat | ||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] oben=map((sx+16)/32,(sy-2)/32)
rechts=map((sx+32)/32,(sy+16)/32) unten=map((sx+16)/32,(sy+32)/32) links=map(sx/32,(sy+16)/32) mitte=map((sx+16)/32,(sy+16)/32) Ich gehe hier mal von einer Tilegröße 32 * 32 Pixel und Spielfigurgröße 32 * 32 Pixel aus. sx und sy sind die Spielerposition, map ist die ...ähh... Map. Damit kriegst Du rund um die Spielfigur die Nummer des Tiles zurückgeliefert mit dem es kollidiert. Ich hoffe das ist das was Du meinst ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Freeman |
![]() Antworten mit Zitat ![]() |
---|---|---|
jo, genau danke!!! | ||
MacBook | MacOSX 10.5 | 80GB HDD | 1GB | BlitzMax 1.28 |
stepuh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
also ich mache das ganz anders:
Code: [AUSKLAPPEN] ;Die Tiles sind 32,32 groß Image = CreateImage(MapBreit*32,MapHoehe*32) Buffer = ImageBuffer(Image) SetBffer(Buffer) for i = 0 to MapBreite For k = 0 to MapHoehe Drawimage Tiles,i*32,k*32,Map(i,k) next next Dann hast du sozusagen deine map in einem image drinnen... dann kannst du mit ImagesCollide pixelgenau überprüfen, ob da was kollidiert... das alles hat den vorteil, dass es schön einfach, und schön schnell ist... außerdem kann man später auch was in deine map malen... zb einschusslöcher oder so |
||
OJay |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
stepuh hat Folgendes geschrieben: also ich mache das ganz anders:
Image = CreateImage(MapBreit*32,MapHoehe*32) [/code] und schön speicherfressend! mal eine kleine rechnung: ich gehe von einer 1024² map mit nur einem einzigen layer aus: 1024*1024*4(byte)*16(bit)/8(byte<->bit) = 8388608 byte / 1024 / 1024 = 8mb. für EINEN layer und NUR das map array... |
||
stepuh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hast schon recht... hat aber dafür ne menge vorteile...
allein der speed ist viel schneller, weil du jetzt ein großes, anstatt viele kleine bilder malen kannst. außerdem ist die kollision um weiten genauer.. |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Funktioniert aber nicht überall, weil manche Grafikkarten solch große Bilder nicht mehr korrekt darstellen können. Wegen Speed müßte man mal testen... | ||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
OJay |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
alles in ein image zu zeichnen, und die betreffenden stellen nur zu updaten ist an sich eine gute idee. aber vielleicht genügt es auch, wenn man ein image erstellt, das nur so groß wie die akutelle auflösung ist ![]() |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und ehrlich gesagt hat bei einem so grossen Bild ImagesCollide schon leichte probleme, also viel grösser dürfte die map wohl nichtmehr werden.
Und da man auf Tile-Maps selten nur eine Figur hat, die auf Kollision geprüft werden muss, ist diese Methode für ein Kampf-Strategie-Spiel (womöglich noch mit KI) kaum zu gebrauchen... |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe immer meine Karten eingeladen , für die einzelne Tileanimationen der Karte ( zum Beispiel Wasseranimationen ) Pictures
gemacht und sie immer der Animation entsprechend gemalt ( bei einer 20*15 Map ist das ja auch noch sehr schön klein und praktisch ) . Um die Kollisionen abzufragen habe ich einfach eine Kollisionsfunction genommen , welche ungefähr so aussieht: Code: [AUSKLAPPEN] Function chipsetblocken()
For zy=1 To kgy For zx=1 To kgx z=z+1 chipaniset=kg(z) chipaniset=chipaniset+(60*mapani) If ImagesCollide(collideimage,fx,fy+ImageHeight(char)/4,0,chip,kx(zx),ky(zy),chipaniset) And kl(z)=1 Then Select r Case 0 fy=fy+laufspeed Case 1 fx=fx-laufspeed Case 2 fy=fy-laufspeed Case 3 fx=fx+laufspeed End Select EndIf Next Next End Function Wobei das collideimage ein unsichtbares image für den bewegbaren Character ist und alles heimlich und unsichtbar blockt. Wenn die Kollision erfolgt , dann wird der Held um seine Pixellauf- geschwindigketi zurückgeschoben und es sieht am Ende wie nicht passierbar aus.kgx und kgy sind die Breiten und Hoehen der Karte. kx() und ky() sind eingeladene Zählerschleifenframes für das Tileset. fx und fy sind Spielerpositionen und char ist das Heldenimage. Ich habe des collideimage halb so groß wie den Helden gemacht , weil es besser aussieht und besser wirkt.Darum auch die Addition. mapani ist die momentane Kartenanimation. Die komplette Engine läuft prima ab mit der Function. Ach ja , kl() sind die Layerdaten welche einem Sagen , auf welches Tile man laufen darf und auf welches nicht.Wie gesagt es ist so umständlich , da ich alles aus Dateine lese ( ein Rollenspiel wäre auf andere Weise sehr umständlich zu programmieren ) . |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Habe nun einen Test mit meinem Code gemacht - es sollten 1.000.000 Tiles abgearbeitet werden - Daten waren (ganz schön aufwendig) in Bank gespeichert. Es soll halt Framenummer ermittelt werden. Dies dauerte 85ms (bei DIM 30ms) - wenn animierte Tiles verarbeitet werden müssen, dann dauert es 125ms. Alles natürlich OHNE zeichnen. Mit Zeichnen (natürlich dumm, nicht optimiert) dauert es 13500ms - also kann man sagen, das das Zeichnen 13300% länger dauert als Daten abfragen (~100ms) - genug Zeit um benachbarte Tiles zu ermitteln - Nur Kollision prüfen ist auch bisschen Zeitfressend... in der Regel wird man jedoch ca. 4 Tiles prüfen, wenn Objektgröße=Tilegröße ist. | ||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group