Inventar

  • GM 7
  • Hallo,

    hab mal wieder ein Problem, daich für mein aktuelles Game ein Inventar brauche, dass soll außerdem ein eigener Raum sein, und es muss speichern können welche Waffen, etc. man besitzt, und welche von denen angelegt sind, das mit dem Waffenkaufen und besitzen funktioniert, aber wenn ich in den Inventar Room gehe, springen alle Waffen immer wieder zurück, oder verschwinden plötzlich, so kann man eine Waffe ausrüsten, in einen anderen Raum gehen, zurück ins Inventar gehen, die Waffe wieder ausrüsten, da sie zurückspringt u nd erneut von den Vorteilen Profitieren, da die Variablen nicht zurückgesetzt werden...

    Das klingt wahrscheinlich sehr kompliziert, aber vielleicht könnte mir ja mal jemand ein example machen,

    danke das wär echt nett!

    Bei weiteren Fragen wie das inventar aussehen soll, einfach fragen,

    danke :)
  • Es gibt mehrere Ansätze, sowas zu lösen. Am einfachsten wäre es sicher in deinem Fall, wenn du in den Settings deines Inventar-Rooms das Häkchen bei "persistent" setzt. Dann halten die Objekte auch nach einem Roonwechsel ihre Position.
    Ich hoffe, ich hab dich richtig verstanden und konnte dir somit helfen.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Danke für die schnellen Antworten,

    das mit dem Persistance ist eine gute idee, aber ich will nochmal fragen, ob's nicht mglich wäre, dass mir jemand ein example macht, am besten 2 Räume, einen zum kaufen und einen als inventar, das Problem liegt ja nicht nur an der Position, sondern auch an den Variablen, die irgendwie immer zurück Springen, da funktioniert soviel nicht, dass kann man alles gar nicht schildern,

    wäre euch echt dankbar für ein kleines example

    Adolamin
  • Also, da ein Example zu machen ist ein wenig sinnlos.

    Das Problem ist, dass du noch zu praktisch denkst anstatt abstrakt (also losgelöst). Ich möchte von daher mal versuchen, dir das ganze anders zu erklären:

    Welche Informationen braucht dein Inventar?
    Vermutlich nur welche Items sich in ihm befinden. Der Einfachheit halber verzichten wir mal auf das Paramater "Anzahl" - wenn man ein Item 2mal hat, taucht es einfach 2mal auf.

    Was brauchen wir also?
    Eine Variable mit der Inventargröße. Damit ist nicht die Maximalgröße gemeint (auf eine solche verzichten wir erstmal), sondern die Anzahl der Items, die sich derzeit im Inventar befinden.
    Hättest du eine registrierte Version, könnten wir dafür eine DataStructure nutzen und einfach deren Größe abfragen. Haben wir aber nicht, also begnügen wir uns mit Arrays.
    Noch eine Anmkerkung, bevor ich zum eigentlichen Code komme: Ich werde jetzt nur die Items in Form von Namen speichern. Sinnvoller wären IDs - mithilfe derer könntest du an anderer Stelle jedem Item Namen, Bild und sonstige Infos zuweisen. Aber legen wir einfach mal los:

    Zum Initialisieren:

    GML-Quellcode

    1. // inventory_init():
    2. inv_size = 0; // 0 Items sind am Anfang im Inventar

    Zum Hinzufügen eines Items:

    GML-Quellcode

    1. // inventory_add("item")
    2. inv_item[inv_size] = argument0;
    3. inv_size += 1;

    Entferne das erste Item einer Bezeichnung:

    GML-Quellcode

    1. // inventory_remove("item")
    2. for (i=0;i<inv_size;i+=1)
    3. {
    4. if inv_item[i] != argument0 then continue;
    5. for (u=i;u<inv_size;u+=1)
    6. {
    7. inv_item[u] = inv_item[u+1];
    8. }
    9. inv_size -= 1;
    10. break;
    11. }
    Alles anzeigen

    Entferne alle Items einer Bezeichnung:

    GML-Quellcode

    1. // inventory_remove_all("item")
    2. for (i=0;i<inv_size;i+=1)
    3. {
    4. if inv_item[i] != argument0 then continue;
    5. for (u=i;u<inv_size;u+=1)
    6. {
    7. inv_item[u] = inv_item[u+1];
    8. }
    9. inv_size -= 1;
    10. }
    Alles anzeigen

    Gebe einen String zurück, der den Inhalt des Inventars wiedergibt (mit Absätzen):

    GML-Quellcode

    1. // inventory_string()
    2. var str;
    3. str = "";
    4. for (i=0;i<inv_size;i+=1)
    5. {
    6. if str != "" then str += "#";
    7. str += inv_item[i];
    8. }
    9. return str;


    Edit: Fehler rauseditiert. Ist trotzdem nicht getestet.
  • Hallo, zusammen.


    Das solltest du mit globalen Variablen hinbekommen.
    Du kannst einen Script schreiben (ich zeige wie) und den dann einem Objekt geben, das du dann in den Raum stellen kannst.

    Beispiel :

    GML-Quellcode

    1. // aktuelle waffe
    2. global.actuel_weapon = 0;
    3. // gekaufte waffen hier : 1 gekauft, 0 nicht gekauft
    4. global.weapon _gun = 1;
    5. global.weapon _mashinegun = 0;
    6. global.weapon _bazooka = 0;
    7. global.weapon _lasergun = 0;
    8. // du kannst hier alles mögliche schreiben einfach nach dem global einen . setzen


    Wenn du zB. dann eine andere Waffe im anderen Raum kaufst kannst du zB. eine lasergun, dann machst du folgendes.

    GML-Quellcode

    1. // wenn waffe gekauft
    2. global.weapon_lasergun = 1;


    Wenn du upgraden willst, kannst du ja zB. die Geschwindigkeit erhöhen, oder die Munition, oder den Schaden.

    Dann müsstest du oben den globalen Script noch anpassen.

    Beispiel :

    global.weapon_gun_damage = 5;

    dann upgraden...

    GML-Quellcode

    1. // wenn upgrade gekauft
    2. global.weapon_gun_damage += 2 // um 2 erhöhen
    3. global.weapon_gun_damage = 7 // um 2 erhöhen



    Hoffe, konnte dir weiterhelfen.

    PS : Die globalen Variablen kannst du in jedem Objekt verwenden

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Danke, Foo - mach ich auch gar nicht mehr anders, aber wenn ich hier im Technikforum bin fall ich wieder auf meinen Stand von vor 3 Jahren zurück ^^

    Effektiv sieht das so aus:

    GML-Quellcode

    1. globalvar deinevariable;
    2. deinevariable = 0; // immer global :)


    Ich weiß aber leider nicht, wie das mit Arrays genau ist... sollte aber problemlos gehen.
  • Benutzer online 1

    1 Besucher