Zurück   Flashforum > Flash > ActionScript > Spielkonzepte und Spieleprogrammierung

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 22-04-2010, 14:42   #1 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
TileBased Game und Gebäudeverwaltung

Wollte mal kurz eure Anregungen hören

Folgende Situation:
Wenn ich eine TileBased Map habe und diese über einen 2D-Array
verwalte komm ich zu folgendem Problem.

Der Array wäre wie gesagt ungefähr so aufgebaut:
Code:
[
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0]
]
Die einfachste Methode ist ja nun für jedes Element ein entsprechendes Bitmap zu laden.

Nun überlege ich aber wie ich es anstellen kann, dass ich Gebäude unterschiedlicher Dimension einbauen kann sprich ein Gebäude das vom Grundriss nicht unbedingt eine n x n Größe hat sondern vllt sowas:
Code:
[
 [a, b, c],
 [d, 0, 0]
]
Also eine L-Form besitzt. Nun überlege ich, wie ich dieses am besten in die Globale Map einbauen kann.

Das Problem was ich habe ist ja, dass ich zwar in die Map einfach die entsprechende BitmapZahl eintragen könnte, ABER ich möchte es ja auch so anstellen, dass das Gebäude dann bei jedem seiner Sprites anklickbar ist um dieses eventuell zu verwalten.

Nun frage ich euch wie ist es am sinnvollsten?

- Einfach die Sprites in die Map zu schreiben und die Verwaltung einfach auslagern in eine Klasse für dieses Gebäude, dass bei Klicks auf gewisse Tiles anspringt?

- Den Array abzuändern und dort die Tiles selber reinzuschreiben, sprich die Klasse für das Gebäude hätte selber mehrere Tiles.

Ich möchte es natürlich so praktisch wie möglich machen, ohne viel aufwand zu erzeugen und in dier Hierarchie herumzuhüpfen oder mich zu den jeweiligen Klassen hochzuarbeiten.

Würd mich über ein paar Vorschläge freuen
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 23-04-2010, 19:06   #2 (permalink)
Flashbitch
 
Benutzerbild von X-Tender
 
Registriert seit: Oct 2003
Ort: Hannover
Beiträge: 279
Spontan fällt mir die Möglichkeit ein das du nicht einzelne werte in das array schreibst sondenr ein Objekt. z.b. um dein beispiel aufzugreifen.

Code:
[
 [{id:10},{id:0,parent:new Point(0,0)}, {id:0,parent:new Point(0,0)}],
 [{id:0,parent:new Point(0,0)}, 0, 0]
]
d.h. wenn du z.b. auf die Zelle X 1 und Y 0 klickst schaust du ob er eine ID hat die ein sprite speichert. wenn es 0 ist heisst es das es kein sprite hat.
dan nschaust du ob die zelle ein untergeordnetes Tile ist. d.h. die parent.x und parent.y geben die Ursprungszelle an, die ist in diesem fall 0/0.
so kannst du die rauskriegen welche sprite ID dazugehört.

falsl du jetzt z.b. belim klicken auf auf zelle 2/0 das sprite aus dem array löschen willst würde ich wieder vom parent aus ausgehen und mit einer schleife die umliegenden felder durchschauen ob es zellen gibt die zu dem parent tile hinzeigen. da leert man entsprechend den inhalt im array.

es gibt da bestimmt noch andere methode, aber die ist mir spontan in den kopf gekommen
__________________
Fuchtelworld
X-Tender ist offline   Mit Zitat antworten
Alt 23-04-2010, 20:51   #3 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.869
ich würde es wohl so machen:
3 Listen,
- die map
- Liste der Gebäude
- Liste der Grafiken

in der Map würde ich Hash-werte nehmen: uint bietet 32 Bit zahlenraum
die ersten 16 Bit für als ID des Gebäudes, die letzten 16 als Definition für Grafiken.

ein Beispiel: Wert für das Feld in der Map: 1376391
Binär:
wert: 0000 0000 0001 0101 0000 0000 1000 0111
gebäude_nr: 0000 0000 0001 0101
grafik_nr: 0000 0000 1000 0111

Hexadezimal:
wert: 0015 0087
gebäude_nr: 0015
grafik_nr: 0087

Dezimal:
wert: 1376391
gebäude_nr: 21
grafik_nr: 135

und auch wenn das jetzt kompliziert klingen mag ist das im Code garnicht:
ActionScript:
  1. //auslesen
  2. var wert:uint = map[x][y];
  3. var gebäude_nr:uint = wert >> 16;
  4. var grafik_nr:uint = wert & 0xFFFF;
  5. var gebäude = gebäudeliste[gebäude_nr];
  6.  
  7. //zusammenstellen
  8. wert = (gebäude_nr << 16) + grafik_nr;
  9. map[x][y] = wert;

Sinn:
- daten sind sehr kompakt
- Bit-Operationen sind seeeehr performant!
- ein uint-wert verbraucht sicher weniger Platz als jedes Objekt/Array
- du kannst so 65535 Gebäude und 65535 verschiedene Grafiken verwalten.
- alle weiteren Informationen zum Gebäude verwaltest du in der Gebäudeliste.

weiterhin würde ich beim Gebäude auch eine Liste der belegten Felder mit abspeichern
__________________
greetz Thomas

plz RTFM & Coding Conventions

Geändert von thomas_E (23-04-2010 um 20:56 Uhr)
thomas_E ist offline   Mit Zitat antworten
Alt 24-04-2010, 00:16   #4 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
Das ist eine gute Idee ^^

Das ich keine Objekte reinschreiben wollte war eben der Punkt an dem ich verzweifelt bin aber alle 3 Werte durch ein uint darzustellen ist perfekt

Vielen dank
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 24-04-2010, 00:45   #5 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.869
Zitat:
alle 3 Werte
äääähm 3?
hab ich was übersehen?

du weisst, dass du die Bereiche dann aber anders einteilen musst (nicht 16+16+x)
du hast 32 Bits zur verfügung und musst darin festlegen, welches "Feld" wiviel davon in Anspruch nimmt. dementsprechend die Anzahl der darin zur Verfügung liegenden Kombinationen.
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist offline   Mit Zitat antworten
Alt 24-04-2010, 12:59   #6 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
jaja es war spät ich weiß dass es nur 2 zahlen sind
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mathematik.. -> TileBased Kollisionsabfrage schmidi Spielkonzepte und Spieleprogrammierung 12 04-01-2007 15:52
TileBased-Game Frage zum sinnvollen erstellen von Tile-Objekten utman6 Spielkonzepte und Spieleprogrammierung 4 17-04-2006 18:32
textfeld erstellen in tileBased-game springingerl ActionScript 1 2 16-12-2005 09:06
Tilebased Game - Performance? modularmax Flash MX 2004 5 14-10-2005 12:56
Deutsche übersetzung von tilebased game tutorial ! Showmaker Am Rande 20 05-04-2005 08:11


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:04 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele