Tilemap und Objekte

Anfängerfragen zum Programmieren mit PureBasic.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Tilemap und Objekte

Beitrag von obar »

Habe grundsätzliche Fragen zu den Maps mit Tiles von 32x32.

- Setzt ihr die objekte ebenfalls mit dem Editor?
- Wie macht ihr das, wenn Objekte 16x16 Grösse haben?
- Nimmt man dazu ein neues Array in der Grösse der Map?
- Wie speichert ihr die Informationen, wenn man z. B. ein txt File macht.
Zuerst Map in eine txt und danach Objekte in eine separate txt Datei?
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

- Setzt ihr die objekte ebenfalls mit dem Editor?
Das kannst du halten wie du willst, ist aber eine sehr praktische Sache, wenn man nicht nur das Level an sich mit dem Editor bearbeiten kann.
Wie macht ihr das, wenn Objekte 16x16 Grösse haben?
Das liegt doch auf der Hand, man platziert die Objekte einfach in der Mitte der Tiles. Natürlich kann man auch Pixelgenau platzieren... in deiner Welt funktioniert alles nach deinen Regeln.
- Nimmt man dazu ein neues Array in der Grösse der Map?
Nein, auf gar keinen Fall, das wäre ja eine Gigantische Verschwendung von Speicher. Du hast eine wie auch immer geartete Liste von Objekten und Wertest beim Zeichnen deren Koordinaten aus. Hast du extrem viele Objekte und Performance Sorgen, dann kannst du schon deine Objektliste in irgendeiner art vorsortieren, zum Beispiel in einem schönen Quadtree... aber nicht mit der Baumtiefe übertreiben.
- Wie speichert ihr die Informationen, wenn man z. B. ein txt File macht.
Zuerst Map in eine txt und danach Objekte in eine separate txt Datei?
Text würde ich zumindest für die Karte nicht nutzen, denn den musst du dann ja auch noch parsen, mal abgesehen dass das keinen Vorteil aber viel Fummelei bringt. Für die Objekte könnte man das schon in Erwägung ziehen, macht aber auch nur da sinn, wo die Objektliste von Hand editierbar sein soll. Also besser zu einem einfachen Binären Format greifen, statt mühselig an Textdateien rum pfriemeln.

Die Karte von der Objektliste getrennt zu Speichern ist hingegen eine recht gute Idee, aber auch da gilt: wie du es willst, denn beides funktioniert.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Was heisst das nun genau. Sollte man nur eine Structur erstellen wo alle Infos drin stehen, sowohl Map als auch die Objekte?

Oder besser gefragt wie könnte so eine Struktur aussehen?
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Das heißt, dass es meistens besser ist die Karte von den Objekten separat zu Speichern, es aber nicht notwendig ist. Beides funktioniert gut, aber es ist nicht unwahrscheinlich, dass du die selbe Karte vielleicht zweimal in unterschiedlichen Szenarios nutzen willst, dann ist es blöd wenn da auch die Objekte im selben File hängen.

Eine einfache Mapstruktur ist im simpelsten Fall ein einfaches array, dass du genau so wie es ist Speicherst und lädst und kann beliebig komplizierter werden, je nachdem welche Funktionen du umsetzen willst.

Ich nutze zb für maps meistens eine Struktur, in der die ersten beiden Longs breite und höhe der Map darstellen, dann vielleicht 255 bytes für einen einfachen Stringnamen und dann die Array Daten.
Modelle mit mehreren gleichgroßen Arrays, die in dem Fall Layern repräsentieren, ist auch nicht selten.

Eine Struktur für Objekte wird je nach dem was du vorhast sehr unterschiedlich aussehen. Dafür würde ich eine Struktur anlegen, die alle von dir Benötigten Informationen enthält (x-position, y-position, Lebensenergie, derzeitige Aufgabe, derzeitige Intention, aktuell dargestelltes Frame, etc) und dann eine LinkedList, ein Array oder ein Baum dieser Struktur anlegen, in der du die Daten pro Objekt/gegner/etc verwaltest.
Wenn du unterschiedliche Arten von Objekten hast (zb Spieler verwaltete Figuren, Gegner, Ausrüstungsgegenstände), solltest du sie aber voneinander getrennt aufbewahren, dass wird es dir später sehr viel leichter machen die Spiellogik umzusetzen.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Danke vielmal für deine Antworten.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Habe ein neues Problem. Ich möchte bei meiner kleinen Tilemap-Engine eine kleine Box einbauen,
die mir die momentane Position auf der Map anzeigt. Leider find ich nicht raus wie ich das berechnen muss.
Die 2 Box die sich in der grösseren Box bewegen soll, passt sich in der Grösse der Map an. Damit ein richtiges Grössenverhältnis entsteht.


Ich hab mal so angefangen.

Code: Alles auswählen

Box(650, 30, 100, 50, col)
Box(650+?,30+?,Int(99*20)/mapWidth,Int(49*13)/mapHeight,col)
Als Zähler für die X/Y Achse, hab ich gedacht, ich könnte die Werte von MapX und MapY verwenden. Diese zählen jeweils eins hoch, wenn ich die grosse Map, wo ich die Tiles setze, bewege.

Kann mir hier jemand Tipps geben, oder zeigen wie man dass berechnen kann?
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Hi,

also was bedeutet momentane Position auf der Map?
Willst du das Tile wissen oder wie Angabe in Pixeln?
Tile = int(AngabeinPixeln/32)

Und wieso passt sich die kleine Box immer der Map an?
Was für ein Größenverhältnis willst du einhalten?

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Ich habe unten den Editor, wo ich die tiles auf die Map einfüge.
Die hat eine Grösse von 19x13 Tiles, wobei jedes Tile 32x32 gross ist.
Jetzt kann es ja sein das die Map, die erstellt werden soll 1000x1000 gross ist.
Nun wollte ich oben links eine Darstellung erzeugen, die mir sagt wo ungefähr
ich mich auf der Map aufhalte. Das wollte ich mit einer Box darstellen. Wobei die
kleinere Box darin den momentanen Mapausschnitt darstellt. Ich hoffe hab es einigermassen verständlich erklärt.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

OK, klar

Also du hast eine Postition auf der Map:
PosX = 10 (10tes Tile von Links)
PosY = 20 (20tes Tile von oben)

Dann brauchst du noch die Map Breite und Höhe:
MapWidth = 1000 Tiles
MapHeight = 1000 Tiles

Dann brauchst du die Map Breite und Höhe der verkleinerten Darstellung:
MiniMapWidth = 100 px
MiniMapHeight = 100 px

Die kleine Box ist jetzt mal 1px x 1px groß...

Dann ist ihre aktuelle Position:
MiniX = PosX / MapWidth * MiniMapWidth => 10/1000*100 = 1
MiniY = PosY / MapHeight * MiniMapHeight => 20/1000*100 = 2

Diese Position sollte dann natürlich noch korrekt gerundet werden...
MiniX (5) = 0,5 => 1
MiniY (19) = 1,9 => 2

In Worten rechnest du die relative Position auf der großen Map aus und überträgst diese mit dem Dreisatz auf die kleine Map...

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Super. Danke hat geklappt. :D
Antworten