Tilemap

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

AraneA

Betreff: Tilemap

BeitragFr, Jan 12, 2007 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ich schreib hier mal, uim ein paar Meinungen und Anregungen zu hören.
Ich hab angefangen eine kleine Tile-Enigne zu programmieren. So weit funktioniert auch alles klasse. Hab ne recht gute Bewegung und Kollision und auch sachen wie Teleporter, Fallen oder Schilder funktionieren super.

Früher hab ich immer viele layer erstellt, z.B.
1-Boden
2-Kollision
3-Objekte
..

Jetzt hab ich mir was anderes überlegt, und zwar hab ich bis jetzt nur 2 Layer
einen für den Boden und den anderen für den Rest.

Der 2te Layer dient also für Kollision, Teleporter, und alles andere.
Als Beispiel:
0 = es passiert gar nix
-1 = nur Kollision

500-1000 Teleporter
1000-1500 Fallen
etc..

ich geb also diesem ObjektLayer jeweils die Id eines Teleporters, der als Type erstellt wird.
Läuft der Spieler auf ein Tile, und dieses ist zB 501, so benutzt er den Teleporter mit der Id=1.

Jetzt wollte ich mal fragen, was ihr von dieser Methode haltet.
Bis jetzt klappt zwar alles super, aber es kann ja sein, das ich dann später auf Probleme damit stosse. Und dann hab ich sicher keine Lust den gesamten Code wieder umzubauen..

Ich hoffe mal, dass einige anregungen oder bemerkungen kommen Wink
Bis dann - Lennart

Falls ihr sehen wollt, wie es bis jetzt klappt, um euch ein Bild davon zu machen und jemand bereit wäre das mal hochzuladen könnte ich demjenigen noch mal ne demo schicken...
 

Dreamora

BeitragFr, Jan 12, 2007 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich sollte das funktionieren.
Das Problem ist, dass deine Welt dann nur aus 1 Ebene bestehen kann, was je nach Zielsetzung wohl kaum ausreichen wird vermute ich jetzt einfach Mal.

Insofern wärs vermutlich einfacher wenn du die TileLayer aus Types aufbaust, dann kannst du dort Daten reinspeichern die wichtig sind (kollision, bestimmte Dinge die man damit machen kann, Objekt das darauf steht / liegt)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

AraneA

BeitragFr, Jan 12, 2007 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie meinst du das mit einer Ebene?
meinst du verschiedene Etagen in einem Haus oder mehrere Grafik-Layer
oder meinst du, dass dann immer nur entwerder ne Kollision oder irgend was anderes auf einem Tile sein kann?

Führ mal bitte etwas genauer aus, wie du das meinst...
Vielen Dank, mfg Lennart

TheShadow

Moderator

BeitragFr, Jan 12, 2007 23:37
Antworten mit Zitat
Benutzer-Profile anzeigen
ne ich empfhle nicht types pro tile zu erstellen...

cooler wäre ein unsichtbarer datenlayer - etwa mit bank. da hast du werte 0-255 (bei byte)

und jedem wert kannst du dann einen type zuordnen... also max 256 types...


bei großen karten nimmst du keinen datalayer, sondern du erstellst dann aber separate objekte mit type - wo du x/y koordinate speicherst....
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

AraneA

BeitragSa, Jan 13, 2007 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
naja so in etwa mach ich das ja aber ohne bank

also ich zeig mal in etwa, wie ich das mache:
kurzer Codeausschnitt (vereinfacht)
Hier mal mit Teleportern:

Code: [AUSKLAPPEN]
Global telec  =1000
Global telemax  =200

Type teleporter
   Field id
   Field map$
   Field x#,y#
End Type

Function teleporter_new(id,map$,tx,ty)
   teleporter.teleporter    = New teleporter
      teleporter\id          = id
      teleporter\x           = tx
      teleporter\y           = ty
      teleporter\map          = map
End Function


;Hier wird jetzt (noch im Code, später im Editor selbst) ein neuer Teleporter erstellt. Dieser kann später von mehreren Tiles benutzt werden.
teleporter_new(1,"wald",100,100)

Hier wird der Teleporter auf ein Tile gesetzt
   map(tx,ty,0) = telec+1


Hier wird jeweils das Tile,auf dem der Spieler steh überprüft:

Function player_check(player.player)
   id = map(player\tx,player\ty,map_lo)

   If  id > telec And id < e_telec+telemax Then
      teleporter_use(id-telec,player)
      Return 0
   End If
End Function


Und so wirds halt mit allen objekten gemacht..
Fallen, Schilder, usw

Ist jetzt verständlich, was ich meinte?

AraneA

BeitragSa, Jan 13, 2007 9:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Puh, das war ne harte Nacht, endlich schlafen..
Hab das ganze jetzt ein wenig umgebaut.
Die ganzen objekte sind raus.
Das ganze läuft jetzt über kleine Scripts.

Damit ist es möglich einem Tile unbegrenzt viele Eigenschaften zu geben.

Ich hab also nur einen Layer für Kollisionen und Scripte...
Klappt auch alles gut, mal sehen auf was für Probleme ich damit später noch stoße Wink

Bis dann gn Lennart *gähn*

AraneA

BeitragSo, Jan 14, 2007 0:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab nochmal ne Frage zu meinem Scriptkram.
Bis jetzt ist es so, dass ich für eine Map jetzt immer einen Ordner hab und da ist dann die map datei und alle scripte, die auf der map sind gespeichert.
die scripte lad ich dann, wenn sie ausgeführt werden sollen immer aus der jeweiligen datei.
Kann ich die scripte beim Laden der map auch in banks speichern und dann jeweils auf die bestimmte position in der bank lesen?
Hab mich mit Banks nie so beschäftigt, deshaöb die Frage..

Danke mfg Lennart

edit: wobei ich kann in banks nicht einfach strings speichern oder?
dann ist das wohl nicht so einfach zu machen

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Jan 14, 2007 2:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht hilft dir folgender Code: [AUSKLAPPEN]
Graphics 200,100,0,2
SetBuffer FrontBuffer()

Dim script$(1,3)

script$(0,0)="Hallo"
script$(0,1)="das"
script$(0,2)="is'n"
script$(0,3)="Test"

script$(1,0)="Zweiter"
script$(1,1)="Script"
script$(1,2)="zum"
script$(1,3)="lesen."

For y=0 To 3
 For x=0 To 1
  Text 50+x*100,10+y*20,script(x,y),1
 Next
Next

WaitKey
End

AraneA

BeitragSo, Jan 14, 2007 2:16
Antworten mit Zitat
Benutzer-Profile anzeigen
So, hab das ganze mit Arrays gemacht. Klappt gut und auch das ertellen von Scripts ist jetzt sehr einfach. ABer es offenbart sich damit für mich ein weiteres Problem.

Und zwar funktioniert die Ausführung eines Scriptes so:

Jeder Script (in einem Array hat sozusagen eine bestimmte id)
Beispiel:
Code: [AUSKLAPPEN]
dim script$(9,9)

script(1,0) = Hurt(20)
script(1,1) = SetTile(x,y,layer,frame)
script(1,2) = Teleport(x,y,map$)


Bei jedem Map-Laden wird dieses Array mit den in diesem Level benötigten Scripts gefüllt.

Nun zu dem Problem:
Wenn ich nun euf ein Tile lauf wird bei meinem Objekt-Layer der wert bestimmt:
-1 = kollision
0 = gar nix
>0 = id des scriptes

wenn ich also auf ein Tile mit dem Wert 1 laufe wird der script ausgeführt.

wenn ich jetzt zB mit dem script ein Tile im level ändere, dann aber in eine andere map teleportiere und dann wieder zurück, so ist das Tile wieder im ursprünglichen Zustand.
Speichere ich beim Map-Wechsel die Tiles immer ab, so wird meine Level-Datei überschrieben, und wenn ich das SPiel wieder starte, so sind all die Veränderungen schon enthalten.

Jetzt bin ich am überlegen, wie ich solche Level-Veränderungen für jeden Spieler speichere.
-Für jeden Spieler n eingenen Maps-Ordner? find ich irgendwie ziemlich blöd unf hab ich auch noch nie irgendwo gesehen...

Jetzt steh ich ziemlich aufm Schlauch und hab keine gute Idee, wie ich das lösen soll. Die Methode mit den Scripts, wie sie jetzt ist finde ich allerdings echt gut und möchte ich gern weiterverwenden.

Wenn jemand ne Anregung oder Idee oder vielleicht auch n Link zu nem Artikel, wie es vielleicht bei anderen Spielen gemacht wird hat wäre ich sehr dankbar.

Wenn jemand sehen will, was ich meine und wie es bis jetzt so aussieht bin ich gern bereit ne kleine Demo zu schicken...
Hab leider kein WebSpace, sonst würd ichs hochladen, damit das alles verständlicher wird...

Mfg und vielen Dank
Lennart
 

BIG BUG

BeitragSo, Jan 14, 2007 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Du speicherst nicht die Map, sondern nur den Spielstand. Dieser muss dann die entsprechenden Informationen darüber enthalten, was der Spieler alles getan hat, wo die Gegner stehen, welche Türe offen oder geschlossen ist, etc.
Und halt auch die Informationen darüber wie die Map aussieht. Hier hast Du mehrere Möglichkeiten:
1. Du speicherst, welche Scripte bereits alle gelaufen sind und lässt diese beim Laden einfach genau so laufen. Dies ist allerdings nur bei "einfachen" Scripten, ohne eigene Bedingungen praktikabel...
2. Du speicherst nur die Delta-Informationen zur Map, also alles was sich zur ursprünglichen Version verändert hat.
3. Du speicherst in Deinem Spielstand auch die komplette Map mit.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

AraneA

BeitragSo, Jan 14, 2007 12:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja so in etwa denk ich mir das auch, aber es ist halt schwer, da ich plane, dass ganze noch für Multiplayerspiele aufzustocken.
Wobei es dann auch nicht schwerer sein dürfte. Dann speichert halt der Server, wies auf der Map aussieht und die Clienten einzelnd, wies gerade um ihren Spieler steht.

du meinst ich soll dann jedem spieler noch n array gönnen, wo ich speicher, welche scripts in welchem level schon abgelaufen sind?

Das ist aber auch nicht ganz einfach zu machen...
Naja mal sehen, was sich noch ergibt, ich mach mir nochmal n paar Gedanken.

Wenn aber jemand noch n Tipp hat wär ich sehr dankbar.

DerHase

BeitragSo, Jan 14, 2007 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde einfach die Veränderung speichern. Wenn sich im z.B. Tilefield(34,16) von 3 auf 24 ändert würde einfach diese Koordinaten und den Wert in einem Spielstand speichern. In dem Header von der Spielstanddatei kommt dann zuerst die Anzahl der Veränderungen und dann die Positionen und Werte der Veränderungen. Nachdem das ursprüngliche Level geladen ist, verändern die Daten aus dem Spielstand die sich im Speicher befindende Tilemap.
Die Veränderungen kannst Du entweder beim Speichern rausfinden indem Du das ursprüngliche Level mit dem veränderten vergleichst (was ziemlich langsam werden kann) oder die Veränderungen in Types speicherst und deren Werte dann in den Spielstand schreibst.
Play Satyr!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group