Variable wird nicht vor einer Aktion nicht überprüft (obwohl sie überprüft werden sollte)

  • GM 8

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

  • Variable wird nicht vor einer Aktion nicht überprüft (obwohl sie überprüft werden sollte)

    Hallo!
    Ich bin gerade dabei eine waffen engine für einen 2D shooter zu machen, mit der man 2 Waffen tragen und nachladen können soll. Man kann allerdings schießen, während man nachlädt, obwohl ich die Variable "global.canshoot" = 0 setze, wenn nachgeladen wird und es auch überprüft wird, bevor geschossen wird.
    Außerdem funktioniert der Autoreload, wenn keine Munition mehr im magazin ist (currentchip=0) nicht.
    Ich probiere jezt bestimmt schon über 2h rum, um die Fehler zu beheben, aber finde keine Lösung :S
    Kann mir jemand von euch sagen, warum man während dem Nachladen schießen kann nd warum der Autoreload nicht funktioniert und mir bestenfalls auch sagen, wie dies zu beheben ist? Im Anhang ist auch noch die ungekürzte .gmk Datei.

    :event_create: Create

    GML-Quellcode

    1. global.weapon=1 //Startwaffe
    2. global.maxrounds=180 //Maximale tragbare Munition
    3. global.chipsize=30 //Magazingröße
    4. global.currentrounds=180 //momentane Munition
    5. global.currentchip=30 // momentanes Magazin
    6. global.firerate=10 //firerate
    7. global.reloadtime=60 //Nachladedauer
    8. global.reloadtimeempty=75
    9. global.firemode=2 // 1=Halbautomatik 2= vollautomatik


    :event_mouse: Glob left button

    GML-Quellcode

    1. //Vollautomatik
    2. if global.canshoot=0
    3. exit
    4. {if global.firemode=2
    5. {if global.currentchip>0
    6. {obj=instance_create(obj_player.x,obj_player.y,obj_bullet);
    7. with (obj_bullet) motion_set(0,20);
    8. global.currentchip+=-1;
    9. global.canshoot=0;
    10. alarm[1]=global.firerate}}}


    :event_timer: alarm 1

    GML-Quellcode

    1. global.canshoot=1


    :event_keyrelease: release key r

    GML-Quellcode

    1. //manueller reload
    2. //Die drei möglichen Fälle, wie die Munition verteilt sein könnte.
    3. //Bei den 3 volgenden zusammengefassten Alarmen wird dementsprechend nachgeladen.
    4. if global.currentrounds>global.chipsize-0.1
    5. {global.canshoot=0;
    6. alarm[5]=global.reloadtime;}
    7. if global.currentchip<global.chipsize
    8. if global.currentchip+global.currentrounds<global.chipsize-0.1
    9. {global.canshoot=0;
    10. alarm[6]=global.reloadtime}
    11. if global.currentchip<global.chipsize
    12. if global.currentchip+global.currentrounds>global.chipsize
    13. {alarm[7]=global.reloadtime
    14. global.canshoot=0}
    Alles anzeigen


    :event_timer: Alarm 5,6,7

    GML-Quellcode

    1. [...]//es wird dementsprechend nachgeladen (funktioniert)
    2. global.canshoot=1


    Und das soll der Autoreload sein, der aber leider gar nicht funktioniert:
    :event_step: step

    GML-Quellcode

    1. //autoreload
    2. //wenn ammo im chip kleiner als Magazingröße
    3. if global.currentchip<1
    4. {if global.currentrounds>global.chipsize-0.1
    5. {alarm[3]=global.reloadtimeempty;
    6. global.canshoot=0}}
    7. //wenn ammo im chip größer als Magazingröße
    8. if global.currentchip<1
    9. {if global.currentrounds<global.chipsize
    10. {alarm[4]=global.reloadtimeempty;
    11. global.canshoot=0}}
    Alles anzeigen


    :event_timer: Alarm 3,4

    GML-Quellcode

    1. [...]//es wird dementsprechend nachgeladen
    2. global.canshoot=1
    Dateien
    • reloadengine.gmk

      (11,69 kB, 126 mal heruntergeladen, zuletzt: )
    :action_drawsprite: :event_collision: :action_killposition: = :action_health:

    :action_drawsprite: + :action_drawsprite: + :action_drawlivesimage: = :action_drawsprite: :action_drawsprite: :action_drawsprite:

    :action_drawsprite: + :action_color: = :action_spritecolor:

    :action_drawsprite: + :action_wrap: = :action_exit:
  • Ich würde spontan vermuten, dass dein Problem darin liegt, dass dein Alarm zu schnell ausgelöst wird. Versuche mal firerate auf einen höheren wert zu setzen. Momentan sollte man mit der aktuellen rate 3 mal pro Sekunde schießen können, bei einem roomspeed von 30. Falls das nicht hilft, hier mal ein debug Ansatz:
    Ich habe immer um bestimmte Veränderungen in meinem Code zu beobachten message boxen eingefügt, um mir einige Werte punktgenau aus zu geben. Versuch mal von deinem Alarm Event aus eine Message box aufzurufen, nur um zu sehen ob es überhaupt ausgeführt wird.
    Edit: Ich glasige das dein Auto reload nicht funktioniert da du zuerst den nachlade Alarm auslöst, welcher canshoot auf 1 setzt, und dann wieder canshoot auf 0 setzt.
    Ich hoffe dass hilft.
  • Das mit dem debug habe ich auch schon versucht, aber ich habe nur rausgefunden, wo das Problem ungefähr liegt (Wenn man manuel nachlädt wird canshoot nicht auf 0 gesetzt...) Wodran das liegt weiß ich nicht. Ich hab schon viele Zeilen verschoben, sodass z.B. erst canshoot = 0 gesetzt wird und dann erst der Alarm ausgelöst wird, aber das hat nichts verändert.

    Die firerate hoch zu setzen habe ich ausprobiert, aber dadurch ändert sich auch nichts in bezug auf die Bugs.. :/
    :action_drawsprite: :event_collision: :action_killposition: = :action_health:

    :action_drawsprite: + :action_drawsprite: + :action_drawlivesimage: = :action_drawsprite: :action_drawsprite: :action_drawsprite:

    :action_drawsprite: + :action_color: = :action_spritecolor:

    :action_drawsprite: + :action_wrap: = :action_exit: