Kampf KI

  • GM 8

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

  • Hi,
    ich bin gerade dabei eine Kampf Ki zu schreiben.

    Sie soll in etwa das hier können:
    -Den Spieler ab einer bestimmten reichweite erkennen und verfolgen
    -Wenn die Gegner KI nah genug am Spieler ist soll sie den Sprite ändern und zuschlagen
    -Über Abgründe Springen

    Das sind zumindest erstmal die Grundlagen die ich dafür benötige.
    Ich hab natürlich schon angefangen nur da gibt es noch ein par Problem.

    Hier mal der Code:

    Im Step event :
    Spoiler anzeigen

    GML-Quellcode

    1. //Gravity
    2. if (place_free(x,y+1))
    3. {
    4. gravity=1;
    5. }
    6. else
    7. {
    8. gravity=0;
    9. }
    10. //Verfolgung des Spielers
    11. if (instance_exists(Player))
    12. {
    13. if distance_to_object(Player)< 200
    14. {
    15. move_towards_point(Player.x,Player.y,6)
    16. }
    17. if distance_to_object(Player)< 10 //Angriff des Spielers
    18. {
    19. sprite_index=enemy_atack;
    20. }
    21. else if distance_to_object(Player)> 10 //Stoppen des Angriffes
    22. {
    23. sprite_index=Enemy1;
    24. }
    25. }
    Alles anzeigen



    Im Collisions Event mit dem Spieler:
    Spoiler anzeigen

    GML-Quellcode

    1. //Gegner greift an - Player geht in die Verletzungs animation
    2. //und bewegt sich ein stück nach hinten *Funktioniert*
    3. //Player greift an - Gegner geht in die Verletzungs animation
    4. //und bewegt sich ein stück nach hinten *Funktioniert nicht*
    5. //Angriff Gegner KI
    6. if (obj_enemy.sprite_index==enemy_atack)
    7. {
    8. global.MyHp-=1; //HP des Players
    9. Player.sprite_index=Player_injury;
    10. {
    11. if (Player.image_xscale=1)
    12. {
    13. Player.hspeed-=3;
    14. Player.vspeed=-3;
    15. }
    16. if (Player.image_xscale=-1)
    17. {
    18. Player.hspeed+=3;
    19. Player.vspeed=-3;
    20. }
    21. }
    22. }
    23. //Angriff Player
    24. if (Player.sprite_index==Player_attack)
    25. {
    26. if (Player.image_xscale=1)
    27. {
    28. motion_add(other.image_angle,0.15);
    29. vspeed=-0.5;
    30. enemyHP -= 0.19; //-1hp
    31. obj_enemy.sprite_index=enemy_hurt;
    32. }
    33. if (Player.image_xscale=-1)
    34. {
    35. motion_add(other.image_angle,-0.15);
    36. vspeed=-0.5;
    37. enemyHP -=0.19;
    38. obj_enemy.sprite_index=enemy_hurt;
    39. }
    40. }
    Alles anzeigen


    Im Collisions Event mit dem Boden:
    Spoiler anzeigen

    GML-Quellcode

    1. if (obj_enemy.sprite_index==enemy_hurt)
    2. {
    3. vspeed=0;
    4. hspeed=0;
    5. move_contact_solid(270,12);
    6. obj_enemy.sprite_index=Enemy1;
    7. }
    8. if vspeed > 0 && !place_free(x,y + vspeed)
    9. {
    10. move_contact_solid(270,vspeed);
    11. vspeed=0;
    12. }
    Alles anzeigen


    Und im Create Event ist nur die HP des Gegners festgelegt.

    So kommen wir zum 1. Problem:
    Wenn ich den Gegner angreife verliert er HP, geht allerdings nicht in die Verletzungs Animation und bewegt sich auch nicht.
    Wo das Problem liegt ist mir schon klar undzwar liegt das damit zusammen dass mein Spieler mich andauernd verfolgt und somit sich nicht Bewegt(zumindest nicht so wie ich will) wenn ich ihn attacke und die Animation dann auch nicht wechseln kann.
    Also gibt es eine Möglichkeit die Verfolgung des Players zu stoppen sobald ich ihn Angreife und dann nach der Verletzungsanimation mich wieder zu verfolgen?

    2. Problem:
    Ihn über einen Abgrund Springen lassen, das ist denke ich nicht so schwer.
    Mein erstellt 2 objekte 1 vor und 1 nach dem Abgrund und lässt den Gegner dann vor dem Abgrund(beim1.obj) springen und ihn dann beim 2. obj landen.So würde ich es zumindest erstmal versuchen, ist das die einfachste möglichkeit bzw geht das Überhaupt? :D

    So ich hoffe ihr blickt durch und könnt mir ein bischen aushelfen, achja und wenn es einfache/bessere Methoden gibt als wie ich sie benutzt habe, dann lasst es mich wissen, bin leider noch kein Experte was GML Programmierungen angeht. ^^


    MFG~
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.

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

  • Okay, hab es jetzt selbst gelöst ,es war einfacher zu lösen als ich dachte, da hätte ich auch direkt drauf kommen können. :D

    Ich hab jetzt aber eine andere Frage, ich habs jetzt so gemacht das die KI auf eine bestimmte Situation meines Spielers reagiert, wie kann ich jetzt machen dass die KI die Reaktion nicht immer ausführt, also z.B nur eine 50% chance dass er auf diese Situation auch so reagiert?


    MFG~
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.
  • mit diesen drag&drop befehl: :action_ifdice: (unter "control")

    oder du erstellst eine variable und weist ihr (bei der situation) mit choose(0,1) eine wert zu und wenn sie 1 ist, reagiert dein gegner darauf und setzt nachher die variable wieder auf 0. choose wählt aus den angegebenen werten zufällig einen aus.



    mfg.snake5

  • Danke, funktioniert soweit erstmal. :)
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.
  • Hab mal wieder ein neues Problem.

    Eigentlich wollte ich nur dass meine KI Automtaisch sein Sprite ändert wenn er sich nach links oder rechts bewegt nur dabei ist ein anderer Fehler entstanden.

    Im step Event:
    Spoiler anzeigen

    GML-Quellcode

    1. //Verfolgung
    2. if (instance_exists(Player) && vblock==0)
    3. {
    4. if distance_to_object(Player)< 400
    5. {
    6. move_towards_point(Player.x,Player.y,6)
    7. }
    8. if distance_to_object(Player)< 10 //Wenn Nah genug Angriff
    9. {
    10. sprite_index=enemy_atack;
    11. }
    12. else if distance_to_object(Player)> 10
    13. {
    14. sprite_index=enemy_move;
    15. }
    16. }
    17. //Sprite ändern
    18. if (hspeed>0 && !scaleblock)
    19. {
    20. sprite_index=enemy_move;
    21. obj_enemy.image_xscale=-1;
    22. scaleblock = true;
    23. }
    24. if (hspeed<0&& !scaleblock)
    25. {
    26. sprite_index=enemy_move;
    27. obj_enemy.image_xscale=1;
    28. scaleblock = true;
    29. }
    Alles anzeigen


    Im collisions Event mit dem Boden:
    Spoiler anzeigen

    GML-Quellcode

    1. if (obj_enemy.sprite_index==enemy_hurt)
    2. {
    3. vspeed=0;
    4. hspeed=0;
    5. move_contact_solid(270,12);
    6. obj_enemy.sprite_index=enemy_stand;
    7. chanceblock =false;
    8. blocka = false;
    9. if (vblock==1)
    10. {
    11. alarm[0]=12;
    12. }
    13. if (vblock==2)
    14. {
    15. alarm[0]=25;
    16. }
    17. if (vblock==3)
    18. {
    19. alarm[0]=28;
    20. }
    21. }
    22. if vspeed > 0 && !place_free(x,y + vspeed)
    23. {
    24. move_contact_solid(270,vspeed);
    25. vspeed=0;
    26. scaleblock = false;
    27. }
    Alles anzeigen


    So nun zum Problem: Meine KI reagiert auf:
    if distance_to_object(Player)< 10

    nicht, sondern nur wenn die KI sich Oberhalb des Bodens befindet reagiert er darauf.

    Ich hab echt keine Ahnung warum dass so ist...
    Wenn mir jemand Helfen könnte und/oder den Fehler entdeckt wär ich sehr dankbar für.


    MFG~
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.
  • ich kann dir nicht genau sagen wo der fehler liegt, aber mit ist aufgefallen das du im code ein paar stellen so hast:

    GML-Quellcode

    1. obj_enemy.image_xscale=1;

    es würde image_xscale=1; (ohne obj_enemy.) reichen, denn wenn du es so wie im obrigen code hast (mit obj_enemy.), würde es (wenn es mehrere gegner im raum geben würde) für alle gegner den image_xscale auf 1 setzen. und das willst du ja nicht, oder?
    ich hoffe ich irre mich nicht...



    mfg.snake5