Kollision auf ner Tilemap

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Freeman

Betreff: Kollision auf ner Tilemap

BeitragMo, Feb 09, 2004 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

TheShadow

Moderator

BeitragMo, Feb 09, 2004 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 10, 2004 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Freeman

BeitragDi, Feb 10, 2004 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
jo, genau danke!!!
MacBook | MacOSX 10.5 | 80GB HDD | 1GB | BlitzMax 1.28
 

stepuh

BeitragDi, Feb 10, 2004 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 10, 2004 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 10, 2004 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 10, 2004 21:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 10, 2004 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Holzchopf

Meisterpacker

BeitragDi, Feb 10, 2004 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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 BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Kekskiller

BeitragDi, Feb 10, 2004 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ) .

TheShadow

Moderator

BeitragDi, Feb 10, 2004 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group