Problem bei player

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

  • Problem bei player

    hallo


    ich habe ein rießen problem und zwar wollte ich machen das mein player pfeile abschießen kann aber irgendwie schaff ich es nicht.

    ich hab ein obj_ammo gemacht das für die pfeile ist und ein obj_playertrhow für die animation beim schießen...die funktioniert auch ganz gut.

    aber beim schießen hab ich probleme.er schießt immer gleich mehrere pfeile ab..wie kann ich es machen das er nur einen abschießt
  • Ich weis nicht wie dein Code aussieht.
    Könnte es evtl. sein, dass der Pfeile beim gedrückt halten schießt?
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • vermutlich ist es dieser code der eine instance created und nach rechts moven lässt, wenn man die taste gedrückt hält geht das in nen loop über der erst endet wenn man loslässt

    deshalb

    1. variable anlegen wie oft man schießen darf, und das event auf key released legen dann passiert die aktion pro druck und nicht bei gedrückt halten zb
  • Das ist jetzt eine andere sache nicht die mit dem schießen



    also ich hab ein player object mit dem code:

    Step Event

    GML-Quellcode

    1. if keyboard_check(ord("E"))
    2. {
    3. if (global.lastpressed=="right")
    4. {
    5. instance_destroy();
    6. instance_create(x,y,obj_player_attack_right)
    7. }
    8. else
    9. {
    10. instance_destroy();
    11. instance_create(x,y,obj_player_attack_left)
    12. }
    13. }
    Alles anzeigen



    dann hab ich die 2 obj_player_attack mit diesen codes:

    Create Event

    GML-Quellcode

    1. image_speed=0.3;





    Animation End Event

    GML-Quellcode

    1. instance_destroy();
    2. if global.lastpressed=="right"
    3. {
    4. instance_create(x,y,obj_player_idle_right)
    5. }
    6. else
    7. {
    8. instance_create(x,y,obj_player_idle_left)
    9. }



    Es funktioniert auch aber wenn ich jetzt während er den schlag also die attacke ausführt nach rechts oder links drücke zum rennen kommt eine fehlermeldung

    GML-Quellcode

    1. Push :: Execution Error - Variable Get 101459.speedright(100035, -2147483648)
    2. at gml_Object_obj_player_StepNormalEvent_1 (line 57) - hspeed=speedright;



    EDIT: ich habs gelöst durch diesen code im step event von obj_player_attack_left und right

    STep Event

    GML-Quellcode

    1. if keyboard_check(global.key_right)
    2. {
    3. sprite_index=spr_player_run_right;
    4. hspeed=speedright;
    5. }
    6. if keyboard_check(global.key_left)
    7. {
    8. sprite_index=spr_player_run_left;
    9. hspeed=speedleft;
    10. }
    11. if keyboard_check(global.key_up) && (global.lastpressed=="right")
    12. {
    13. sprite_index=spr_player_jump_right;
    14. vspeed=speedup;
    15. }
    16. if keyboard_check(global.key_up) && (global.lastpressed=="left")
    17. {
    18. sprite_index=spr_player_jump_left;
    19. vspeed=speedup;
    20. }
    Alles anzeigen




    jetzt hab ich das problem das er aber viel zu hoch springt also nur wenn man während der attacke auf springen drückt........springt er viel zu hoch..
    aber wenn er normal springt ist die höhe normal

    komischerweiße ist es aber beim hspeed nicht so

    zur info ich habe natürlich im obj_player auch einen code mit dem springen variable....vielleicht deshalb...aber wieso ist es beim hspeed anders...weil den hab ich dort ja auch

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von acidrain833 ()

  • wo hast du speedright denn deffiniert? ich seh das nicht

    if bedingungen kannst du auch mit && abfragen so musst du sie nicht verschachteln und kannst 2 bedingungen in einer Abfrage lösen, du willst ja das pfeiltaste + e gedrückt wird oder?
  • hy also speedright und left sind in einer ini definiert ...

    und wegen den pfeiltaste+e das ist extra was anderes.....eigentlich schon das selbe nur halt im player objekt wird es mit pfeiltaste+e ausgeführt



    zum besseren verständniss:

    der code hier

    GML-Quellcode

    1. if keyboard_check(global.key_up) && (global.lastpressed=="left")
    2. {
    3. sprite_index=spr_player_jump_left;
    4. vspeed=speedup;
    5. }


    ist dafür da wenn er gerade eine attacke ausführt und man dann währendessen springen will knopf drückt..


    und der andere code für pfeiltaste+e ist für die jumpattack animation.

  • okay und wo holst du denw ert aus der ini raus?

    wenn irgendwo steht das da ne variable -265xxxxxxxx ist bedeutet das in der Regel er hat die variable nicht gefunden oder sie ist nicht definiert

    ist deine variable global?
  • dann nimm nen timer

    beim schießen variable ++
    Timer 0 auf 5 steps
    if bedingung das nur geschossen werden darf wenn variable kleiner 1 oder == 0 ist

    im timer variable = 0

    dadurch wird er bei jedem schuss 5 steps pause machen was dann vermutlich 1-2 sek sind je länger der timer ist umso länger muss er warten
  • Ich würde dir auch empfehlen das alles in ein Objekt zu packen, du hast keinerlei Vorteil durch dieses Aufteilen und wie du siehst führt es nur zu schwer lokalisierbaren Fehlern da du code in mehreren Objekten dupliziert hast, wenn du dann vergisst es an einer Stelle zu ändern hast du schon das Problem.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • @Rhazul


    und kannst du mir erkären wie ich das machen kann??

    also ich erstelle mal das sprite für die attacke mit dem namen spr_player_attacke_left und right....die 10 images hat für die animation.

    dann erstelle ich ein objekt namens obj_player_attacke und füge das sprite hinzu.

    dann erstelle ich im obj_player diesen code:

    GML-Quellcode

    1. if keyboard_check(ord("E"))
    2. {
    3. if (global.lastpressed=="right")
    4. {
    5. image_speed=0.3;
    6. sprite_index=spr_player_attacke_right;
    7. }
    8. else
    9. {
    10. image_speed=0.3;
    11. sprite_index=spr_player_attacke_left;
    12. }
    13. }
    Alles anzeigen



    und er führt auch die attacke aus wenn ich E drücke jedoch dann die ganze zeit...er wiederholt sich immerwieder.und ich will das er es nur einmal macht.

    EDIT:

    dann hab ich noch diesen code hinzugefügt

    GML-Quellcode

    1. if keyboard_check_released(ord("E"))
    2. {
    3. if (global.lastpressed=="right")
    4. {
    5. image_speed=0;
    6. sprite_index=spr_player_idle_right
    7. }
    8. else
    9. {
    10. [b][/b]image_speed=0;
    11. sprite_index=spr_player_idle_left
    12. }
    13. }
    Alles anzeigen


    jedoch hab ich jetzt das problem das er die attacke nicht ganz ausführt.


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

  • jetzt wollte ich es mit einem alarm lösen aber ich bekomm es einfach nicht hin...

    kann mir da jemand helfen bitte....

    also zuerst erstelle ich einen alarm[0] im create event ,der 4 sekunden dauern soll also room_speed*4

    aber was dann.....

    ich hab versucht dann im step event wo der oben stehende code für die attacke steht den alarm zu beenden und es dann mit dem instance_destroy zu zerstören.

    geht nicht...
  • Im Alarm0 wird alles ausgeführt wenn der Alarm abgelaufen ist.
    Andere Möglichkeit wäre mit der abfrage

    if (alarm[0] < 0)
    //alarm ist abgelaufen
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • beim schießen variable ++Timer 0 auf 5 steps if bedingung das nur geschossen werden darf wenn variable kleiner 1 oder == 0 istim timer variable = 0

    - im hero im create event ne variable namens schuss = 0; z.B
    - beim schuss selbst im klick oder tastatur event Prüfung ob schuss = 0 ist wenn ja schuss++; und einen alarm 0 mit roomspeed 5 anlegen
    - im alarm 0 die variable Schuss=0;

    passiert also folgendes:

    im create ist schuss = = bedeutet der heldd arf schiesen weil schuss = 0 ist, druckt er dann ab wird ein timer mit 5 sek getriggert wenn 5 sek erreicht sind setzt der timer schuss wieder auf null zurück der heldd arf erneu schießen
  • @fuexline

    gut also hab ich jetzt im create event die variable attacke=0; hinzugefügt



    acidrain833 schrieb:



    obj_player Create Event

    GML-Quellcode

    1. attacke=0;
    2. alarm[0]=room_speed*5;




    obj_player step event

    GML-Quellcode

    1. if keyboard_check(ord("E")) && (attacke=0)
    2. {
    3. if (global.lastpressed=="right")
    4. {
    5. attacke++
    6. image_speed=0.3;
    7. sprite_index=spr_player_attacke_right;
    8. }
    9. else
    10. {
    11. attacke++
    12. image_speed=0.3;
    13. sprite_index=spr_player_attacke_left;
    14. }
    15. }
    Alles anzeigen


    GML-Quellcode

    1. if keyboard_check_released(ord("E"))
    2. {
    3. if (global.lastpressed=="right")
    4. {
    5. image_speed=0;
    6. sprite_index=spr_player_idle_right
    7. }
    8. else
    9. {
    10. [b][/b]image_speed=0;
    11. sprite_index=spr_player_idle_left
    12. }
    13. }
    Alles anzeigen










    tut mir leid es ist sicher gut erklärrt aber ich weiß nicht wie ich es bei diesem code anwenden soll.apropo es geht nicht mehr um schuss sondern um attacke ist aber eh das selbe in grün...
  • acidrain833 schrieb:

    @fuexline

    obj_player Create Event

    GML-Quellcode

    1. attacke=0;
    2. alarm[0]=room_speed*5;




    obj_player step event

    GML-Quellcode

    1. if keyboard_check(ord("E")) && (attacke=0)
    2. {
    3. if (global.lastpressed=="right")
    4. {
    5. attacke++
    6. image_speed=0.3;
    7. sprite_index=spr_player_attacke_right;
    8. }
    9. else
    10. {
    11. attacke++
    12. image_speed=0.3;
    13. sprite_index=spr_player_attacke_left;
    14. }
    15. attacke=0; //oder doch alarm[0]=0;
    16. }
    Alles anzeigen


    GML-Quellcode

    1. if keyboard_check_released(ord("E"))
    2. {
    3. if (global.lastpressed=="right")
    4. {
    5. image_speed=0;
    6. sprite_index=spr_player_idle_right
    7. }
    8. else
    9. {
    10. [b][/b]image_speed=0;
    11. sprite_index=spr_player_idle_left
    12. }
    13. }
    Alles anzeigen



    Alarm[0] EVENT

    GML-Quellcode

    1. destroy_instance();






    so????? nein oder weil es funkt nicht... ich weiß ich stell mich blöd an aber wenn ich einmal einen richtigen code sehe mierke ich es mir .



    jetzt ist es so das ,wenn ich den Button E gedrückt halte ein paar sekunden führt er mehrmals die schläge aus und dann verschwindet das sprite.(wegen dem destroy instance)
    aber ich brauche das wenn ich einmal den knopf E drücke ,das er dann einmal schlägt.


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