B2d IsoTileMap mit höheren Tiles
Übersicht

![]() |
TrustBetreff: B2d IsoTileMap mit höheren Tiles |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: 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: (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: 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. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich schätze, du suchst HandleImage![]() 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Trust |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Trust |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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. 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
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Endweder:
Code: [AUSKLAPPEN] HandleImage(tileset, IME_TileWidth / 2.0, IME_TileHeight-(IME_TileWidth / 2.0))
Oder: Code: [AUSKLAPPEN] Function IME_YReal(xiso,yiso)
Würde ich meinen.
Return (xiso+yiso) * (IME_TileHeight-(IME_TileWidth / 2.0)) End Function |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Trust |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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: 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hie mal ein Screenshot von meiner kleinen IsoMapEngine:
Bis jetzt läufts ganz gut... |
||
![]() |
biggicekey |
![]() Antworten mit Zitat ![]() |
---|---|---|
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] |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Trust |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group