Home Creators Posts Import Register Favorites Logout

Content

Ich liebe Housing. Als ehemaliger intensiver Ultima Online Spieler ist es mein Wunsch, dass wenn ein Spiel Housing besitzt komplett irre damit wird! Spiele wie Animal Crossing kriegen das sehr gut hin ein stabiles System zu nutzen aber gleichzeitig Freiheiten zu bieten. Aber wie sieht so was im Hintergrund aus?

Für's SambVerse entwickel ich aktuell das Housing und versuche vor allem Animal Crossing als Vorbild zu nehmen. Egal ob online oder offline, wir müssen die Einrichtung irgendwie abspeichern. Und da kommen 2D Arrays wie gerufen.

Ein Array ist eine Liste von Daten mit einer festen größte. Wenn wir einen Array anlegen mit 3 Zahlen und dann die zweite davon abfragen wollen sieht es so aus:

int[] Zahlen = new int[3,5,9];Debug.Log(Zahlen[1]); // wirft "5" aus

Die "[]" geben an, dass es nicht nur eine Zahl ist sondern ein Array aus Zahlen. Und ganz wichtig: Der Index beginnt bei 0. Wenn man also die zweite Zahl haben will muss man nach Index 1 fragen.

Aber was ist, wenn wir z.B. ein Spiel machen, das wie ein Schachbrett funktioniert. Man kann nur einen Pfad mit den Pfeiltasten entlang laufen, komplett ohne Kollisionserkennung. Wie macht man das? Hier helfen 2D Arrays!

int[,] Spielfeld = new int[8,8]; //erstelle ein 8x8 großes SpielfeldSpielfeld[3,0]=1; // Setze die int bei X=3 und Y=0 auf 1Spielfeld[3,1]=1; // Setze die int bei X=3 und Y=1 auf 1 Spielfeld[3,2]=1; // Setze die int bei X=3 und Y=2 auf 1  Spielfeld[4,2]=1; // Setze die int bei X=4 und Y=2 auf 1

Das würde dann so aussehen (schwarz = 0, weiß = 1)

Wenn wir uns nun oben mittig auf dem Pfad befinden, also X=3 und Y=0 und jetzt Pfeiltaste nach unten drücken können wir mega simple checken ob da ein Weg ist:

 posX=0;PosY=3;if( Spielfeld[posX,PosY+1]==1 ) // gehe ein Feld weiter nach unten und schau, ob der Wert dort 1 ist.

Und nichts anderes nutzen fast alle Spiele, die ein Grid-basiertes Housing System haben. Im SambVerse wird also ein 2D Array angelegt, der die Informationen der Items beinhaltet. Das sieht etwa so aus:

Rechts habe ich mit Odin ein Editor-Script gemacht, das mir den aktuellen Inhalt des 2D Arrays anzeigt. Da alle Items ja bereits Icons haben war das recht simple! Es hat viele spielerische und technische Vorteile 2D Arrays zu nutzen. Spieler können z.B. viel einfacher Objekte perfekt nebeneinander setzen, da man es nichts auf den Millimeter genau platzieren kann. Technisch ist es sicherer, da wir immer abfragen können ob an einer Stelle gerade ein Objekt bereits besteht, damit wir nicht 2 Objekte am selben Standort haben können. Und da ich MongoDB verwende kann ich die Datenbank ebenfalls als 2D Array aufbauen!

-1 bedeutet ein freies Feld. 3 ist der Zylinder, 7 ist der Glitzerzylinder. Wer sich etwas mit Datensätzen auskennt wird sehen, dass alles verschaltet ist in einen "rooms" Array und die Items im Objekt "level1" sind. Natürlich sollen die Spieler später die Möglichkeit haben mehrere Räume zu besitzen, deswegen ist das von Anfang an drin, damit ich nicht später Probleme habe, wenn dieses Feature eingebaut wird. "level1" ist bisher die Lösung, um später Items aufeinander platzieren zu können. Sprich "level2" wären alle Objekte, die auf "level1" platziert wurden. Ob das sinnig ist? Werden wir noch sehen! Selbst wenn nicht schadet dieses extra Objekt nicht und wäre im schlimmsten ein Überbleibsel!

Aber ja. 2D Arrays sind der Schlüssel, wenn man Sachen machen will bei denen etwas aus Feldern besteht. Wenn ihr also ein Match3 oder Tetris Spiel machen wollt müsst ihr auf 2D Arrays gehen, sonst werdet ihr wahnsinnig!

Files

Comments

Gigalodon (edited)

Comment edits

2026-09-15 06:00 Weiß nicht, ob das ne dumme Frage ist, ich programmiere noch nicht soo lange. Aber warum verwendet man die alten C-Arrays und nicht die "neueren" Container, die auch eine flexible Größe haben?
2020-05-31 13:43

Christian -Samb- Wasser

Da Mono oft noch eigen Quirks hat würde man da Listen verwenden. Das hatte ich überlegt, aber da ich eh statische Arrays benötige und es gut finde in dem Fall einen Error zu bekommen, wenn etwas die Dimensionen sprengt hatte ich es gelassen :) Grundsätzlich ginge das natürlich auch! Bib mir unsicher, ob Listen langsamer sind oder so..