Seite 1 von 3

TileEngine. Wie funktionierts

Verfasst: 15.06.2010 17:03
von Codusa
Hallo,
Ich habe vor, eine 2D TileEngine zu programmieren und möchte ersteinmal Grundsätzliche Dinge wissen:

Wenn ich es richtig verstehe, dann besteht eine Tileengine aus einem Array dessen Inhalte nach und nach abgefragt werden und
dann auch angezeigt. Bsp:

Code: Alles auswählen

Umgebung(1)\Art = Baum
Umgebung(1)\x = 2
Umgebung(1)\y = 3
Dann wird ein Koordinatensystem erstellt mit z.B. 30*30 Feldern jedes Feld kann eine Sache(oder 2,3, wie auch immer) enthalten.
Hier hätte dann das Feld 2|3 als Inhalt einen Baum. Als zusätzliche Information könnte man sagen "Nicht begehbar".
Der Spieler kann sich von Feld zu Feld bewegen und die TileEngine prüft dann immer, wo er ist, ob er da lang gehen kann oder nicht, und
löscht ihn aus dem Feld aus dem er kommt.

Sehe ich das richtig? (Sry wenn nicht)

Und wie funktioniert das dann eig in 3D?

Re: TileEngine. Wie funktionierts

Verfasst: 15.06.2010 18:10
von hörmi
Ich würde aufjedenfall ein zweidimmensionales Array benutzen.
Also:

Code: Alles auswählen

Dim Umgebung(30,30)
Dann ist auch das abfragen einer position einfacher als wenn du die Koordinaten in die Struktur reinschreibst. Aber sonst würd ich es so ähnlich machen wie du es beschrieben hast.

Re: TileEngine. Wie funktionierts

Verfasst: 15.06.2010 18:22
von a14xerus
also ich hatte mal ein spiel mit einer eigenen (kleinen und nur dafür angepassten) tile-engine

also 2 dim array
tile(x,y)
oder 3 dim array
tile(x,y,layer)

mit struktur
\art
\begehbar
\anderelustigesachen

und dann mit schleife for..next jeweils sichtbaren x und y bereich durchgehen und anzeigen :)

viel mathematik einfach nur.. also welcher bereich wird grade angezeigt.. wieviele tiles werden angezeigt... wie groß ist ein tile, welche x position ist es auf dem screen wenn mein bildauschnitt an dem und dem punkt ist und sich die figur an dem un dem punkt auf der weltkate befindet...

viel Rechnerei.. ic habs einfach ausprobiert bis alles so geklappt hat wie ich wollte :)

man konnte damals sogar bei meinem game sogar im netzwekr zusammen rumlaufen auf ner map wo es gras (begehbar), wald (nich begehbar) und wasser (nicht begehbar, wassergeräusche -> lautstärke je nach entfernung) gab :)

seit den hab ich den pc mindesten 4 mal formatiert.. mal sehen ob ihc den source noch iwo finde :D

Re: TileEngine. Wie funktionierts

Verfasst: 15.06.2010 18:32
von Codusa
Danke Leute, dann ist es ja doch relativ einfach :)
THX :allright:

Re: TileEngine. Wie funktionierts

Verfasst: 15.06.2010 18:34
von a14xerus
Zu alt und zu hässlich um es bei "Codes Tipps und Tricks" rein zu stellen:

leider nicht mein erwähntes Spiel, dafür ein angefangenes Remake (einfach nur zum üben) von "Herrscher des Olymps - Zeus" ^^

http://hosting.alexander-n.de/=MTIwLjEyNzY2MTk2ODg=

Alles dabei was man braucht ^^

Im Ordner "Installer" ist das was dann an den Kunden geliefert werden würde, wenn es Kunden geben würde ;)
Alles andere ist nur für die Entwicklung nötig ^^

Achso: Scrollen mit rechtsklick - gedrückt halten
Zoomen mit Mausrad

Rechts am Bildrand ist ein (leeres) Menü was eingeblendet wird, wenn die Maus in die nähe kommt ;)

es gibt sogar ein MapMaker ^^ Scrollen geht hierbei mit den Numtasten 4 8 6 und 2

Re: TileEngine. Wie funktionierts

Verfasst: 15.06.2010 20:15
von Codusa
a14xerus hat geschrieben:Zu alt und zu hässlich um es bei "Codes Tipps und Tricks" rein zu stellen:

...
Achso: Scrollen mit rechtsklick - gedrückt halten
Zoomen mit Mausrad

Rechts am Bildrand ist ein (leeres) Menü was eingeblendet wird, wenn die Maus in die nähe kommt ;)

es gibt sogar ein MapMaker ^^ Scrollen geht hierbei mit den Numtasten 4 8 6 und 2
Wenn du es kommentierst, ist es ein Segen für jeden Anfänger der etwas in dieser Richtung machen will :D
Ich bin erstmal ziemlich begeistert von AnticCity und wusel mich direkt mal durch deinen Code :)

Großes Danke! :allright: :bounce: :allright: :praise:

-Codusa-

Re: TileEngine. Wie funktionierts

Verfasst: 16.06.2010 02:13
von Bisonte
Also als Einstieg, kann ich den Thread http://www.purebasic.fr/german/viewtopi ... =3&t=13624 empfehlen, in dem beinahe das komplette Usarium des Forums einem Hilfesuchendem die Tile - Engine Schritt für Schritt erklärt hat ...

Danach hab sogar ich das gerafft ;)

Re: TileEngine. Wie funktionierts

Verfasst: 16.06.2010 15:06
von Codusa
Bisonte hat geschrieben:Also als Einstieg, kann ich den Thread http://www.purebasic.fr/german/viewtopi ... =3&t=13624 empfehlen, in dem beinahe das komplette Usarium des Forums einem Hilfesuchendem die Tile - Engine Schritt für Schritt erklärt hat ...

Danach hab sogar ich das gerafft ;)
Danke! :allright:

@a14xerus
Werden alle Tiles gezeichnet pder nur die, die man tatsächlich sieht?
(Wenn Letzteres zutrifft sag mir Bitte wie <) )

Re: TileEngine. Wie funktionierts

Verfasst: 16.06.2010 17:01
von a14xerus
wenn ich mich richtig erinner sollten nur die gezeichet werden die man tatsächlich sieht.


im code von antic city in der drawing.pbi steht folgendes:

(Das ist die einzige Procedure die fürs zeichnen der Map zuständsig ist)
k und i sind die durchlaufvariablen für x und y
dabei halt nicht x und y in pixeln, sondern fürs tile aus dem array
also tile nummer k,i ^^
dieses wird dann an position x,y auf dem screen gemalt, weil es auf position x2,y2 auf der map ist :D

jaja sehr kompliziert;)

also:
k,i, startX, startY, endeX, endeY sind die Tile-nummern
pos\x & pos\y sind die reale position in pixeln auf der map
screenX und screenY sind die position in pixeln auf dem screen

Den rest habe ich als kommentar in den code geschrieben

Code: Alles auswählen

Procedure map_draw()
  Static startX.l, endeX.l, startY.l, endeY.l
  Static i.l, k.l, ScreenX.l, ScreenY.l
  
  startX = Pos\x/tile\x-2
  endeX = Pos\x/tile\x+anzahlx+2
  startY = Pos\y/tile\y-2
  endeY = Pos\y/tile\y+anzahly+2

  ; zeige alle tiles an die sichtbar sind PLUS 2 oben, unten, rechts, links, damit wirklich keine lücke am rand sichtbar ist.

  ; das "erste" X- Tile ist also an der realen position "pos\x" geteilt durch die Tilebreite "tile\x" -2 (sicherheitsabstand)

  
  
  
  If Start3D()
    For k = startY To endeY
      For i = startX To endeX

  ; in 2 schleifen somit den ganzen x,y bzw k,i bereich durchgehen

        If i > 0 And i < #Map_W And k > 0 And k < #Map_H

  ; wenn man sich am rand der karte befindet überprüfen, das man nicht auf tiles auserhalb der karte zugreifen will

          ScreenX = (i*tile\x)-Pos\x

  ; screenposition bestimmen (vorher ja nur mit realer position gerechnet)
  ;x in pixel auf screen = (i (=x-nummer des tiles) mal die größe eines tiles) minus die aktuelle x position in real

  ; gleiche mit y 

          If i & 1
            ScreenY = (k*tile\y)-Pos\y
          Else
            ScreenY = (k*tile\y)-Pos\y + tile\y / 2
          EndIf

  ; überprüfen, ob die map an der k,i position in dem layer ein tile besitzt, wenn ja sprite überprüfen und aneigen

  ; das zoomen wird durch eine andere funktion geändert, die automatisch die tilegrößen tile\x und tile\y verändert

          If Map(i,k)\Layer1
            If IsSprite3D(Map(i,k)\Layer1)
              ZoomSprite3D(Map(i,k)\Layer1, tile\x*2, tile\y)
              DisplaySprite3D(Map(i,k)\Layer1, ScreenX, ScreenY, 255)
            EndIf
          EndIf
          If Map(i,k)\Layer2
            If IsSprite3D(Map(i,k)\Layer2)
              ZoomSprite3D(Map(i,k)\Layer2, tile\x*2, tile\y)
              DisplaySprite3D(Map(i,k)\Layer2, ScreenX, ScreenY, 255)
            EndIf 
          EndIf
          If Map(i,k)\Layer3
            If IsSprite3D(Map(i,k)\Layer3)
              ZoomSprite3D(Map(i,k)\Layer3, tile\x*2, tile\y)
              DisplaySprite3D(Map(i,k)\Layer3, ScreenX, ScreenY, 255)
            EndIf
          EndIf
          If Map(i,k)\Layer4
            If IsSprite3D(Map(i,k)\Layer4)
              ZoomSprite3D(Map(i,k)\Layer4, tile\x*2, tile\y)
              DisplaySprite3D(Map(i,k)\Layer4, ScreenX, ScreenY, 255)
            EndIf
          EndIf
          If Map(i,k)\Layer5
            If IsSprite3D(Map(i,k)\Layer5)
              ZoomSprite3D(Map(i,k)\Layer5, tile\x*2, tile\y)
              DisplaySprite3D(Map(i,k)\Layer5, ScreenX, ScreenY, 255)
            EndIf 
          EndIf
        EndIf
      Next
    Next
    
    Stop3D()
  EndIf
EndProcedure

Re: TileEngine. Wie funktionierts

Verfasst: 17.06.2010 06:52
von Codusa
Sehr genial!
Danke!!! :allright: