char ändert Sprite wenn ich neben ihn klicke und läuft hin

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

  • char ändert Sprite wenn ich neben ihn klicke und läuft hin

    Hi,
    ich habe folgendes problem:

    ich möchte ein spiel machen ala Diablo,
    habe auch schon die sprites für meinen character, also zum beispiel
    nach oben laufn, nach unten laufen, nach rechts, links und so weiter.
    Nun weis ich aber nicht wie ich das mache das wenn ich zb. rechts neben ihn klicke, das entsprechende sprite bzw animation geladen wird und er da hin läuft,(wie er hin läuft weis ich aber eben nicht das das richtige sprite geladen wird)
    Und eins vorweg wie das per tastatur steuerung gemacht wird weis ic, nur eben nicht per Maus, wie bei Diablo halt^^.

    Wäre echt nett wenn mir einer helfen könnte :) .

    Und übrigends ich bin noch ein anfänger, also verstehe noch nix von gml, mache alles per D&D :( .

    Also vielen dank schonmal

    Jahell
  • RE: char ändert Sprite wenn ich neben ihn klicke und läuft hin

    Original von Jahell
    [...]
    Und übrigends ich bin noch ein anfänger, also verstehe noch nix von gml, mache alles per D&D :( .[...]

    Dann wirst du wohl mit deinem Clone nicht so weit kommen... denn es gibt viele sachen die du mit D&D nicht machen kannst. Selbst wenn du dir noch zusätzliche Libs herunterlädst.

    Um des Sprite einen Obejktes oder in dem Fall dein Spielerobjekt zu ändern benutzt du am besten folgende Funktion:

    GML-Quellcode

    1. image_index = spr_bewegung;

    oder halt im D&D: main1 -> Sprites -> Change the Sprite

    Wenn du jedoch nur ein Sprite hast in dem die Bilder wie in einer Animation hinter einander liegen benutzt am besten folgende Funkton:

    GML-Quellcode

    1. image_number = Bildnummer;
  • Ich denke schon, dass es mit D&D möglich ist. Da hast du auch die Möglichkeit, Variablen zu ändern etc. Aber auf Anhieb könnte ich dir die Buttons nichts sagen, wohingegen du den Code ohne weiteres haben könntest.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Ja, also:

    mein char hat 8 sprites für 8 richtungen, d.h.
    nach oben laufen, nach unten, links, rechts,
    obenlinks, untenlinks, obenrechts, untenrechts.

    Und ja das ist eine animation (gif) also 8 gifs.

    und das gleiche wie für laufend hat er auch nochmal stehend, obenrechts stehen, untenlinks stehen usw. also 8 gifs.
    Macht dann insgesammt 16 gifs.

    Nun weis ich wie ich das per tastatur mache. wenn ich zb pfeil nach links auf der tastatur drücke das er dann nach links läuft und die entsprechende animation oder sprite geladen wird.

    Nur bei der maus ist das ja so ne sache, woher "weis" der char das schräg links unten von ihm geklickt wurde, dementsprechend dann die schräglinksuntenlaufannimation geladen wird, und wenn er da angekommen ist die schräg linksunten stehend animation oder sprite geladen wird.

    Könnte mir einer da einen code schreiben oder so den ich dann einfach nur ins step event einfügen muss als script oder als gml coder oder wie auch immer?^^

    Oder ich lad mal hoch und ihr schaut es euch an wenn ihr euch ein bild davon machen möchtet.

    Und vielen dank für die schnelle antwort.

    jahell
  • Du könntest das ganze mit diesem Code machen:

    GML-Quellcode

    1. var dir;
    2. dir=round(direction/45-0.5);
    3. switch(dir)
    4. {
    5. case 0: image_index=spr_rechts;break;
    6. case 1: image_index=spr_rechtsoben;break;
    7. case 2: image_index=spr_oben;break;
    8. case 3: image_index=spr_linksoben;break;
    9. case 4: image_index=spr_links;break;
    10. case 5: image_index=spr_linksunten;break;
    11. case 6: image_index=spr_unten;break;
    12. case 7: image_index=spr_rechtsunten;break;
    13. }
    Alles anzeigen

    Du musst nun nur noch die verschiedenen spr_* durch deine Spritenamen ersetzen und das Script ins Stepevent deines Spielers setzen.

    Dragoon
    int (*x(*x(int))[5])(int*);
    Confused? Yes, it's C!
  • Hm vielen dank, aber hab das ausprobiert und das funzt irgendwie nicht :( .

    Das war ein coder der sagt wie aber nicht wann der spritewechsl statt findet oder?

    Also ich bräuchte einen code der abfragt wo hin ich geklickt habe zb. rechtsoben und dann jenachdem halt das "laufenrechtsoben" sprite lädt, der char sich dann dahin bewegt wo ich geklickt habe(das macht er schon, nur halt ohne spritewechsel), und wenn er an diesem punkt angekommen ist dann das sprite "stehenrechtsoben" lädt.

    Das schwierige hierbei ist, das es 8 verschiedene richtungen gibt wohin er laufen kann, und nicht wie bei der tastatursteuerung wo man für jede richtung eine andere taste nehmen kann bzw 2 damit er schräg läuft, sondern nur eine taste nämlich wie bei mir die linke maustaste. Also müsste man anhand der coordinaten bestimmen welcher sprite geladen werden muss und nicht annhand der taste die gedrückt wird. Oben, rechtsoben, rechts, rechtsunten, unten, linksunten, links, linksoben .
    Für jede richtung habe ich einmal die laufannimation die kommen soll wärend er sich in die entsprechende richtung bewegt und das entsprechende "steh" sprite, was geladen werden soll wenn er da angekommen ist und logischer weise stehen bleibt , damit die laufannimation nicht weiter läuft(sähe dann ja aus wie´n moonwalk^^)

    Also ums kurz zu fassen wenn ich irgendwo hin klicke bewegt er sich da hin! Und wenn ich die maustaste gedrückthalte das er ihr dann follgt.(das funzt schon :D) Aber das alles leider ohne das die richtigen sprites für die entsprechende richtung geladen werden.

    Ich Habe das so gemacht das wenn ich irgendwo hinklicke ein unsichtbarer marker gesetz wird und der char zum marker hin läuft ,wenn er beim marker angekommen ist wird der zerstört. Wenn ich bevor er beim marker angekommen ist einen neuen setze wird der alte zerstört und der char follgt dem neuen marker. Und das er der maus follgt wenn ich sie gedrückt halte ist das andauerdt neue marker gesetzt werden und der alte gelöscht wir aber halt ganz schnell. diesen skript habe ich auch von hier ( gott lobe dieses forum)^^

    Also ich bäuchte einen code der das mit den sprites regelt weil bewegen tut er sich ja schon. Das problem wie gesagt ist das dieser code auch beinhalten müsste Wann ein sprite geladen wird, nicht nur das er es ladt.

    zb. If (obj_marker) to the left of the player load sprite "laufenlinks"
    and if player has the same position like obj_marker load sprite "stehenlinks"

    das müsste der code regeln so ungefähr, weil zum marker laufen tut der char ja schon.

    Hoffe jeder hats verstanden ist halt schwierig für mich weil ich mich wie gesagt noch nicht damit so auskenne^^

    Vielen dank schon mal hoffe jemand bekommt so einen code hin, ist bestimm nicht einfach.

    Jahell
  • Tut mir leid, heute ist wohl nicht mein Tag :O
    So müsste es sein:

    GML-Quellcode

    1. var dir;
    2. dir=round(direction/45);
    3. switch(dir)
    4. {
    5. case 0: sprite_index=spr_rechts;break;
    6. case 1: sprite_index=spr_rechtsoben;break;
    7. case 2: sprite_index=spr_oben;break;
    8. case 3: sprite_index=spr_linksoben;break;
    9. case 4: sprite_index=spr_links;break;
    10. case 5: sprite_index=spr_linksunten;break;
    11. case 6: sprite_index=spr_unten;break;
    12. case 7: sprite_index=spr_rechtsunten;break;
    13. }
    Alles anzeigen

    Damit deine Figur am Ende stopt musst du noch diesen Code anfügen:

    GML-Quellcode

    1. if(speed==0)
    2. {
    3. image_index=0;
    4. image_speed=0;
    5. }
    6. else
    7. {
    8. image_speed=1;
    9. }


    Dragoon
    int (*x(*x(int))[5])(int*);
    Confused? Yes, it's C!
  • Hey supi das klappt fast, nur eins nicht, und zwar wenn erstehen bleibt dann ist es immer das sprite rechts, das heist wenn ich nach links laufe und er stehen bleibt dreht er sich blitzartig um und guckt wieder nach rechts.
    Ich hätte aber gern das er in diese richtung guckt in die er gelaufen ist wenn er stehen bleibt. Die ganzen steh sprites hab ich schon. Geht das auch irgendwie?
  • Ich weiss leider nicht wie du die Bewegung gemacht hast. Das Problem liegt aber daran, dass die direction wieder auf 0 gesetzt wird. Also musst du versuchen die Richtung (direction) beim Anhalten nicht zu ändern.
    So wäre dann das Script zum Laufen:

    GML-Quellcode

    1. var dir;
    2. dir=round(direction/45);
    3. if(speed==0)
    4. {
    5. switch(dir) // Das sind die Sprites beim Stehen
    6. {
    7. case 0: sprite_index=spr_rechts;break;
    8. case 1: sprite_index=spr_rechtsoben;break;
    9. case 2: sprite_index=spr_oben;break;
    10. case 3: sprite_index=spr_linksoben;break;
    11. case 4: sprite_index=spr_links;break;
    12. case 5: sprite_index=spr_linksunten;break;
    13. case 6: sprite_index=spr_unten;break;
    14. case 7: sprite_index=spr_rechtsunten;break;
    15. }
    16. }
    17. else
    18. {
    19. switch(dir) // Das sind die Sprites beim Gehen
    20. {
    21. case 0: sprite_index=spr_rechts;break;
    22. case 1: sprite_index=spr_rechtsoben;break;
    23. case 2: sprite_index=spr_oben;break;
    24. case 3: sprite_index=spr_linksoben;break;
    25. case 4: sprite_index=spr_links;break;
    26. case 5: sprite_index=spr_linksunten;break;
    27. case 6: sprite_index=spr_unten;break;
    28. case 7: sprite_index=spr_rechtsunten;break;
    29. }
    30. }
    Alles anzeigen

    Dragoon
    int (*x(*x(int))[5])(int*);
    Confused? Yes, it's C!
  • Hm hab jetzt keine ahnung wie du das meinst^^
    habe das so gemacht:

    Das beim mausklick ein marker an der stelle gesetzt wird an der ich geklickt habe, der Marker veranlasst das der char drauf zu läuft sobald der marker sich im raum befindet das sieht dann so aus:

    GML-Quellcode

    1. if instance_exists(obj_marker)
    2. then move_towards_point(obj_marker.x,obj_marker.y,3)


    und dann habe ich ein collisions event gemacht, wenn der char den marker berührt wird der marker zerstört und setzt den speed vom char auf 0, was heist das er stehen bleibt.

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

  • Also das hab ich im Step event meines characters:

    GML-Quellcode

    1. Information about object: player
    2. Sprite: <no sprite>
    3. Solid: false
    4. Visible: true
    5. Depth: 0
    6. Persistent: false
    7. Parent: <no parent>
    8. Mask: <same as sprite>
    9. Step Event:
    10. if y is smaller than 620
    11. COMMENT: Das ist weil er in diesen bereich laufen soll wo y kleiner ist als 620
    12. execute code:
    13. if instance_exists(ziel) //(Ziel) wird mit einem Mausklick gesetzt
    14. then mp_potential_step(ziel.x,ziel.y,5,false);
    15. else
    16. speed=0
    17. execute code:
    18. var dir;
    19. dir=round(direction/45);
    20. if speed=0
    21. {
    22. switch(dir) // Das sind die Sprites beim Stehen
    23. {
    24. case 0: sprite_index=stehenrechts;break;
    25. case 1: sprite_index=stehenrechtsoben;break;
    26. case 2: sprite_index=stehenoben;break;
    27. case 3: sprite_index=stehenlinksoben;break;
    28. case 4: sprite_index=stehenlinks;break;
    29. case 5: sprite_index=stehenlinksunten;break;
    30. case 6: sprite_index=stehenunten;break;
    31. case 7: sprite_index=stehenrechtsunten;break;
    32. }
    33. }
    34. else
    35. {
    36. switch(dir) // Das sind die Sprites beim Gehen
    37. {
    38. case 0: sprite_index=laufenrechts;break;
    39. case 1: sprite_index=laufenrechtsoben;break;
    40. case 2: sprite_index=laufenoben;break;
    41. case 3: sprite_index=laufenlinksoben;break;
    42. case 4: sprite_index=laufenlinks;break;
    43. case 5: sprite_index=laufenlinksunten;break;
    44. case 6: sprite_index=laufenunten;break;
    45. case 7: sprite_index=laufenrechtsunten;break;
    46. }
    47. }
    Alles anzeigen



    Da kommt zwar keine fehlermeldung und es funktioniert auch FAST, nur eben nicht das er die "laufensprites" lädt sondern immer bei den "stehensprites" bleibt .

    Was komisch ist wenn ich an statt :

    GML-Quellcode

    1. mp_potential_step(ziel.x,ziel.y,5,false);


    das hier eingebe:

    GML-Quellcode

    1. move_towards_point(ziel.x,ziel.y,5)


    dann funktionierts mit dem spritewechsel, aber er hat dann aber keine intelligente wegfindung das möchte ich nicht, ich will ja das er um objekte von allein herum läuft.



    Was läuft da falsch?
    Bitte helft mir ich bin am verzweifeln ;(


    Jahell

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von Jahell ()

  • Okay das muss so funktionieren

    GML-Quellcode

    1. var dir;
    2. dir=round(direction/45);
    3. if xprevious=x and yprevious=y
    4. {
    5. switch(dir)
    6. {
    7. case 0: sprite_index=spr_rechts;break;
    8. case 1: sprite_index=spr_rechtsoben;break;
    9. case 2: sprite_index=spr_oben;break;
    10. case 3: sprite_index=spr_linksoben;break;
    11. case 4: sprite_index=spr_links;break;
    12. case 5: sprite_index=spr_linksunten;break;
    13. case 6: sprite_index=spr_unten;break;
    14. case 7: sprite_index=spr_rechtsunten;break;
    15. }
    16. }
    17. else
    18. {
    19. switch(dir)
    20. {
    21. case 0: sprite_index=spr_rechts_steh;break;
    22. case 1: sprite_index=spr_rechtsoben_steh;break;
    23. case 2: sprite_index=spr_oben_steh;break;
    24. case 3: sprite_index=spr_linksoben_steh;break;
    25. case 4: sprite_index=spr_links_steh;break;
    26. case 5: sprite_index=spr_linksunten_steh;break;
    27. case 6: sprite_index=spr_unten_steh;break;
    28. case 7: sprite_index=spr_rechtsunten_steh;break;
    29. }
    30. }
    Alles anzeigen


    Bei mp_potential_step wird speed nicht verändert weshalb es auch nicht funktioniert hat.

    Und denk daran: Wut ist besser als Verzweiflung. (aber nicht immer für deine Umgebung ;))
  • Oh hi^^
    Wahnsinn super, danke.

    Das muss man auch erstma wissen das beim:

    GML-Quellcode

    1. mp_potential_step

    speed nicht verändert wird^^.

    Aber ich weis nicht woran das liegt, aber in eine richtung und zwar in die rechte kommen fehler. sonst klappt alles.
    Wie kann ich die datei (mein spiel) hoch laden?

    Dann kann man sich angucken was ich meine.

    Jahell

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

  • Brauchste nicht uploaden. Ich weiß wo der Fehler liegt. Du meints das er beim stehen nach rechts guckt stimmts? *überleg* habs! (glaube ich)

    Und vergiss nicht: Genau hingucken was da steht!

    Create Event

    GML-Quellcode

    1. dir_previous=0


    Step Event

    GML-Quellcode

    1. var dir;
    2. dir=round(direction/45);
    3. if xprevious=x and yprevious=y
    4. {
    5. switch(dir)
    6. {
    7. case 0: sprite_index=spr_rechts;break;
    8. case 1: sprite_index=spr_rechtsoben;break;
    9. case 2: sprite_index=spr_oben;break;
    10. case 3: sprite_index=spr_linksoben;break;
    11. case 4: sprite_index=spr_links;break;
    12. case 5: sprite_index=spr_linksunten;break;
    13. case 6: sprite_index=spr_unten;break;
    14. case 7: sprite_index=spr_rechtsunten;break;
    15. }
    16. dir_previous=dir
    17. }
    18. else
    19. {
    20. switch(dir_previous)
    21. {
    22. case 0: sprite_index=spr_rechts_steh;break;
    23. case 1: sprite_index=spr_rechtsoben_steh;break;
    24. case 2: sprite_index=spr_oben_steh;break;
    25. case 3: sprite_index=spr_linksoben_steh;break;
    26. case 4: sprite_index=spr_links_steh;break;
    27. case 5: sprite_index=spr_linksunten_steh;break;
    28. case 6: sprite_index=spr_unten_steh;break;
    29. case 7: sprite_index=spr_rechtsunten_steh;break;
    30. }
    31. }
    Alles anzeigen
  • Du meinst weil er die direktion immer wieder auf null setzt?
    Nein das habe ich schon gelöst^^
    und zwar wird die direction immer wieder auf null gesetzt wenn er das objekt ziel erreicht(das mit einem mausklick gesetzt wird).
    das habe ich wie folgt unterbunden:

    GML-Quellcode

    1. if (distance_to_object(player)<0.1)
    2. instance_destroy()


    Das ist im step event des objektes ziel.

    Und weil er es nicht mehr erreicht wird das auch nicht mehr auf null gesetzt(hab das im debugmode geprüft)

    Ist schneinbar ein anderes, das kommt mir so vor als läge es an der rounddirection also immer wenn ich in einem bestimmten winkel von ihm klicke läd er das sprite manchmal nicht .
    Also wenn er zb. nach links läuft dann bewegt er sich wenn ich rechts von ihm licke stehend nach rechts und umgekehrt. Ich glaube das ein bestimmter winkel von ihm aus nichts bewirkt.

    Buuuuhhäää schon wieder ein problem, bitte bitte helft mir.

    Aber wie lädt man es hoch wäre trotzdem praktisch wenn ich es mal wüsste^^ :P Wäre vllt auch besser dann könnte man das problem öfters viel schneller lösen.

    Jahell

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Jahell ()

  • Das mit dem if (distance_to_object(player)<0.1) wusste ich auch noch nicht.Finde meine aber Metohde besser.
    Zurück zu deinem Problem. Das liegt glaub ich daran das er bei 360 8 raus bekommt und deswegen nicht lädt

    GML-Quellcode

    1. var dir;
    2. dir=round(direction/45);
    3. if xprevious=x and yprevious=y
    4. {
    5. switch(dir)
    6. {
    7. case 0: sprite_index=spr_rechts;break;
    8. case 1: sprite_index=spr_rechtsoben;break;
    9. case 2: sprite_index=spr_oben;break;
    10. case 3: sprite_index=spr_linksoben;break;
    11. case 4: sprite_index=spr_links;break;
    12. case 5: sprite_index=spr_linksunten;break;
    13. case 6: sprite_index=spr_unten;break;
    14. case 7: sprite_index=spr_rechtsunten;break;
    15. case 8: sprite_index=spr_rechts;break;
    16. }
    17. dir_previous=dir
    18. }
    19. else
    20. {
    21. switch(dir_previous)
    22. {
    23. case 0: sprite_index=spr_rechts_steh;break;
    24. case 1: sprite_index=spr_rechtsoben_steh;break;
    25. case 2: sprite_index=spr_oben_steh;break;
    26. case 3: sprite_index=spr_linksoben_steh;break;
    27. case 4: sprite_index=spr_links_steh;break;
    28. case 5: sprite_index=spr_linksunten_steh;break;
    29. case 6: sprite_index=spr_unten_steh;break;
    30. case 7: sprite_index=spr_rechtsunten_steh;break;
    31. case 8: sprite_index=spr_rechtsunten_steh;break;
    32. }
    33. }
    Alles anzeigen