2d sidescrolling problem.

  • GM 7

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

  • 2d sidescrolling problem.

    Hallo,
    ich bin dabei ein 2d sidescrolling MMORPG zu machen.
    ich bin dabei auf folgendes Problem gestoßen:
    Die Computergegner in meinem Spiel, sollen dem Spieler folgen.
    so wie hier
    youtube.com/watch?v=xM_fiDY9pXc&feature=related
    ich hoffe man erkennt was ich meine.

    ich habe es bereits versucht so zu machen.

    GML-Quellcode

    1. if distance_to_object(obj_player) < 200
    2. {
    3. if x>obj_player.x then x-=2 else
    4. if x<obj_player.x then x+=2
    5. }


    allerdings ergibt sich da das problem, das das monster nur bis zum spieler hin läuft, und nicht so um ihn herum.
    Außerdem habe ich noch das Problem mit dem Schlagen wie im oben gezeigten Video. Ich bekomme es einfach nicht hin, bitte helft mir.

    Danke schonmal
    Gruß Terra
  • hrmmm....das is schon mal sehr komplex!
    ich würds so versuchen

    GML-Quellcode

    1. if distance_to_object(obj_player) < 200
    2. {
    3. if (x=0)
    4. {
    5. if (point_distance(x,y,obj_player.x+20,obj_player.y >2)
    6. {
    7. motion_set(point_direction(x,y,obj_player.x+20,obj_player.y),2);
    8. }
    9. else{x=1;}
    10. }
    11. else
    12. {
    13. if (point_distance(x,y,obj_player.x-20,obj_player.y >2)
    14. {
    15. motion_set(point_direction(x,y,obj_player.x-20,obj_player.y),2);
    16. }
    17. else{x=0;}
    18. }
    19. }
    Alles anzeigen


    das ganze ins step event geben....und im create event setz x auf 0.....das sollt funktionieren. zum schlag problem würd ich dir raten die waffe als ein eigenes objekt zu machen das bei treffen des gegners ihn verwundet und halt immer beim player gezeichnet wird und auch dorthin springt.

    aja und noch was: Willkommen im forum :)


    mfg johannski
  • Hi,
    erstmal vielen dank.
    allerdings muss ich sagen, das es leider nicht funktioniert hat :(
    das monster schwebt jetzt hinter dem spieler her,und wenn es den spieler erreicht bleibt es mit ein bisschen rukeln an ihm kleben.
    Habt ihr vielleicht noch einen anderen Vorschlag?

    Gruß Terra
  • uhhh....das war ein bisschen verbuggt was ich da gemacht hab! so ich habs jetz ein bissal überarbeitet

    GML-Quellcode

    1. if distance_to_object(obj_player) < 200
    2. {
    3. if (punkt=0)
    4. {
    5. if (point_distance(x,y,obj_player.x+50,obj_player.y)>(geschwindigkeit+1))
    6. {
    7. motion_set(point_direction(x,y,obj_player.x+50,y),geschwindigkeit);
    8. }
    9. else{punkt=1;}
    10. }
    11. else
    12. {
    13. if (point_distance(x,y,obj_player.x-50,obj_player.y )>(geschwindigkeit+1))
    14. {
    15. motion_set(point_direction(x,y,obj_player.x-50,y),geschwindigkeit);
    16. }
    17. else{punkt=0;}
    18. }
    19. var richtung;
    20. richtung=sign(obj_player.x-x);
    21. if(!place_free(x+(geschwindigkeit*richtung*2),y))
    22. {
    23. vspeed=-12
    24. }
    25. }
    Alles anzeigen


    und im create-event
    eine var punkt und eine var geschwindigkeit erstellen.

    mim sprung bin ich zwar noch nicht zufireden aber ansonsten klappts ganz gut. fals ich ne bessere lösung find post ich sie.
    Dateien
    • bewegen.rar

      (17,98 kB, 232 mal heruntergeladen, zuletzt: )
  • wow super, vielen dank.

    ich werde das ganze mal in mein spiel übertragen und dir über das Ergebnis berichten.

    Danke!

    edit: es klappt, echt super. Allerdings noch nicht 100% :P Der Gegner bleibt nicht stehen, wenn die distanz mehr als 200 beträgt. Ich habe es schon versucht einzubauen, allerdings habe ich scheinbar nicht die richtige stelle gefunden, sodass alles wieder kaputt war :S
    kannst du mir also noch sagen wo ich den folgenden befehl einbauen muss, oder ob ich einen anderen befehl verwenden muss?

    GML-Quellcode

    1. if distance_to_object(obj_player) > 200
    2. {
    3. vspeed=0
    4. }

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Terra ()

  • uhh ja das hab ich vergessen sorry.....einfach ein else anhängen also so:

    GML-Quellcode

    1. if distance_to_object(obj_player) < 200
    2. {
    3. if (punkt=0)
    4. {
    5. if (point_distance(x,y,obj_player.x+50,obj_player.y)>(geschwindigkeit+1))
    6. {
    7. motion_set(point_direction(x,y,obj_player.x+50,y),geschwindigkeit);
    8. }
    9. else{punkt=1;}
    10. }
    11. else
    12. {
    13. if (point_distance(x,y,obj_player.x-50,obj_player.y )>(geschwindigkeit+1))
    14. {
    15. motion_set(point_direction(x,y,obj_player.x-50,y),geschwindigkeit);
    16. }
    17. else{punkt=0;}
    18. }
    19. var richtung;
    20. richtung=sign(obj_player.x-x);
    21. if(!place_free(x+(geschwindigkeit*richtung*2),y))
    22. {
    23. vspeed=-12
    24. }
    25. }
    26. else
    27. {
    28. speed=0;
    29. }
    Alles anzeigen
  • super, es klappt! ich danke dir!
    allerdings habe ich noch eine frage.
    ich habe dem monster jetzt gewährt, den spieler zu schlagen :)
    wie bei dem video zu sehen, schlägt das monster auch nicht jedesmal zu, wenn es den spieler passiert.
    das habe ich also mit einer wahrscheinlichkeit versehen und das klappt auch soweit.
    allerdings passiert es manchmal, das das monster direkt hinternander schlägt, das möchte ich verhindern.
    ich weiß auch schon wie :) ich möchte einen cooldown einbauen,
    d.h. nachdem das monster geschlagen hat, dauert es z.B. 5 sekunden bis es wieder schlagen kann.
    jetzt die Frage: wie geht das mit dem cooldown?

    Vielen dank nochmal für die bisherige Hilfe!
  • ich helf gern nochmal :)

    du musst mit einer hilfsvariable zb. schlagen und (oder auch ) arbeiten.

    du setzt die var schlagen am anfang auf 0
    wenn er nun vorbeikommt kommt eine if abfrage bei der man schaut ob schlagen auch wirklich 0 ist. wenn das der fall ist und auch die wahrscheinlichkeit klappt setzt du die var schlagen einfach auf eins und setzt den alarm 0 auf roomspeed(voreingestellt ist er auf 30)*5 (=5 sekunden). das geht mit .

    dann musst du noch im event alarm 0 die var schlagen auf 0 setzen. fertig :)
  • Hi,
    ich habe noch ein problem gefunden.
    wenn der spieler auf einer höheren ebene ist, scheint der gegner verwirrt :P

    also ich habe eine platform erstellt auf die ich den spieler gesetzt habe, und der gegner, stockt dann nurnoch auf einer stelle..
    weiß jemand wie man dieses problem lösen könnte?

    Danke!

    Gruß Terra
  • Nach nur kurz überfliegen ist mir was einfaches dazu eingefallen, was auf Deinem ersten Ansatz basiert, auch wenn das jetzt vllt. nicht mehr aktuell ist...
    Man könnte dem Monster einen Alarm geben, der nur alle paar Sekunden (und nicht jeden Step) den Wert von obj_player.x speichert. Oder vielleicht den alarm gleich integrieren:

    GML-Quellcode

    1. ti-=1
    2. if (ti<0)
    3. {
    4. ti=15+random(45) // z.B. bei room_speed 30 wären das 0.5 bis 2 Sekunden
    5. playerx=obj_player.x
    6. }
    7. if abs (playerx-x) < 200
    8. {
    9. if x>playerx then x-=2 else
    10. if x<playerx then x+=2
    11. }
    Alles anzeigen

    Allerdings sollte man den unteren Teil schon noch etwas verfeinern. Ich habe jetzt nicht Johannski's Programm gesehen, aber hier zappelt das Monster wahrscheinlich unschön hin und her, wenn es am Zielpunkt angelangt ist. Dem kann man abhelfen, indem man eine kleine "Pufferzone" schafft, wo es sich gar nicht bewegt:

    GML-Quellcode

    1. if x>playerx +2 then x-=2 else
    2. if x<playerx -2 then x+=2

    Dieses Detail kann man sich auch für das beliebte ZumObjektHindrehen merken.
  • Benutzer online 2

    2 Besucher