Kollision auf vielfältiger tilemap

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Xenowa

Betreff: Kollision auf vielfältiger tilemap

BeitragDo, Aug 10, 2006 0:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich suche nach einer lösung, wie ich die kollision auf einer tilemap mit einer spielfigur abfragen kann. Ich weiss, es sind schon viele solcher fragen hier im forum aufgetaucht, aber ich habe bis jetzt keine wirkliche antwort gefunden, da die meisten sich bloss auf eine spielfigur und ein einziges Tile beschränken.

Das problem ist, dass ich mich auf der tilemap mit je zwei pixeln vorwärts bewege, die tiles sind allerdings 16 bzw. 32 pixel gross. Bis jetzt habe ich die map immer gleich am anfang in ein einzelnes bild eingelesen, und dieses scrolle ich dann einfach hin und her und so. aber auf diese art und weise kann ich nicht anhand von imagecollide abfragen, da ja dann nur ein einziges bild existiert.

jetzt ist die frage, wie man sowas am besten und am effektivsten anstellt. Also um für jedes tile ein imagecollide abfragen zu können würde ja bedeuten, dass man jedes tile, das man auf dem bildschirm sieht, als einzelnes bild anzeigen würde, also auf einer map von 20 * 20 tiles müssten dann auch dementsprechend viele bilder und abfragen sein.

Dies ist mal so meine idee wie man es anstellen könnte, aber ich kann nicht beurteilen wie effektiv und schnell das ganze ist, und ob es überhaupt sinn macht. Wisst ihr noch andere methoden? Danke für die hilfe.
 

Dreamora

BeitragDo, Aug 10, 2006 7:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde zu einzelnen Tiles raten. Warum?

Weil du eben genau nicht mit allen Tiles auf Kollision testen musst, denn deine Figur kann maximal auf 4 Tiles gleichzeitig sein und nur mit diesen 4 Tiles musst du dann auch auf Kollision testen. Dazu musst du einfach schauen wo deine Figur steht und alle 4 Bildeckpunkte in "Mapkoordinaten" transformieren und schauen in welchen Feldern sie liegen und mit diesen dann auf Kollision testen.

Es gibt keinen Grund mit den restlichen Tiles auf Kollision zu prüfen, denn dort kannst du garnicht stehen also auch nicht kollidieren.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

5k41

BeitragDo, Aug 10, 2006 11:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!
Ich würde das ungefähr so lösen:
Code: [AUSKLAPPEN]

while not keydown(1)
oldplayerx=playerx
oldplayery=playery
;aller mögliger krams mit steuerung etc.
for i=-1 to 1
 If map(playerx/32+i,playery/32+i)=kollisionstile then
  If ImagesCollide(player,playerx,playery,0,tileset,(playerx/32+i)*32,(playery/32+i)*32,kollisionstile) then
   playerx=oldplayerx
   playery=oldplayery
  endif
 endif
next
;player zeichnen
;weiterer krams
wend

Hoffe man versteht es!

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

Xenowa

BeitragDo, Aug 10, 2006 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja also ich hab das jetzt mal so gemacht wie es Dreamora gesagt hat. Die Hauptschwierigkeit hierbei ist, dass man die tiles in abhänigkeit einer gewissen verschiebung anzeigen muss, da ich meinen held ja pixelweise bewege auf tiles von 32 pixeln, das heisst, ich muss eine variabel namens TileVerschiebungX und TileVerschiebungY machen, die denn wert zwischen 0 und -32 annehmen kann, und somit die Tiles z.t. nicht ganz auf dem bildschirm anzeigt, sondern eben auch ein bisschen nach oben und links oder umgekehrt verschoben anzeigt.
Leider habe ich dann auch gemerkt, dass diese dämliche funktion imagecollide die angabe der koordinaten jedes bildes erfordert (wieso kann man nicht einfach z.b. eine bild ID angeben oder so? das würde die ganze sache um einiges erleichtern).
Ich habe jetzt zwar eine recht komplizierte formel bei der koordinatenangabe, aber es funktioniert leider immernoch nicht. Hier mal der code von der imagecollide funktion:
Code: [AUSKLAPPEN]

If ImagesCollide(CharSet1, SpielerX, SpielerY, 1, ;Für die Spielfigur
ChipSet1,
SpielerTileX * TileBreite + TileVerschiebungX,

;SpielerTileX gibt das jeweilige Tile an, auf dem sich der Held befindet, wird multipliziert mit 32, damit man die richtige koordinate erhält, und dann wird noch die verschiebung abgezogen

(SpielerTileY - 1) * TileBreite + TileVerschiebungY, Map(SpielerTileX, SpielerTileY - 1))

;hier fast dasselbe, allerdings wird bei SpielerTileY noch 1 abgezält, damit man die koordinaten des Tile oberhalb erhält (Diese If abfrage ist nur für eine Pfeil Richtung!)


So, ehm ich hab echt keine ahnung wie ich das anstellen könnte, und ich versteh auch nicht, warum das nicht funktioniert...

Vielleicht wisst ja ihr weiter...

PSY

BeitragDo, Aug 10, 2006 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
hoi,

um welche art spiel handelt es sich denn?

DerHase

BeitragDo, Aug 10, 2006 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht hilf Dir ja das einen Stück weiter: https://www.blitzforum.de/foru...hp?t=17375

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group