Idee für eine all in one Lösung, bez. Tiefe und Kacheln

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Idee für eine all in one Lösung, bez. Tiefe und Kacheln

      Ich habe das auch im englischen Forum gepostet, aber natürlich sollen auch alle hier, Ihre Gedanken dazu,
      beitragen dürfen(und hier verstehe ich es wenigstens :P )

      Hi, da viele ja das Problem der tiefe und der Kollision mit Tiles haben(mich eingeschlossen), habe ich folgende
      Überlegung angestellt. Nehmen wir als Beispiel, Metroid und machen aus dem ganzen Spiel einen großen Raum
      (soll er 16000x16000 sein). Alles als Tiles selbstverständlich und das soll unser erster Layer(nach Hintergrund) sein.
      Nun machen wir noch einen Layer, für unseren Spieler und seine Feinde. Der dritte Layer wird für Kacheln
      verwendet, die über dem Spieler liegen sollen und der abschließende 4. Layer wird unser Kollisions-Layer.
      Der Tile-Layer kann nun ausgeschalten werden(so weit ich weiß, hat man trotzdem darauf Zugriff).
      Weiters wird das Tile-Set in ein Sprite(sTS_Map) eingelesen(sagen wir mit 400 Einzelbilder). Damit repräsentiert
      das Tile 3 auch das Bild 3 im Sprite sTS_Map.

      Die Kamera wird nun in Spielfeldgröße über diese gigantische Karte geschoben und in diesem Ausschnitt passiert
      nun folgendes.
      Die Tiles werden an Hand ihrer Nummer ausgelesen und in einem Array gespeichert(also alle Layer, der Spieler und
      alle erforderlichen Feinde). Das Array wird nun sortiert ausgegeben(sagen wir nach Y) und alle Instanzen werden
      gezeichnet. Die Kollisions-Abfrage kann man dann entweder über bbox oder ebenfalls über Instanzen machen.
      Alle neu erstellten Instanzen, Spieler, Feinde und Kollisionsmaske, befinden sich dann auf dem Layer 5(all in one).
      Bei verlassen des "Raumes", wird alles wieder gelöscht und das Spielchen beginnt von Neuem.

      Die Vorteile wären:

      1) Das komplette Spiel in einem großen Raum
      2) gute Performanz, da wir Tiles verwenden
      3) beliebige Wahl der Kollisonsabfrage
      4) immer nur die Anzahl von Instanzen, die für einen Raum benötigt werden, erstellt
      5) einfachere Erstellung von riesigen Karten

      Nachteile?

      Da seid ihr gefragt, denn da ich noch Anfänger bin, in GM, möchte ich gerne wissen, wo ich auf Schwierigkeiten
      stoßen könnte oder wo meine Idee total versagen würde.
      Mal davon abgesehen, dass es für mich Monate dauern würde, diese Idee umzusetzen.

      Miradur
    • In jedem Step den screen voll mit kollisions objecten zu erstellen und zu destroyen, ist sehr unperformant. Du brauchst einfach einen layer mit tiles, die die collision "mask" bilden" und dann checkst du den für deine collisions. Auch muss der Raum nicht riesig sein, in Metroid wird zB auch die Kamera nur von Raum zu Raum geschoben an den übergängen und dabei die illusion eines riesigen complexes erzeugt.

      Das vorrangige Problem dass du lösen möchtest ist die depth oder? wenn man durch einen tile wald gehen würde?

      ein beispielcode aus einem meiner spiele:

      GML-Quellcode

      1. for(i = 9998 ; i <= 10002 ; i += 1)
      2. {
      3. if tile_layer_find(i,x,y) != -1
      4. {
      5. grounded = true
      6. i = 10003;
      7. }
      8. else
      9. {
      10. grounded = false;
      11. }
      12. }
      Alles anzeigen


      außerdem hast du wieder bei der depth 100tausende layers zur verfügung. Bei objects hat man lustigerweise keine problem depth = -y zu benutzen, aber bei tiles scheut sich jeder davor^^
      du könntest tatsächlich durch die tiles die du sortieren möchtest durch iterieren und mit tile_set_depth jeder Zeile eine eigene depth zuweisen, die immer vom screen 0 bis screen height geht.

      ancient-pixel.com
      youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Aku_Ryou ()

    • Erstmal danke, für Deine Antwort und nein, ich hab kein Problem damit, tausende von Objekten
      zu erstellen oder zu sortieren, egal wie sie alle heißen. Ich hatte ja hier auch schon mal die Idee
      geäußert, für jede Y-Zeile einen eigenen Layer zu erstellen und das Ganze 3x, für Unten, Mitte
      und Oben.
      Leider beinhaltet Deine Lösung, eine nicht mehr unterstützte Funktion(tile_layer_find()) und eine
      weitere, die man nicht mehr verwenden sollte(depth *= -1), weil sie demnächst geändert, entfernt
      oder was auch immer, werden kann.
      Und natürlich würde ich den Kollisions-Layer nicht als Instanzen erstellen, sondern über ein Array
      abfragen(wie ich es auch schon erfolgreich, bei meinem Stardew Valley Versuch, gestetet habe).

      Was mich eigentlich zu meiner Überlegung führte, war die Tatsache, dass wir noch locker bis Ende
      des Jahres warten dürfen, bevor Tile-Kollisionen in GM realisiert werden(und hoffentlich auch Tiefe)
      und ich einen Versuch machte, eine Tile-Map als Instanzen zu erstellen.

      Bei dem Versuch wurden ca. 7500 Instanzen im Editor erstellt und ich hatte beim Scrollen, Einzelbild
      und ich habe einen Gaming-Rechner. Der Editor ist also dafür nicht ausgelegt(zu mindest nicht als ein
      großer Raum), was aber sicherlich auch an der Art der Darstellung liegt(das kann sicher performanter
      programmiert werden).

      Lange Rede, kurzer Sinn, ich möchte eigentlich die Vorteile, der Level-Erstellung, mittels Tile-Sets,
      mit den Vorteilen, von Instanzen und großen Räumen, kombinieren. Auch jetzt werden doch von
      manchen 1000 oder mehr Instanzen pro Raum benutzt und auch die werden 60x pro Sekunde dargestellt
      und GM hat scheinbar keine Probleme damit. Raum ist ja bei meiner Idee auch ein sehr dehnbarer
      Begriff, denn wenn ein Spielfeld die Ausmaße von 3 normalen Räumen hat(weil gescrollt wird und nicht
      abrupt gewechselt), dann würde ich ja alle 3 Räume auf einmal erstellen und die Kamera ebenfalls
      drüber wegziehen.

      Der große Vorteil liegt ja darin, dass ich ein riesiges Level erstellen kann(Zelda Oberkarte z.B.) und es
      wird immer nur der jeweilig sichtbare Ausschnitt("Raum"), berechnet und dargestellt.
      So weit ich weiß, zeichnet ja sogar GM keine Instanzen, die außerhalb der Kamera liegen, also braucht
      man sich darum auch nicht kümmern.

      Aber da ich in dieser Idee so viele Vorteile sehe, kann irgend etwas nicht stimmen 8o , sonst wäre es
      schon von wesentlich talentierteren Programmierern umgesetzt worden, deshalb eben meine Frage,
      was übersehe ich oder wo ist der Haken?

      Miradur
    • Ahja, sry, ich komme noch aus der Studio 1.4 Welt - was Studio 2 angeht, bin ich nicht auf der Höhe.

      Bzgl großer Raum in kleine Räume aufteilen. Die abrupten Raumwechsel kannst du umgehen, wenn du einen Übergang einbaust (so wie er bei vielen alten Spielen zum einsatz kam) beim GM wäre das;
      -ein bild von aktuellen bildauschnitt abspeichern
      -raumwechseln
      -ein bild vom aktuellen raum abspeichern
      -beide bilder nebeneinander stellen (auf einer surface) und an der kamera vorbeiscrollen lassen
      -bilder löschen

      generell gilt: je weniger objecte desto besser und je mehr du innerhalb möglichst weniger draw calls machen kannst, desto besser. Das berühmte Beispiel ist, die Wolke und der Busch von supermario die dasselbe Sprite im Speicher sind und dann nur gedreht und mit anderer Farbe gedrawed werden. Soviel Kontrolle hat man im GM natürlich nicht, aber man braucht trotzdem keine 2 objects dafür.
      Soviel tiles verwenden wie möglich ist auch gut, weil die performance dadurch auch entlastet wird.
      Und zuguterletzt gibt es (ich hoffe auch im GM2) die funktion instance_deactivate/instance_deactivate_region mit der man instanzen außerhalbs des Bildschirm komplett ignorieren kann und das gibt einen ordentlichen performanceboost.

      Ich würde dir raten dir einen level editor zu schreiben und die räume dann immer dynamisch in game erstellen zu lassen (aus einer textdatei heraus). Dann hast du die volle Kontrolle und kannst deine tiles on the fly an die richtige stelle und depth setzen.

      Du solltest nicht bis zum Jahresende warten, weil wer weiß wie lang es wirklich dauert und ob alles funktioniert ;)

      ancient-pixel.com
      youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
    • Danke, für Deine ausführliche Antwort und ja, diesen Befehl gibt es auch noch in GM2 :)
      Ich werde mal, im Rahmen meiner Möglichkeiten, ein paar Tests durchführen und dann
      auch hier bekannt geben, wenn etwas sinnvolles dabei raus kommen sollte.
      Mir gefällt eigentlich der Map- oder besser gesagt, der Raum-Editor von GM, mir gefällt
      dieses Konzept sogar außerordentlich gut, dass man alle Tools in einer IDE hat, das liegt
      wahrscheinlich auch daran, dass ich aus einer Zeit komme, wo wir uns jede Kleinigkeit,
      selbst programmieren mußten und wenn es zeitlich eng wurde, sogar noch in Assembler.

      Daher genieße ich diesen Komfort und werde ihn erstmal nicht aufgeben, schon gar nicht,
      für ein bisschen Geschwindigkeit oder Freiheit.


      Miradur