B2d IsoTileMap mit höheren Tiles

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Trust

Betreff: B2d IsoTileMap mit höheren Tiles

BeitragFr, Feb 25, 2011 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ich habe folgendes Problem:

Ich möchte mir eine kleine IsoMapBibliothek schreiben so das ich die Funktionen immerwieder benutzen kann.
Klappt auch alles sehr gut aber:

Wenn ich folgendes Tileset benutze:
user posted image

Funktioniert alles wunderbar, allerdings habe ich dort den Nachteil das die Maps logischerweise alle sehr flach sind, da ich bei diesem Tileset keine Höhe habe.

Nun dachte ich mir mache ich mir ein neues probe-Tileset mit "Höhe", was dann so aussah:
user posted image
(das haus ist nicht von mir, sondern aus dem inet rein zu testzwecken)

da habe ich allerdings folgendes problem was man anhand dieses Bildes gut sehen kann:
user posted image

Nun dachte ich mir, liegt ja auf der Hand, ich rechne einfach mit der halben Höhe des Tilesets bzw Tile (TileHeight/2)

Nun ist die Map auch schön zusammen jedoch Funktioniert nun das Tilepicken mit der Maus, und das verändern der Tiles überhaupt nichtmehr. Alles ist verschoben und manchmal zeichnet er nicht nur ein Tile beim Mausklick, sondern 3 oder gar 4 mit einem Klick.

Habe schon alles Mögliche versucht, und in der Forensuche habe ich zwar massig über iso gefunden, allerdings nichts was speziel dieses Problem betrifft.

Wäre sehr nett wenn mir jemand weiterhelfen könnte.

Xeres

Moderator

BeitragFr, Feb 25, 2011 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich schätze, du suchst HandleImage. Setze den Bezugspunkt auf den Mittelpunkt deines BodenTiles: TileWidth/2, TileHeigth-32 (oder was die Abmessungen halt gebieten).

Tilepicken: Machst du das Mathematisch oder mit Bilder-Kollision? Ersteres sollte wunderbar funktionieren (wiedderum zählt dann nur die Grundfläche).
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Trust

BeitragFr, Feb 25, 2011 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider bringt das nichts. Da durch das versetzten des Bezugspunktes die einzelnen Tiles ja trotzdem zueinander in der Höhe versetzt eingezeichnet werden.

Mein problem ist, das beim einzeichnen der Tiles mit der vollen Höhe des Tiles gerechnet wird, was wie am 2. Bild mit dem Haus oben zu sehen, die doppelte Höhe des Bodentiles ist. Doppelte Höhe damit ich eben Objekte wie Häuser und Bäume usw. zeichnen kann die quasi über das Bodentile hinausgehen.

Hier mal die Codefragmente die meines erachtens nach die Ursache des Problems sein könnten:

Der TileType:
Code: [AUSKLAPPEN]
Type IME_tTile
   Field x
   Field y
   Field frame
   Field walkable
End Type


Die Funktion die neue Instanzen vom Typ tTile erstellt und diese mit Werten füllt:
Code: [AUSKLAPPEN]
Function IME_CreateMap(width, height)
   For y = 0 To height -1
      For x = 0 To width -1
         t.IME_tTile    = New IME_tTile
         t\x       = IME_XReal(x,y)
         t\y       = IME_YReal(x,y)
         t\frame    = 0
         t\walkable    = 1
      Next
   Next   
End Function


Die Funktion zum zeichnen der Map:
Code: [AUSKLAPPEN]
Function IME_DrawMap(graphicWidth,graphicHeight,x,y,tileset)
   For t.IME_tTile = Each IME_tTile
      If t\x+IME_MapX > -100 And t\x+IME_MapX < graphicWidth - 20
         If t\y+IME_MapY > -50 And t\y+IME_MapY < graphicHeight - 20
            xDrawImage tileset,t\x+x,t\y+y,t\frame
         EndIf
      EndIf
   Next
End Function


und die Funktionen zum umrechnen in Iso- bzw Realcoordinaten
Code: [AUSKLAPPEN]
Function IME_XReal(xiso,yiso)
   Return (xiso-yiso) * IME_TileWidth / 2.0
End Function

Function IME_YReal(xiso,yiso)
   Return (xiso+yiso) * IME_TileHeight / 2.0
End Function

Function IME_XIso(xreal,yreal)
   Return ((xreal/IME_TileWidth) + (yreal/IME_TileHeight))-1
End Function

Function IME_YIso(xreal,yreal)
   Return (yreal/IME_TileHeight) - (xreal/IME_TileWidth)
End Function



Irgendwo liegt hier der Hund begraben.
Ich weiß das ich nur mit der Höhe des eigentlichen Bodentiles rechnen darf, nur wo und wie... da stehe ich an.

Oder gibt es noch eine ganz andere Lösung?

[Edit]

Ja das Tilepicken mache ich Mathematisch:
Code: [AUSKLAPPEN]
Function IME_DrawTileOnMouseDown(mouseXpos,mouseYpos,mouseButtonDown,frame)
   mxIso% = IME_XIso(mouseXpos,mouseYpos)
   myIso% = IME_YIso(mouseXpos,mouseYpos)
   If IME_XIso(mouseXpos,mouseYpos) >=0 And IME_XIso(mouseXpos,mouseYpos) <= IME_MapWidth -1
      If IME_YIso(mouseXpos,mouseYpos) >=0 And IME_YIso(mouseXpos,mouseYpos) <= IME_MapHeight - 1
         If mouseButtonDown = True
            For t.IME_tTile = Each IME_tTile
               If IME_XIso(t\x,t\y) = mxIso-1
                  If IME_YIso(t\x,t\y) = myIso
                     t\frame = frame
                  EndIf
               EndIf
            Next
         EndIf
      EndIf
   EndIf
End Function

Xeres

Moderator

BeitragFr, Feb 25, 2011 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie hoch die Bilder sind, sollte eben egal sein; du beziehst dich immer nur auf die Bodentiles. Du zeichnest von Oben nach unten und überzeichnest dabei ggf. die weiter hinter liegenden Tiles. Du musst nur den Bezugspunkt richtig setzen und dann so zeichnen, als hättest du Bodentiles.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Holzchopf

Meisterpacker

BeitragFr, Feb 25, 2011 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist es denn nicht so, dass die Breite und Höhe der Bodentiles zusammenhängen? Also Bodentile\Höhe = 0.5 * Bodentile\Breite. Müsste doch auch hinhauen, nicht? Dann hättest du zudem den Vorteil, dass die Tilesets in der Höhe nicht wirklich fix ist. Du könntest also auch mal ein Tileset mit dreifacher Höhe einsetzen.

mfG
Holzchopf

Edit
Eigentlich stimmt der Zusammenhang nicht ganz. Bei richtig schön korrekt nahtlos gekachelten ISO-Tiles ohne Treppeneffekt-Kanten weisen die Bodenstücke entweder Höhe=Breite/2-1 oder Höhe=Breite/2+1 auf, wie dieses Bild hoffentlich deutlich genug demonstriert.
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

Trust

BeitragFr, Feb 25, 2011 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@Holzchopf
Danke für den Hinweis, werde es dementsprechend anpassen


@Xeres
Zitat:
...und dann so zeichnen, als hättest du Bodentiles.


Und da liegt mein Problem, wo und wie bewerkstellige ich das.

Eigentlich müsste ich das in der Funktion YReal (weiter oben gepostet) anpassen,
da diese ja die typen tTile mit coords speist.

Oder liege ich da Falsch?

Code: [AUSKLAPPEN]
Function IME_YReal(xiso,yiso)
   Return (xiso+yiso) * IME_TileHeight / 2.0
End Function


Momentan Zeichne ich die Tiles xiso + yiso coordinaten * in der Höhe versetzt um die halbe Tilehöhe ein. Die halbe Tilehöhe ist aber zuviel daher müsste ich die viertel Tilehöhe nehmen, was wie gewünscht die halbe BodenTilehöhe wäre.

Nur leider gibt es dann Pickfehler und Fehler beim Tileszeichnen mit der Maus, es zeichnet mir an falscher Stelle und auf einmal gleich vier Häuser.

user posted image


Das war nur ein Mausklick.

Vier Häuser an falscher stelle

geändert habe ich:

Code: [AUSKLAPPEN]
Function IME_YReal(xiso,yiso)
   Return (xiso+yiso) * IME_TileHeight / 4.0 ; jetzt durch 4.0
End Function


und eben den Bezugspunkt
Code: [AUSKLAPPEN]
xHandleImage IME_ImgTileset1, IME_TileWidth/2, IME_TileHeight/4
  • Zuletzt bearbeitet von Trust am Fr, Feb 25, 2011 17:31, insgesamt 2-mal bearbeitet

Xeres

Moderator

BeitragFr, Feb 25, 2011 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Endweder:
Code: [AUSKLAPPEN]
HandleImage(tileset, IME_TileWidth / 2.0, IME_TileHeight-(IME_TileWidth / 2.0))

Oder:
Code: [AUSKLAPPEN]
Function IME_YReal(xiso,yiso)
    Return (xiso+yiso) * (IME_TileHeight-(IME_TileWidth / 2.0))
End Function
Würde ich meinen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Trust

BeitragFr, Feb 25, 2011 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
(IME_TileHeight-(IME_TileWidth / 2.0))


wäre in meinem Fall nichts anderes als
Code: [AUSKLAPPEN]
IME_TileHeight/2


Mit Werten gefüllt wäre es
Code: [AUSKLAPPEN]
128-(128/2)


und das wäre leider so wie ich es schon ganz zu Anfang beim erstellen meines Threats hatte:
Zitat:
Nun dachte ich mir, liegt ja auf der Hand, ich rechne einfach mit der halben Höhe des Tilesets bzw Tile (TileHeight/2)


Ich verzweifle hier langsam Sad ...
Denke ich zu kompliziert?
Das kann doch nicht so schwer sein...

-----[Edit]-----

Ok habe nun den Fehler gefunden:

Wenn ich hier:
Code: [AUSKLAPPEN]
Function IME_YReal(xiso,yiso)
   Return (xiso+yiso) * (IME_TileHeight / 2.0)
End Function

vorher mit /2.0

und hier:
Code: [AUSKLAPPEN]
Function IME_XIso(xreal,yreal)
   Return ((xreal/IME_TileWidth) + (yreal/(IME_TileHeight)))-1
End Function


vorher mit dem ganzen gerechnet habe,

und nun hier:
Code: [AUSKLAPPEN]
Function IME_YReal(xiso,yiso)
   Return (xiso+yiso) * (IME_TileHeight / 4.0)
End Function

mit einem viertel rechne,

muss ich hier:
Code: [AUSKLAPPEN]
Function IME_XIso(xreal,yreal)
   Return ((xreal/IME_TileWidth) + (yreal/(IME_TileHeight/2)))-1
End Function


und hier:
Code: [AUSKLAPPEN]
Function IME_YIso(xreal,yreal)
   Return ((yreal/(IME_TileHeight/2)) - (xreal/IME_TileWidth))
End Function


nun mit der hälfte rechnen anstatt, wie vorher mein Fehler,
mit dem ganzen.

Nun habe ich nur noch ein kleines Problem:

jetzt ist es im y noch um eins versetzt:
user posted image

Wie man hier sehen kann wähle ich mit der Maus das Tile 0,0 aus
und bei einem Klick wird ein Haus auf 0,0 erstellt.
Nur liegt beim auswählen eines Tiles mit der Maus das Tile scheinbar auserhalb der Map,
beim zeichnen des Hauses jedoch liegt es wie Gewünscht auf der Map auf den iso-koordinaten 0,0.




-----[Edit2]-----


Ok es funktioniert nun alles
vielen dank an alle.

@Xeres
hattest recht habe jetzt zum Schluss das ImageHandling nochmal angepasst und nun klappt es.
 

Omenaton_2

BeitragSa, Feb 26, 2011 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei solchen 2D Iso Spielen (ich habe auch schon mal so Eins gemacht) verwendet man nur Plateaus, stat echten Bergen oder / und man macht zwar paar echt aussehende Bergteile, aber die sind nicht begehbar und man setzt einfach nichts dahinter und blockt den verdeckten Bereich.

Denk an Starcraft. Da gibt es auch nur Hochebenen.

Trust

BeitragSo, Feb 27, 2011 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hie mal ein Screenshot von meiner kleinen IsoMapEngine:
user posted image


Bis jetzt läufts ganz gut...

biggicekey

BeitragSo, Feb 27, 2011 23:39
Antworten mit Zitat
Benutzer-Profile anzeigen
ich finds extrem gut. sieht cleaner und aufgeräumter auf als age of empires oder stronghold. weiter so
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]

Holzchopf

Meisterpacker

BeitragSo, Feb 27, 2011 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich sehe da noch kleine Treppeneffekte. Bei den Mauern sieht man's am besten, aber wenn man genau hinsieht, sieht man, dass auch die Kanten der normalen grass-Tiles am Rand nicht schön flüssig ineinander übergehen.
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

Trust

BeitragMo, Feb 28, 2011 8:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke,

Ja das liegt daran das die Bodenteiles selbst auch etwas über ihre Höhe hinaus gehen, das kann man gut am oberen Rand der Map sehen (die Grashalme).
Weiß noch nicht genau wie ich das am besten beheben soll.
Entweder programmtechnisch oder die tilesets anpassen.
Aber danke für das Feedback.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group