Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Copax

Frischling

  • »Copax« ist der Autor dieses Themas

Beiträge: 17

Beruf: Fachinformatiker

  • Private Nachricht senden

1

02.01.2014, 08:17

Datenbanken oder Array? Auslagern von Daten für Maps und Spielerwerte

Aloha,

ich habe schon ein wenig gesucht, aber bis jetzt noch keine Antwort gefunden. Das Problem ist folgendes: Ich würde gern ein Spiel programmieren aber wenn man die Map und Spielerwerte in ein Array speichert hat man zu schnell das Problem, dass das array überläuft. :whistling: Daher kam mir die Idee eine Datenbank zu füllen und von dort die Werte auslesen zu lassen. Nun habe ich aber bei meinen Recherchen gelesen das viele der Meinung sind Datenbanken wären ungeeignet. Meine Frage ist nun ob das wirklich so ist? Hab auch von der Möglichkeit gehört das Array auszulagern (als Datei auf der Festplatte und von dort die Daten abzurufen wie man sie gerade braucht nur habe ich keine Ahnung wie man das realisiert). Wäre toll wenn mir jemand mal ein paar Denkanstöße geben könnte. Es reicht schon wenn ich weiß nach was genau ich suchen muss^^

Dankefein schon mal im Voraus :D
"Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt."



Albert Einstein

2

02.01.2014, 09:58

Ich bin jetz noch nich wirklich lang dabei.

Also was ich gesehen hatte für n 2D-Spiel auf Tiles basierend - son Jump n Run spiel war das. Da waren die einzelnen Level alle als Dateien ausgelagert und am Anfang eines Levels wurde der jeweilige Level dann aus der Datei ausgelesen und in vorher von der größe her nicht festgelegten Array gespeichert.

dabei wars dann so, dass mit verschiedenen Buchstaben in dem Dokument dann die verschiedenen Teile ausm Level dargestellt wurde.
dann wurd immer jede zeile ausgelesen. Erst eine Zeilenlänge (alle Zeilen müssen gleich lang sein sonst gibt der ne Exception raus) und dann die Anzahl der Zeilen und anhand dessen wird dann erst der Array der die Level elemente enthält deklariert. und anschließen für jeden Buchstaben die dazugehörigen Tiles generiert.

und dann wurd eben nur gezeichnet was in der aktuellen Kameraposition zu sehen war.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

3

02.01.2014, 10:23

Wie groß ist denn dein Array? Bzw. warum scheint es eine feste Größe zu haben?
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

02.01.2014, 13:16

Und für welchen Zweck? Wenn du ein Multiplayer Spiel schreibst macht eine Datenbank schon Sinn, wenn du die Welt permanent verändern willst...
Aber da ich aktuell nicht davon ausgehe denke ich auch dass Arrays reichen sollten. In welcher Sprache schreibst du denn? Ich weiß jetzt natürlich nicht ob du Anfänger bist, aber evt. brauchst du einen container und weißt es nicht?

C-/C++-Quelltext

1
2
std::vector<int> data = {4, 5, 6, 7};
data.push_back(8); // macht den container um 1 Element größer


Gibts natürlich auch alles in anderen Sprachen ^^

Copax

Frischling

  • »Copax« ist der Autor dieses Themas

Beiträge: 17

Beruf: Fachinformatiker

  • Private Nachricht senden

5

02.01.2014, 14:17

Danke erstmal für die vielen Antworten..

Ich schreibe in C++ und nutze SDL.. Das Problem ist, das die Karten 1.) Zufällig generiert werden sollen und 2.) gespeichert und geladen werden sollen.
Ein Array reicht für 1. aus, aber ich weiß nicht wie ich es speichern soll. Für mich wäre wichtig das jedes Feld verschiedene Parameter bekommt (z.B. Wald, Wiese, Wasser.. ; Rohstoffe; Einheiten und Gebäute usw.) Soll eine Art Aufbauspiel werden. Nehmen wir mal an es ist zu schwierig, mit welcher Technik könnte man das alles bei festen Map´s realisieren? Bin noch nicht so geübt in C++ da ich vorher zwei andere Sprachen gelernt habe und jetzt umgestiegen bin.

Das mit den Tile´s sieht erstmal vielversprechend aus.. wo finde ich zu dem Thema gute Tuts??

THX ^^
"Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt."



Albert Einstein

6

02.01.2014, 14:44

hm... um speicherstände hab ich mich bisher noch nie gekümmert.
meine pure anfänger idee wäre sonst.
du generierst die Karte und erzeugst beim speichern dann für die Karte ne Datei, in der schonmal alle Felder (ohne einheiten und ressourcen) sind.
und dann kannst du ja in ner zweiten Datei oder innerhalb der Datei drunter dann ne liste machen, wo welche einheiten was für ressourcen etc sind.
und beim speichern löscht du dann eben immer die Liste, und schreibst neu rein wo was gerade steht - eventuelle Landschaftsänderungen kann man ja auch einfach durch überschreiben sichern.

beim neu erstellen deiner Welt wird sie eben erzeugt und du hast die im speicher - ggf kannst du hier auch schon n ersten speicherpunkt setzen. Wenn du dann "speichern" drückst, wird alles an informationen in ne Datei geschrieben. und beim Laden wird einfach alles wieder aus der Datei ausgelesen, damit es wieder im speicher is und du damit weiterarbeiten kannst.
ich denke mal deine zufallswelten werden ja nicht unendlich riesig sein. ist nur die frage wie man das in der datei speichert, wenn du z.b. nich soo viele geländearten hast kannst ja für jeden geländetypen einen eindeutigen buchstaben nehmen und dann darunter in der liste

alle ressourcen
ressourcen art, koordinaten, verbleibende ressourcen auf dem Feld

alle spieler
erforschte technologien, ressourcen

alle einheiten
einheiten typ, koordinaten, leben übrig (,.. andere eigenschaften die nicht konstant sind, z.b. gerade erhaltene buffs oder ähnliches)


so hättest du dann einmal die Landschaft
und danach setzt er dann ressourcen einheiten etc oben drauf, wie wenn du n brettspiel aufbaust - erst brett aufklappen dann einheiten raufstellen :D

bin mir aber nicht sicher ob das sinn gibt, gibt wohl auch schönere Lösungen, aber so würd ichs wohl versuchen wenn ich mir was ausdenken müsste^^ n tutorial kenn ich dazu leider noch nicht.

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

7

02.01.2014, 14:45

Könnte man so ein Array/Container nicht einfach serialisieren?

Copax

Frischling

  • »Copax« ist der Autor dieses Themas

Beiträge: 17

Beruf: Fachinformatiker

  • Private Nachricht senden

8

02.01.2014, 14:57

So in der Art habe ich es mir auch schon gedacht, aber es wäre eben sehr viel schöner wenn man es als 3D-Array speichert finde ich. Da kann man 1. und 2. Dimension als Koordinaten nutzen und die 3. für die Daten.. vlt. liege ich mit dem Gedanken aber auch falsch.. nun zu dem Problem das ich keine Ahnung habe wie man ein 3D-Array ordentlich speichert ohne ein Wirrwar zu bekommen.
"Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt."



Albert Einstein

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

02.01.2014, 17:41

Nimm lieber einen objektorientierten Ansatz, indem du z.B. Layer anlegst, in denen du dann deine Felder speicherst (mit einem vector z.B.).
Dann kannst du beliebig viele Layer verwalten mit verschiedenen Aufgaben. Jedes Feld hat dann eine Nummer oder was auch immer du brauchst.

Mal die Idee:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Tile{ // ein Feld
public:
int id;
// hier könnten noch mehr Informationen zum Tile gespeichert werden
};

class Layer{
public:
std::vector<std::shared_ptr<Tile>> tiles; // die Tiles ansich, hier als Zeiger, Index in dem Array kann man aus x und y errechnen
};

class Map{
public:
std::vector<std::shared_ptr<Layer>> layer; // Layer der Karte
};


Was das speichern angeht könntest du dir ja mal ansehen was Tiled macht.

10

02.01.2014, 23:09

Du kannst aber auch eine Art Chunk-Format wählen. Dann liest du für jedes Tile erst die IDs und nimmst dann den entsprechenden Loader, der für ein Tile dieses Typs all Werte ausliest. (s. 3DS Format).

Werbeanzeige