TileEngine. Wie funktionierts

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

TileEngine. Wie funktionierts

Beitrag 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?
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
Benutzeravatar
hörmi
Beiträge: 106
Registriert: 10.07.2007 15:20
Kontaktdaten:

Re: TileEngine. Wie funktionierts

Beitrag 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.
BildBild Bild
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Re: TileEngine. Wie funktionierts

Beitrag 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
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Re: TileEngine. Wie funktionierts

Beitrag von Codusa »

Danke Leute, dann ist es ja doch relativ einfach :)
THX :allright:
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Re: TileEngine. Wie funktionierts

Beitrag 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
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Re: TileEngine. Wie funktionierts

Beitrag 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-
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: TileEngine. Wie funktionierts

Beitrag 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 ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Re: TileEngine. Wie funktionierts

Beitrag 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 <) )
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Re: TileEngine. Wie funktionierts

Beitrag 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
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Re: TileEngine. Wie funktionierts

Beitrag von Codusa »

Sehr genial!
Danke!!! :allright:
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
Antworten