In der letzten Woche habe ich mit Unity3D an einem Inventarsystem gearbeitet. Zuerst bekam ich Hilfe von den Jungs von Design3, aber es dauerte nicht lange, bis wir uns trennten, weil mir die Art und Weise, wie sie ihren Code machten, wirklich nicht gefiel, es roch überhaupt nicht nach OOP.
Ich habe weitere Schritte voraus gemacht - Gegenstände belegen mehr als einen Steckplatz, ein erweitertes Platzierungssystem (Gegenstände versuchen ihr Bestes, um die beste Passform zu finden), ein lokales Maussystem (die Maus bleibt im aktiven Taschenbereich gefangen) usw.
Hier ist eine Demo meiner Arbeit.
Was wir in unserem Spiel haben möchten, ist eine automatische Organisationsfunktion - keine automatische Sortierung. Wir möchten diese Funktion, da unser Inventar in Echtzeit angezeigt wird - nicht wie in Resident Evil 1,2,3 usw., wo Sie das Spiel pausieren und Dinge in Ihrem Inventar erledigen würden. Stellen Sie sich jetzt vor, Sie befinden sich in einer schwierigen Situation, umgeben von Zombies, und Sie haben keine Kugeln. Sie sehen sich um. Sie sehen, dass sich Kugeln in der Nähe auf dem Boden befinden. Gehen Sie also zu ihnen und versuchen Sie, sie aufzuheben, aber sie ziehen nicht an passt nicht! Sie sehen sich Ihr Inventar an und stellen fest, dass es passt, wenn Sie einige der Artikel neu organisieren! - Jetzt hat der Spieler - in dieser Situation keine Zeit, sich neu zu organisieren, weil er von Zombies umgeben ist und stirbt, wenn er anhält und das Inventar organisiert, um Platz zu schaffen (Inventar in Echtzeit speichern, keine Pause) - würde nicht. Ist es nicht schön, dass das automatisch passiert? - Ja!
(Ich glaube, dies wurde in einigen Spielen wie Dungeon Belagerung oder so implementiert, also sicher, dass es machbar ist.)
Schauen Sie sich dieses Bild zum Beispiel an:
Ja, wenn Sie das Problem automatisch sortieren, erhalten Sie Ihre Leerzeichen, aber es ist schlecht, weil: 1- Teuer: Es ist kein ganzer Sortiervorgang erforderlich, um diese Leerzeichen freizugeben. Schieben Sie im ersten Bild einfach das rote Element an die ganz unten ganz links, und Sie erhalten die gleichen Leerzeichen, die Sie durch die automatische Sortierung erhalten haben. 2- Es ist ärgerlich für den Spieler: "Wer hat dir gesagt, dass du meine Sachen nachbestellen sollst?"
Ich frage nicht nach "Wie schreibe ich den Code?", Sondern frage nur nach einer Anleitung, wo ich suchen soll, welche Algorithmen beteiligt sind. Hat das etwas mit Grafiken und Sachen mit dem kürzesten Weg zu tun? Ich hoffe nicht, weil ich es nicht geschafft habe, mein College-Studium fortzusetzen: / Aber selbst wenn es so ist, sag es mir einfach und ich werde die damit verbundenen Dinge lernen.
Beachten Sie, dass es mehr als nur eine Lösung geben kann. Ich denke, das erste, was ich tun muss, ist herauszufinden, ob die Situation "lösbar" ist. Wenn ich weiß, wie ich feststellen kann, ob eine Situation lösbar ist oder nicht, kann ich sie "lösen". Ich muss nur die Bedingungen kennen, die es "lösbar" machen. Und ich glaube, dafür muss es einen Algorithmus / eine Datenstruktur geben.
Hier ist ein Bild für mehr als eine Lösung für den Versuch, ein 1x3-Objekt zu montieren:
Die Pfeile zeigen nur eine der Lösungen, aber wenn Sie schauen, werden Sie mehr als eine finden. Dies ist, was ich letztendlich nicht automatisch sortiere, sondern eine Lösung finde und anwende.
Beachten Sie, dass ich, wenn ich Zeit damit verbringe, einen Weg finden werde, es zu lösen, aber es wäre nicht der beste Weg, ein Autorad mit den Füßen statt mit den Händen zu halten! XD Oder einfach nur versuchen, ein Problem zu lösen, für das Arrays erforderlich sind, dessen Existenz Sie jedoch noch nicht kennen! Was ist der richtige Ansatz dafür?
Aktualisierungen aus dem Kommentar
@Stephen Ich bin wirklich kein Guru in Alogs, du hast 'Rucksack' erwähnt und @BlueRaja - Danny Pflughoeft hat ein 2D-Bin-Pack-Algo erwähnt. Sind sie irgendwie verwandt / gleich? - Ich bin immer noch verwirrt, wie ich das angehen soll.
Und ja, ich verwende bereits eine "Heuristik", aber ich wusste nicht wirklich, dass ich es bin: D Sie findet den ersten verfügbaren Steckplatz und prüft, ob der Artikel dort passt.
Ich weiß nicht, ob das Bestellen von Artikeln aufgrund ihrer "Sperrigkeit" (die ich nSlotsRequired = nRowsReq * nColsRec nenne) funktionieren würde, da Sie beispielsweise 2x2- und 1x4-Artikel haben, sie haben die gleiche Sperrigkeit, aber unterschiedliche Formen und haben ein anderer Effekt darauf, wie der Rest der Elemente als nächstes gehen wird. SO... :/
Ich habe dieses Video gesehen, die Idee mit der vollständigen Verpackung hat mir sehr gut gefallen, aber ich frage mich, wie ich vorgehen soll, da das Inventar 2D ist. Ich bin mir nicht mal sicher, ob das Verpacken von Behältern hier der Schlüssel ist, denn es stimmt, dass ich mehr als eine Tasche haben kann, aber in unserem Spiel wird es nur eine Tasche sein. Es geht also darum, Gegenstände in eine Tasche zu packen und nicht mehr. Die Beispiele in diesem Video (die Rohre und Busse) passen also nicht wirklich zu meinem Problem. Ich habe auch ein paar Sachen über diese Rucksack-Sache gesehen. Ich habe nicht gesehen, wie der 'Wert' mit meinen Gegenständen / meinem Inventar zusammenhängt, aber ich denke, 'Gewicht' ist dasselbe wie Sperrigkeit, nicht sicher.