Tilemap
Übersicht

![]() |
AraneABetreff: Tilemap |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Bis dann gn Lennart *gähn* |
||
![]() |
AraneA |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group