Eingesammeltes auch bei Levelneustart verschwinden lassen

  • GM 7

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

  • Eingesammeltes auch bei Levelneustart verschwinden lassen

    Hallo!

    Ich bin ganz neu hier im Forum und Game Maker 7 hab ich auch erst seit einer Woche - echt tolles Programm muss ich sagen!
    Tut mir Leid, dass ich euch mit Anfängerfragen nerven muss!

    Meine Situation:
    Ich möchte ein Jump n run spiel machen, indem einen möglichst hohen score zusammenbringen soll. Für jedes meiner kurzen Levels hab ich einen neuen Raum gemacht. Wenn die Figur stirbt, beginnt das selbe level immer wieder von vorne. Punkte bekommt man mit kleinen, runden Kugeln, die verschwinden wenn man sie einsammelt.

    Mein Problem:
    Ich möchte nicht, das man unendlich viele Punkte einsammeln kann, wenn man stirbt. Theoretisch kann man ja immer wieder ins Feuer springen, um den Level neu zu starten und Punkte zu machen. Das möcht ich eben verhindern - die Kugeln sollen nach dem einsammeln für immer verschwunden sein.


    Tut mir Leid, falls es dieses Thema schon gab. Ich hab ziemlich lang hier im Forum gesucht und nichts gefunden. Und auch Video-tutorials bringen mir nicht viel.
    Vielen Danke, falls ihr mir helfen könnt!
  • Die Lösung ist sehr einfach:
    Setze die Variable, die deine Punktezahl anzeigt, im Event des Raumneustarts (oder eben wenn die Anzahl der Leben auf 0 ist) auf 0. Wenn du die interne Variable "score" für deine Punkte verwendest, sieht der Code dazu ganz einfach so aus:

    GML-Quellcode

    1. score = 0;
  • Danke für die schnellen Antworten!

    Ich habs noch nicht ausprobiert, aber wird da nicht der Scor auf 0 zurückgesetzt? Ich möchte den Score nach 10 Levels (also 10 räume) beibehalten - nur beim levelneustart sollten die Objekte, die man vorher schon eingesammelt hat, weg sein.
  • Nein, funktioniert nicht :(

    EDIT: Object Propertis beim Punkteojekt:

    Visible: Ja
    Solid: Nein
    Depth: 0
    Persistent: Ja

    Event: Collision mit Charakter - Actions: Set the score relative to 1, destroy the instance

    Da liegt auch nícht das Problem oder?

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

  • Damit das so funktioniert, wie du es willst, musst du eine weitere Variable für die Punkte einführen, die beim Beenden des Levels zu dem bestehenden Score hinzuaddiert wird. Das Objekt muss, wie TrunX schon sagte, auf jeden Fall persistent sein (außer natürlich, du verwendest globale Variablen).

    Du schreibst ins Room-Start Event also folgendes:

    GML-Quellcode

    1. score_add = 0;

    Für jede eingesammelte Kugel:

    GML-Quellcode

    1. score_add += 1;

    Sowie in das Room-End Event:

    GML-Quellcode

    1. score += score_add;

    Und zu guterletzt, wenn der Spieler Leben verliert:

    GML-Quellcode

    1. score_add = 0;
  • Sry, könntest du mir das etwas genauer erklären? Tut mir wirklich Leid, aber ich kenn mich mit Variablen nicht aus, möchte es aber lernen.

    Du schreibst ins Room-Start Event also folgendes:




    GML
    1
    score_add = 0;



    Ins Room-start event? Also mach ich beim Punkte-objekt einen neuen Event "Room start", oder? Und weiter? Wo geb ich diesen code ein??

    Danke für eure hilfe!
  • Variablen sind nichts anderes als veränderbare Platzhalter für Zahlen. Um eine neue Variable zu deklarieren, weist du ihr einen Wert zu. Das machst du in diesem Fall einfach im Room-start Event. Dort erstellst dazu einfach ein Codestück, nämlich, wie bereits gesagt "score_add = 0;".
  • Und "für jede eingesammelte kugel" kommt der code wohin?
    Alle codes beim Punkteobjekt eingeben?





    EDIT: Ich hab jetzt schon alles mögliche ausprobiert, es funktioniert nicht. :shifty:

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

  • Du benötigst neben deinem Punkteobjekt auch eines, das alle Punkte verwaltet. Ich nenne es hier mal "obj_score", wobei ich das Punkteobjekt als "obj_item" bezeichne.

    obj_score (persistent!):

    Room-Start Event:

    GML-Quellcode

    1. score_add = 0;

    Room-End Event:

    GML-Quellcode

    1. score += score_add;

    Lives = 0 Event (bzw. wenn der Spieler stirbt):

    GML-Quellcode

    1. score_add = 0;


    Punkteobjekt:


    Collision mit Spieler

    GML-Quellcode

    1. obj_score.score_add += 1;

    Die Variable musst du auf obj_item beziehen. Deshalb heißt es "obj_score.score_add += 1;", nicht "score_add += 1;" (Das habe ich damals nur als Beispiel genommen, so ist es ausgearbeitet).
  • Mhm... Hab das jetzt alles gemacht, aber es funktioniert weniger als zuvor.

    Ich hab meine Punkte in der Titelleiste stehen. Seit ich die ganzen codes dazugegebn hab, stehn die Punkte nurmehr ab dem 2ten level drin.
    Ausserdem erhalte ich jetzt keine Punkte mehr wenn ich die Objekte einsammle, seltsamerweiße kommen jetzt Punkte dazu wenn ich sterbe. :huh:

    Und das ursprüngliche Problem ist noch immer nicht behoben, die Punkteobjekte kommen wieder. :wacko:



    EDIT: Ich bekomme die neuen punkte immer erst beim room-wechsel oder neustart des levels (durch sterben).
  • Der Raum startet neu... Ausserdem hab ich keine Leben - wenn ich in eine Gefahr falle (also wenn der Charakter stirbt) startet der Raum einfach neu.

    Ist das jetzt viel komplizierter?
  • Nein, aber nun weiß ich das!

    So, noch einmal von vorne: Diesmal erstellst du wieder die Objekte: obj_score, obj_item, obj_player (sie müssen selbstverständlich nicht so heißen, hier dienen sie nur als Beispiel).

    obj_score (persistent):

    Room-Start Event:

    GML-Quellcode

    1. score_add = 0;


    obj_player:

    Kollisionsevent mit obj_item:

    GML-Quellcode

    1. obj_score.score_add -= 1;
    2. score += 1;

    Spielertod-Event (bei dir Kollision mit Stacheln):

    GML-Quellcode

    1. score += obj_score.score_add;
  • Danke Richlord! So funktionierts... Zumindest kann man jetzt nicht mehr unendlich viele Punkte machen. Aber eigentlich wollte ich für dieses Problem eine andere Lösung:

    Zurzeit siehts so aus:
    - Wenn Spieler stirbt, wird der Score zum Levelsanfang-Punktestand zurückgesetzt und die einsammelbaren Kugeln werden erneuert.

    Eigentlich wollte ich es so:
    - Wenn Spieler stirbt, bleibt der Score und die eingesammelten Kugeln werden auch bei Levelneustart nicht mehr da sein.

    Ich weiß, das ist meckern auf hohem niveau aber ich möchts nu mal so haben :D

    Wenn du mir genau diese Lösung zeigen könntest wäre ich dir sehr sehr dankbar!!
  • Das ist auch nicht schwierig, aber dafür bietet sich die Lösung an, bei der die Position des Spielers zurückgesetzt wird, nicht der gesamte Raum neugestartet wird. Sonst müsste man den Existenzstatus der Punkt-objekte wieder in einer neuen Variable speichern, was nur unnötig kompliziert wird.
    All das hier wieder anzuführen, würde aber nur den Thread zumüllen. Am besten wäre es, du schickst mir mal deine .gmk als PN, dann kann ich das einmal schnell alles abändern und zurückschicken. Ansonsten dauert es einfach unnötig.
  • Wenn ich die Position des Spielers zurücksetze, dann passiert das ohne effekt. Ich meine, wenn ich den Raum neu starte, kann ich einstellen, dass er ein und ausgeblendet wird...

    Oder kann man so einen Effekt recht leicht machen?
    Ich hab nähmlich keinen, wenn die Figur stirbt - der Raum wird wie gesagt einfach ausgeblendet und startet neu.
  • Man wird ja hier noch verrückt!^^
    Wenn du den Raumübergang beibehalten willst, dann sollte man es wiederum doch mit einem Raumneustart lösen, weil solche Effekte in Eigenproduktion ziemlich kompliziert sind.
    Aber das alles ist doch ein völlig simples Problem, ich kann gar nicht fassen, wie viel Zeit das hier in Anspruch nimmt. Es wäre wirklich besser, wenn du mir eine PN mit deiner Datei schickst, dann können wir das Problem ein für alle mal aus der Welt schaffen. ;)