Iso-Tutorial *UPDATE*
Übersicht

![]() |
beanage.johannesBetreff: Iso-Tutorial *UPDATE* |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi.
Habe mal wieder ein kleines Tutorial geschrieben (hoffe diesmal sind nicht so viele Rechtschreibfehler drinnen ![]() Diesmal geht es um das Thema Iso. Viel Spaß beim lesen. -------------------------------------------------------------------------------------------------------------------------------------- Iso Tutorial In diesem Tutorial werde ich nur eine Art von Iso-maps behandeln, und zwar rechteckige (nicht rautenförmige) Maps (1). Die Kollision wird nicht über Berechnungen geprüft, sondern pixelgenaue Kollision benutzen, das hat den Vorteil das Tiles die hoch sind, wie z.b. Bäume nicht nur am boden angeklickt werden können sondern auch an der Krone, die über den bereich des "mutter-Tiles" hinaus geht, aber dazu später. 1 Rechteckige Iso-Map ![]() Zu beginn brauchen wir ein kleines Tileset mit der größe 32x15 Pixel (2). Bei isometrischen Tiles ist es wichtig das diese "ineinander greifen" können ohne sich zu verdecken, falsch währe es so (3) das würde zwar Funktionieren ergäbe aber ein hässliches end-Bild. Näheres zu Iso-Pixeln [Link Entfernt] Das könnte dann ungefähr so (4) aussehen. 2 Iso-Feld (32x15) ![]() 3 Iso-Feld Falsch (32x16) ![]() 4 Tileset ![]() Nun zum eigentlichen, dem Code. Wir brauchen ert einmal einen Type den wir "TTile" nennen. Der Type soll dann so (liste) aussehen. • X position • Y Position • H Position • Material • seter/geter Methoden • Create Funktion • Draw Methode Hier der richtige Code des Types. BlitzMax: [AUSKLAPPEN]
Der Code müsste eigentlich leicht verständlich sein (bis vieleicht auf die Method Draw() die wir aber jetzt nochmal durchgehen werden). Die Methode Draw() zeichnet ein Tile an seine X-Position und Y-Position. Die Variablen ScrollX:int und ScrollY:int sind Globale Variablen die die Position des betrachters beinhalten. Zoom:Float ist auch eine Global die den Zoom beinhaltet (normal 1.0). Das subtrahieren von (scrollX*TTile._width) bewirkt nur das die Map sich entgegengesetzt zum scrollX beweget -> wird ScrollX größer so bewegt sich die map nachlinks, nicht nach rechts. Das gleiche gilt für (scrollY*TTile._height) nur auf der Y - Achse. Unsere vielen vielen Tiles die wir später erstellen werden müssen natürlich auch gespeichert werden, hierfür eignet sich vor allem ein 2 dimensionälles Array. Unser neues Array nennen wir am besten erstmal map. BlitzMax: [AUSKLAPPEN]
Um unseren Array "Map" zu befüllen schreiben wir eine Funktion namens makeMap() (weil es CreateMap() schon gibt, falls dir ein besserer Name einfällt schreib ihn als Kommentar ![]() BlitzMax: [AUSKLAPPEN]
So... nun wird es spannend (oder auch nicht) denn jetzt berechnen wir die x und y Position für jedes Tile in der map. Aus performance Gründen tun wir das nicht "live" beim zeichnen der map sondern machen das vorher. Ob das wirklich viel schneller ist weis ich ehrlich gesagt nicht, aber ich denke es. Bei der xPos:int wird im Grunde nichts anderes gemacht als das dass Tile immer weiter nach rechts verschoben wird (und zwar um seine eigene Breite). Liegt das Tile aber in einer Graden (2,4,6,8,...) reihen so wird es um seine Hälfte ( (TTile._width/2) ) nach rechts verschoben. Ob es in einer gerade Reihe liegt stellen wir mit ( y Mod 2 ) fest. Trifft dies zu wird es verschoben, dass dient dazu das die Tiles in ein ander greifen. Bei der yPos:int wird das Tile einfach immer um die Hälfte seiner höhe nach unten verschoben, auch das dient dem in ein ander greifen. So weit so gut. Das einzige was uns zu unserem (vieleicht) ersten Iso-app fehlt ist eine Funktion um die Map zu zeichnen bzw die den Array durchgeht und von jedem Object die Methode Draw() aufruft und Dein mein-Loop. Also... nichts wie rann. Hier die drawMap() Funktion. BlitzMax: [AUSKLAPPEN]
ohh... fast hätte ich es vergessen... Die Vaibalen maxTilesW:int und maxTilesH:int beinhalten wieviele Tiles dargestellt werden müssen (w,h) damit der Bildschirm voll ist. Hier nochmal beide Variablen. BlitzMax: [AUSKLAPPEN]
Nun noch der meinloop. BlitzMax: [AUSKLAPPEN]
Hier nochmal der ganze Code: BlitzMax: [AUSKLAPPEN]
-------------------------------------------------------------------------------------------------------------------------------------- Das Tutorial als PDF und Der Code zum Download. ![]() ![]() Iso Tutorial (pdf) Code Download (zip) Danke |
||
- Zuletzt bearbeitet von beanage.johannes am Mo, Jan 11, 2010 1:22, insgesamt 36-mal bearbeitet
![]() |
beanage.johannesBetreff: Runde 2 ... Kollision |
![]() Antworten mit Zitat ![]() |
---|---|---|
--------------------------------------------------------------------------------------------------------------------------------------
2. Runde - Kollision Wir machen es uns mit der Kllision / dem Mousemapping etwas schwieriger, dafür wird aber das Resultat besser. Was wir benutzen werden nennt sich "Deffered Rendering". Ein Kumpel hat mir das so erklährt: Zitat: Jedes objekt hat seine Farbe. Es behält seine Farbe für immer und wird sie niemals einem anderen geben. Es reagiert wenn du es mit seiner Farbe ansprichst. Als ich das gehört habe fragte ich mich erstmal was der scheiß soll. Aber, es ist eig. ganz simpel. Jedes Tile bekommt seine eigene Farbe. Klicken wir mit der Maus, schauen wir auf welcher Farbe sich die Maus befindet, und welches Objekt sich hinter dieser Farbe verbirgt. Um diese merkwürdige sache umzusetzen ,müssen wir erstmal etwas coden, ich erklähre später alles nochmal, denn ich denke wenn du den code liest/abtippst oder auch copy und paste machst verstehst du das ganze besser (bei letzterem vieleicht eher weniger ^^). Wir brauchen eine Funktion die wir RenderMap() nennen. Diese Funktion zeichnet uns die Map in der jedes Tile eifarbig ist (jedes hat seine Farbe). Unser Tileset braucht daher an erster position ein Komplett Weißes Tile (1) 1 Neues Tileset ![]() BlitzMax: [AUSKLAPPEN]
Wir brauchen zusätzlich noch die Global colorMap:TPixmap Code: [AUSKLAPPEN] Global colorMap:TPixmap Die Funktion Zeichnet die map (mit einem leeren -> nur weißen Tile im Tileset, das an der Position 0 stehen muss) und Färbt jedes Tile Anders ein. Jetzt hat jedes Objekt seine eigene Farbe. Das sieht dann ungefähr so (2) aus. 2 Colormap ![]() Wenn wir klicken müssen wir >>nurnoch<< die Farbwerte an der position es Cursors auf der colorMap bestimmen, und schon wissen wir auf welches Tile wir geklickt haben! Nichts wie rann. Um Farbwerte zu bestimmen gibt es 2 methoden, ich habe mal schnell 4 Funktionen geschrieben die das machen (RGBA). Hier die 4 Funktionen (einfach copy&paste unten ins projekt) BlitzMax: [AUSKLAPPEN]
Diese Funktionen will ich jetzt nicht besprechen da sie nicht Thema des Tutorials sind. wir können jetzt schnell und dreckig eine kleine abfrage in den Mainloop integrieren, die könnte so aussehen. BlitzMax: [AUSKLAPPEN]
WICHTIG ist aber das wir jedesmal wenn sich auf der map was veränder die Funktion RenderMap() audführen da es sonst zu verfälschten erebnissen kommen kann. (Die Funktion muss auch am anfang vor dem Mainloop 1. ausgeführt werden!) Hier nochmal der Ganze Code: BlitzMax: [AUSKLAPPEN]
So das war es dann auch schon... ich denke ich schreibe und verbessere noch ein bisschen, aber im großen und ganzen sollte das meiste klaar sein, wenn nicht dasnn einfach mich fragen bzw. darauf hinweisen was ich zu unverständlich geschrieben habe. Danke ![]() [BONUS] Ein Schönes Tileset: Schöneres Tileset mit 2 Tiles ![]() BB |
||
- Zuletzt bearbeitet von beanage.johannes am So, Jan 03, 2010 23:34, insgesamt 12-mal bearbeitet
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde es für sinniger finden wenn das Tut hier als Beitrag steht. Denn wenn der Link irgendwann down ist ist der Beitrag hier wertlos.
Und die Erfahrung zeigt dass kaum ein link lange Bestand hat. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schöne Idee für ein BMax-Tutorial,jwolf555^^
Wollt mich schon lange damit beschäftigen! Allerdings solltest du BladeRunners Rat beherzigen. Die PDF enthält nix was jetzt so aufwändig wäre, dass es sich net als normalen Beitrag einbauen ließe, außerdem glaube ich dass es so besser lesbar werden wird^^ Freu mich auf mehr! Edit: Noch eine kleine Anmerkung: Es wäre gut, einige Dinge etwas ausführlicher zu Erläutern. Die Grafik am Anfang ist zunächst etwas verwirrend. Wäre gut, wenn du nochmal genau erläutern würdest, warum genau du dort diese Aufteilung gewählt hast. MfG Ska |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
![]() |
beanage.johannes |
![]() Antworten mit Zitat ![]() |
---|---|---|
kk... werds nochmal gründlich überarbeite und erweitern und dann als post hochladen.
Frohes neue (nachträglich ![]() |
||
![]() |
beanage.johannes |
![]() Antworten mit Zitat ![]() |
---|---|---|
*Updated*
Jetzt zum im Forum lesen ![]() Hoffe es gefällt ![]() [EDIT] Kleine frage noch... ist es doof von mir png bilder i web zu benutzen? weil jpg is ja kleiner aber halt doofe qualität... |
||
Lion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
nein^^
png ist bei solch kleinen dingern auch durchaus mal besser geeignet |
||
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x |
![]() |
beanage.johannes |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und was zum Tutorial ![]() |
||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich finde deine tiles nicht optimal, da die outline 2 mal nebeneinander gemalt wird | ||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
beanage.johannes |
![]() Antworten mit Zitat ![]() |
---|---|---|
damit soll nurgezeigt werden das die Tiles sich NICHT überschneiden, auserdem kann doch jeder sein eigenes Tileset malen ![]() Habe als "Bonus" boch ein etwas schöneres Tileset Gepixelt ![]() Viel Spaß und Danke fürs Lesen Und Bitte Kritik ![]() |
||
Lion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
nunja, ich verwende bei einem meiner spiele, welches auch isotiles verwendet, sich überschneidende tiles... ka ist aber sicher geschmackssache.
desweiteren geht der link zu dem isopixeltutorial nicht |
||
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x |
![]() |
beanage.johannes |
![]() Antworten mit Zitat ![]() |
---|---|---|
bei mir geht er, der Link.
Wer möchte das die Tiles sich überchneiden muss bei der berechnung der Y-Position das "+1" hinter dem ( TTile_height / 2 +1 ) Löschen. Und schon überschneiden die Tiles sich. Danke |
||
Lion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
naja, der link geht schon aber...
Zitat: Error 404 - Seite nicht gefunden
Unter der angeforderten Adresse konnte leider kein Inhalt gefunden werden. |
||
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x |
![]() |
Xaron |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jo schade eigentlich. Kannst Du die Images nochmal irgendwo hochladen bitte? | ||
Cerberus X - Monkey X Reloaded! |
Macintosh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-----------------------------------------------------------------------------------------------
Hier nochmal die Bilder und das Tutorial(etwas ältere version, glaub ich) als PDF, sowie den code als download. Es fehlen ein par bilder, das PDF ist sehr veraltet und der code warscheinlich auch :/ Code: https://www.blitzforum.de/upload/file.php?id=9584 Pdf: https://www.blitzforum.de/upload/file.php?id=9583 Bilder: https://www.blitzforum.de/upload/file.php?id=9582 https://www.blitzforum.de/upload/file.php?id=9581 https://www.blitzforum.de/upload/file.php?id=9580 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group