Richtiger Umgang mit einer großen Menge an Resourcen

  • Antworten:7
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 43

28.11.2016 15:16:45 via Website

Hallo,
ich habe eine Frage:
Es gibt ja die Standard-Struktur der Resourcen res/drawable oder res/raw etc.
Ich entwickel momentan ein Spiel, bei dem es 100 Level geben soll. Jedes Level hat ein Daten-File welches ich unter res/raw ablege und ein Vorschaubild unter res/Drawable.
Um auf die Resourcen einfach zugreifen zu können habe ich mir ein Array erstellt:

int[] resourceDataID = {
        R.raw.level1,
        R.raw.level2,
        R.raw.level3,
        R.raw.level4,
        R.raw.level5,
        R.raw.level6,
        R.raw.level7,
        R.raw.level8,
        R.raw.level9,
        R.raw.level10,
        R.raw.level11,
        R.raw.level12,
        R.raw.level13,
        R.raw.level14,
        R.raw.level15
};

bzw.

int[] resourcePreviewID = {
        R.drawable.level1,
        R.drawable.level2,
        R.drawable.level3,
        R.drawable.level4,
        R.drawable.level5,
        R.drawable.level6,
        R.drawable.level7,
        R.drawable.level8,
        R.drawable.level9,
        R.drawable.level10,
        R.drawable.level11,
        R.drawable.level12,
        R.drawable.level13,
        R.drawable.level14,
        R.drawable.level15
};

Das ganze wird nun bei 15 Leveln schon sehr länglich und es erscheint mir nicht sinnvoll ein Array auf diese Weise mit 100 Defaultwerten zu belegen.

Gibt es noch eine andere Möglichkeit auf die Resourcen im Ordner zuzugreifen. Z.B. das Array über ihren Namen als String zu füllen, dass man etwas in dieser Art machen könnte:

for(int i = 0; i < 15; i++)
{
    resourceDataID[i] = ResourceByString("res/raw/level" + String.valueOf(i+1));
}

Irgend sowas in der Art "getResourceByStringName()" oder so. Ich möchte einfach ungern 2 Arrays händig mit 100 Einträgen füllen. Sowas muss sich doch mittels Schleife lösen lassen.
Oder sind die res/raw/ und res/drawable/ gar nicht für solch eine große Menge an Dateien gedacht?

Hoffe jemand weiß Rat, bei meiner Recherche im Netz bin ich immer nur auf die von mir verwendete Methode gestoßen, sich ein Array mit Defaultwerten selbst anzulegen oder statt dem Array eine XML-Datei zu verwenden, in der man aber dann wiederum die 100 Einträge händig füllen müsste.

  • Forum-Beiträge: 2.214

28.11.2016 15:21:31 via Website

Hallo Enrico,

da wo du jetzt ankommst , nennt man Spaghetti Code :-) (a la Basic)

Was spricht denn gegen eine Datenbank, die (von dir) gefüllt wird und / oder einem Asset, der bei der Installation
lokal synchronisiert wird ?

— geändert am 28.11.2016 15:22:35

Liebe Grüße - Stefan
[ App - Entwicklung ]

  • Forum-Beiträge: 43

28.11.2016 15:57:58 via Website

da wo du jetzt ankommst , nennt man Spaghetti Code :-) (a la Basic)

Genau deshalb möchte ich was dagegen unternehmen ;)

Eine Datenbank verwende ich bereits in meinem Projekt. Zu jeder in dem Array (resourceDataID) stehenden ID wird ein Seperater Eintrag in der Datenbank erstellt (sofern nicht bereits vorhanden).
Selbst wenn ich das Array weg lasse, muss ich dennoch beim Befüllen der Datenbank immer R.raw.level1, R.raw.level2, R.raw.level3,... schreiben um an die entsprechenden Resource-IDs heranzukommen. Das Problem das ich das ganze 100mal schreiben müsste besteht also dann immer noch.
Oder wie hast du es gemeint?

  • Forum-Beiträge: 2.214

28.11.2016 16:08:34 via Website

am besten ist erst mal , du erklärst , welche Daten denn in deinem (RAW) Resource drin sind .
dann kann ich auch genauer darauf eingehen.

— geändert am 28.11.2016 16:08:58

Liebe Grüße - Stefan
[ App - Entwicklung ]

  • Forum-Beiträge: 43

28.11.2016 16:21:19 via Website

Naja, alle Infos die zum Level dazu gehören: Alle Spielelemente, Koordinaten, Geschwindigkeiten, Bewegungsrichtungen, Eigenschaften, Hindernisse, Feinde, TileMap, etc... Alles was eben zu einem Level dazu gehört. Also ein reines Datenfile.
Zu jedem Level gibt es eben ein solches File, welches ich mit einem eigenen in C# geschriebenen Level-Editor erstelle oder editiere.
Diese Datei ist dann das einzige was meine Game-Engine braucht um das Level auf den Screen zu bringen und zu spielen.
Die erreichten Punkte zu jedem Level werden über die Datenbank verwaltet, sodass die (RAW) resource für meine APP eine nur-lese-Resource ist.

Momentan habe ich 15 Level so umgesetzt. 100 sollen es mal werden.

— geändert am 28.11.2016 16:24:19

  • Forum-Beiträge: 2.214

28.11.2016 16:26:31 via Website

Na dann kommen wir der Sache schon näher :-)

Grundsätzlich ist mir bewusst , was du für ein Problemchen hast :-)
und du kommst schon ein wenig an die Grenzen ran .

Dir bleibt in dem Falle nichts anderes übrig , als die Daten nicht in einem Raw und damit in der Resource zu speichern
sondern alle C# files im Assets folder.
Bei der Installation lagerst du all diese Dateien vom Assetfolder lokal auf den internen Speicher aus
e.g /android/data/package/files und greifst mittels filehandle zu.

Oder halt alles in einer db und diese dann nach dem weg oben kopieren

— geändert am 28.11.2016 16:28:59

Liebe Grüße - Stefan
[ App - Entwicklung ]

  • Forum-Beiträge: 43

28.11.2016 22:05:45 via Website

Aha, damit hast du mir glaube ich den entscheidenden Hinweis gegeben:
Der Assets Folder.
So wie ich das verstehe ist er ideal für genau das geeignet was ich machen will :)
Und ich kann dann auf die Files mittels string zugreifen:

InputStream is = getAssets().open("level1.txt");

Also in die Datenbank statt der ResourceID den Dateinamen eintragen (lässt sich ja mittels einer for-Schleife prima eintragen) und der Game-Engine dann statt der ResourceID einfach den Dateinamen übergeben. Klingt für mich erstmal nach einem sauberen Plan.
Werd das die Tage mal testen und umsetzen. Aber ich denke das löst mein Problem.

PS: Bin eben noch Android-Einsteiger. Das mit dem Assets-Folder kannte ich noch nicht.

  • Forum-Beiträge: 43

30.11.2016 16:48:22 via Website

Okay, habe es nun umgeschrieben und es ist genau so wie ich mir es gewünscht habe.
Für alle die auch mal über diese Fragen stolpern sollten:
Ich habe eine gute Erklärung gefunden was in den res-Ordner und was in den assets Ordner kommt:
http://stackoverflow.com/questions/5583608/difference-between-res-and-assets-directories

Somit kann dieser Thread als erledigt geschlossen werden.