Kollision auf vielfältiger tilemap
Übersicht

XenowaBetreff: Kollision auf vielfältiger tilemap |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
hoi,
um welche art spiel handelt es sich denn? |
||
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielleicht hilf Dir ja das einen Stück weiter: https://www.blitzforum.de/foru...hp?t=17375 | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group