Inventar - unerklärliches Problem bei simpler Wertübergabe an globale Variable

  • GM 8

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

  • Inventar - unerklärliches Problem bei simpler Wertübergabe an globale Variable

    hi,

    ich bastle nun schon seit einigen Tagen an einem Drag and Drop Inventar für mein aktuelles Projekt.
    Bisher bin ich auch gut vorangekommen, doch beim letzten Feature (welches eigentlich das einfachste sein sollte) komme ich nicht weiter.

    Bei den Inventargegenständen, die auch ausgerüstet werden können, habe ich das Event "Right Mouse pressed" mit folgendem Code eingebaut:

    GML-Quellcode

    1. //Wenn Inventargegenstand ausgerüstet ist, soll er bei Rechtsklick in Inventar abgelegt werden (funktioniert)
    2. if(x == view_xview+436 && y == view_yview+573){
    3. for(i=0;i<global.inventory_space;i+=1){
    4. if(global.inventory_item[i] == inv_empty){
    5. global.inventory_item[i] = global.equipment_legs;
    6. global.equipment_legs = inv_empty;
    7. global.player_armor -= var_armor;
    8. scr_inv_open();
    9. exit;}}}
    10. //Wenn kein Ausrüstungsgegenstan der gleichen Kategorie aktiv ist, bei Rechtsklick auswählen und an die
    11. //entsprechende Position schieben (funktioniert)
    12. if(global.equipment_legs == inv_empty){
    13. global.equipment_legs = object_index;
    14. global.player_armor += var_armor;
    15. instance_create(view_xview+436,view_yview+573,object_index);
    16. if(var_inventory_side == 1){
    17. global.inventory_item[var_inventory_position] = inv_empty;}
    18. if(var_inventory_side == 2){
    19. global.inventory_transfer.var_item[var_inventory_position] = inv_empty;}
    20. instance_create(x,y,inv_empty);
    21. instance_destroy();}
    22. //Wenn bereits Gegenstand vom gleichen Typ aktiv ist, Positionen tauschen und Inventar neu zeichnen (funktioniert nicht!)
    23. else{
    24. global.inventory_show = 0;
    25. if(var_inventory_side == 1){
    26. global.inventory_item[var_inventory_position] = global.equipment_legs;}
    27. if(var_inventory_side == 2){
    28. global.inventory_transfer.var_item[var_inventory_position] = global.equipment_legs;}
    29. global.equipment_legs = object_index;
    30. scr_inv_open();}
    Alles anzeigen


    Der Fehler hat anscheinend irgendetwas mit dem object_indext zu tun aber ich kommen einfach nicht dahinter inwiefern.
    Zum Testen habe ich zwei Objekte erstellt inv_legs01 (id=41) & inv_legs02 (id=52). Die Objekte sind (bis auf die Sprites) identisch.
    Wenn inv_legs01 ausgerüstet ist und man auf inv_legs02 rechtsklickt werden die Positionen wie gewünscht getauscht und das Inventar aktualisiert.
    Umgekehrt funktioniert es aber nicht, die variable global.equipment_legs wird bei Rechtsklick auf inv_pants01 nicht geändert.

    Testweise habe ich inv_legs01 kopiert (neue id = 56), wobei inv_legs01 die Position von inv_legs02 einnehmen konnte, aber umgekehrt funktionierte es nun nicht mehr.
    Der object_index in der variable global.equipment_legs kann also immer nur erhöht werden.

    Ich hoffe einer von euch kann mir hier weiterhelfen.

    mfg
    G

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

  • ok,
    habe damit es übersichtlicher ist das spiel soweit zusammengestaucht sodass fast nur noch das inventar drin ist. Der Fehler tritt nachwievor wie beschrieben auf.
    Ich hoffe ihr könnt mit der Datei etwas anfangen.

    P.S. Ich hatte ohnehin vor das File mit detailierten Kommentaren zu versehen und als Tutorial hochzuladen sobald es funktioniert und fertig gepolished ist. Daher würde es mich auch interessieren was ihr bisher davon haltet (mal abgesehen von dem Bug) und ob es als Tutorial interessant wäre.
    Dateien
  • Gerade beim Öffnen der Datei gestaunt:
    Du machst es dir ja sehr kompliziert.
    Wieso kopierst du Code 1:1 von einem in ein anderes Objekt?
    Mit parents und Scripts kann man da noch einiges vereinfachen.
    Auch die Fehlersuche. Bin noch nicht dahintergekommen...
    Einige meiner Spiele:
  • Hab den gamemaker erst vor ca. 2-3 Wochen entdeckt. Gibt sicher noch Verbesserungspotential bei meiner Anwendung des Programms, aber daran arbeite ich bereits ;)
    Gibt im Code zwar noch einige Drag and Drop Relikte, aber dadurch dürfte der Bug auch nicht entstanden sein. Hab sicher schon um die 6-8h mit der Fehlersuche verbracht und inzwischen sind mir die Ideen ausgegangen was noch sein könnte.

    Falls ich dir irgendwie bei der Fehlersuche helfen kann (z.B. aufzählen was ich inzwischen alles probiert und als Ursache ausgeschlossen habe) sag bitte Bescheid.
  • Ich hab es zwar noch nicht repariert, dein Problem scheint aber in etwa folgendes zu sein:

    Bei jedem Mausklick geht der Game Maker alle Objekte durch und schaut, ob sie angeklickt wurden.
    Dein Skript führt dazu, dass du mit einem Klick gleich zwei Objekte anklickst, weil der erste Klick, das zweite Objekt an die Stelle des Klicks bewegt.
    Falls das nicht klar sein sollte, hier ein Beispiel:

    Funktioniert: Der Spieler drückt die rechte Maustaste (auf Hose 2):
    Das Spiel checkt Hose 1 mouse right pressed -> nix
    Das Spiel checkt Hose 2 mouse right pressed -> Hose 1 mit 2 austauschen

    Funktioniert nicht: Der Spieler drückt die rechte Maustaste (auf Hose 1)
    Das Spiel checkt Hose 1 mouse right pressed -> Hose 1 mit 2 austauschen
    Das Spiel checkt Hose 2 mouse right pressed -> Hose 1 mit 2 austauschen

    Du tauscht die Hose also zweimal aus, dadurch scheint natürlich nichts zu passieren. Lösung: Mach um dein Skript eine Abfrage mit einer Variable (etwa: if (clickable == true)) und setz die bei einem gerade ausgetauschtem Objekt auf false. Per step event oder alarm kann man sie dann kurz darauf wieder auf true setzen.
    Einige meiner Spiele:
  • Du hast Recht, das war der Fehler. Mit nem Alarm dazwischen funktionierts.

    Hab gedacht da ich "Right Pressed" als Event und nicht "Right Button" genommen habe würde es nur das Event des ersten Items aktivieren. Ist mir garnicht in den Sinn gekommen dass das Event beim zweiten Item auch aktiviert werden könnte :(

    Auf jeden Fall riesen Dank für die schnelle Hilfe ;)