Pathfinding / Sprite Problem

  • GM 6

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

  • Pathfinding / Sprite Problem

    Guten Morgen GMD Gemeinde,
    ich habe ein Problem, dass ich auch nach langem Überlegen nicht wirklich beheben konnte. Und zwar will ich ein 2D RTS (Strategiespiel) umsetzen im Genreüblichen Grafikstil. Dazu habe ich gerenderte 2d Grafiken. Ich erkläre das Problem am Beispiel der Panzergrafik:


    Wie in Strategiespielen üblich wählt man nun ZB den Panzer aus und klickt auf ein Feld des Spielfeldes. Durch die Pathfinding Funktionen (mp_...) fährt er ja dorthin, jedoch im Winkelbereich von 360°. Die Sprites haben jedoch nur 8 Richtungen. Wenn jetzt zB der Panzer im Winkel von 38° fährt, würde es keine passende Grafik geben, da diese nur im 45° Bereich rotieren. Hat jemand eine Lösung parad?

    Vielen Dank
    BuZZ
    Retroware.de - Webdesign, Print und Apps aus Regensburg.
  • Wenn du pro hast, dann kannst du doch in den Bereichen, wo du keinen
    extra Sprite hast, einfach einen anderen über Image_Angle drehen.
    Oder du lässt den Panzer nur ungefähr in die Richtung schauen, in die er fährt.
    Ich kenne Strategiespiele, bei denen der Panzer nach rechts-unten fährt aber
    nur nach rechts schaut und bei 8 Sprites... also ich glaub nicht, dass das so sehr
    auffällt, wenn der Panzer nach 45° schaut aber nach 55° fährt.
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
  • Etwas umständlich aber durchaus so lösbar:
    Gucke einfach nach zu welchem Sprite seine direction passt:
    if direction >0 and <45
    {
    sprite=1
    }
    usw...
    kann sein das an dem Code was nciht Korrekt ist, habs jetzt nciht kontrolliert.

    MfG gamer
    Aktuelles Projekt: Aufbau - Strategiespiel.
    Aktueller Entwicklungsschritt: Planung | Grundengine entwickeln.

    Wichtig ist nicht, besser zu sein als alle anderen.
    Wichtig ist, besser zu sein als du gestern warst.





  • Dafür gibts ne ganz einfache Lösung:

    GML-Quellcode

    1. image_index = direction/image_number;

    Also so würde es funktionieren, wenn du Subimages nehmen würdest, ansonsten kannst du auch das von gamer nehmen.
    (Dazu musst du dann aber die Subimages anders anordnen: Rechts, Rechts-Oben, Oben, Links-Oben, ... also gegen den Uhrzeigersinn)
  • Guten Morgen GMD Gemeinde,
    Morgen? Um 14:43 Uhr?? xD

    Also zum Problem:
    also ich glaub nicht, dass das so sehr
    auffällt, wenn der Panzer nach 45° schaut aber nach 55° fährt.
    Seh ich also auch so aber es gibt noch eine viel einfachere Lösung als gamers:
    Wenn du alles als Subimages in einem Sprite hast:

    GML-Quellcode

    1. image_index=round(direction/45);

    Dafür musst du die Subimages aber anders sortieren:
    rechts, rechts-oben, oben, oben-links, links, links-unten, unten, unten-rechts

    und wenn du das in einzelnen Sprites hast:

    GML-Quellcode

    1. switch(round(direction/45))
    2. {
    3. case 0:
    4. sprite_index=dein_sprite1;
    5. break;
    6. case 1:
    7. sprite_index=dein_sprite2;
    8. break;
    9. case 2:
    10. sprite_index=dein_sprite3;
    11. break;
    12. case 3:
    13. sprite_index=dein_sprite4;
    14. break;
    15. case 4:
    16. sprite_index=dein_sprite5;
    17. break;
    18. case 5:
    19. sprite_index=dein_sprite6;
    20. break;
    21. case 6:
    22. sprite_index=dein_sprite7;
    23. break;
    24. case 7:
    25. sprite_index=dein_sprite8;
    26. break;
    27. }
    Alles anzeigen


    Hab das jetzt nicht ausprobiert, aber das müsste eig funktionieren...


    Tobi



    €dit:
    Verdammt zu langsam
    @ Copy:
    image_index= direction/image_number kann gar nicht sein, weil z.B. direction=45 und image_number=8 (45/8 ) das rauskäme: 5.625
    Deswegen das: image_index=direction/45
  • Weil alle anderen Posten, wie man allgemein den Sprite für die Direction
    wählen kann: Ich hab die Frage schon richtig verstanden, dass es darum geht,
    wie man die step directions auf 45 er Schritte beschränken kann, oder?

    Wenn ja, dann versuch es mal so:
    Lass den Panzer nicht direkt auf sein Ziel (x) zufahren, sondern über Punkt
    P, das dauert zwar ein wenig länger, aber der Panzer fährt nur in den
    gewünschten Winkeln.
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
  • Spellmaker schrieb:

    Wenn du pro hast, dann kannst du doch in den Bereichen, wo du keinen
    extra Sprite hast, einfach einen anderen über Image_Angle drehen.
    Oder du lässt den Panzer nur ungefähr in die Richtung schauen, in die er fährt.
    Ich kenne Strategiespiele, bei denen der Panzer nach rechts-unten fährt aber
    nur nach rechts schaut und bei 8 Sprites... also ich glaub nicht, dass das so sehr
    auffällt, wenn der Panzer nach 45° schaut aber nach 55° fährt.

    image_angle lässt ihn aber unter umständen auch in 20 grad laufen wobei der sprite immernoch der erste is => nich schön

    copyboy schrieb:

    Dafür gibts ne ganz einfache Lösung:

    GML-Quellcode

    1. image_index = direction/image_number;

    Also so würde es funktionieren, wenn du Subimages nehmen würdest, ansonsten kannst du auch das von gamer nehmen.
    (Dazu musst du dann aber die Subimages anders anordnen: Rechts, Rechts-Oben, Oben, Links-Oben, ... also gegen den Uhrzeigersinn)
    Kommt aufs gleiche hinaus wie oben.

    Tobi schrieb:



    Guten Morgen GMD Gemeinde,
    Morgen? Um 14:43 Uhr?? xD

    Also zum Problem:
    also ich glaub nicht, dass das so sehr
    auffällt, wenn der Panzer nach 45° schaut aber nach 55° fährt.
    Seh ich also auch so aber es gibt noch eine viel einfachere Lösung als gamers:
    Wenn du alles als Subimages in einem Sprite hast:

    GML-Quellcode

    1. image_index=round(direction/45);

    Dafür musst du die Subimages aber anders sortieren:
    rechts, rechts-oben, oben, oben-links, links, links-unten, unten, unten-rechts

    und wenn du das in einzelnen Sprites hast:

    GML-Quellcode

    1. switch(round(direction/45))
    2. {
    3. case 0:
    4. sprite_index=dein_sprite1;
    5. break;
    6. case 1:
    7. sprite_index=dein_sprite2;
    8. break;
    9. case 2:
    10. sprite_index=dein_sprite3;
    11. break;
    12. case 3:
    13. sprite_index=dein_sprite4;
    14. break;
    15. case 4:
    16. sprite_index=dein_sprite5;
    17. break;
    18. case 5:
    19. sprite_index=dein_sprite6;
    20. break;
    21. case 6:
    22. sprite_index=dein_sprite7;
    23. break;
    24. case 7:
    25. sprite_index=dein_sprite8;
    26. break;
    27. }
    Alles anzeigen


    Hab das jetzt nicht ausprobiert, aber das müsste eig funktionieren...


    Tobi



    €dit:
    Verdammt zu langsam
    @ Copy:
    image_index= direction/image_number kann gar nicht sein, weil z.B. direction=45 und image_number=8 (45/8 ) das rauskäme: 5.625
    Deswegen das: image_index=direction/45
    Sehr kompliziert aber durchaus der richtige ansatz würde ich sagen.


    Hast du es schon versucht, die direction im Step Event anzupassen?

    Probier mal:

    GML-Quellcode

    1. if (direction >= 338) && (direction <= 22)
    2. {
    3. direction = 0
    4. image_index = 0
    5. }
    6. if (direction >= 23) && (direction <= 67)
    7. {
    8. direction = 45
    9. image_index = 1
    10. }
    11. if (direction >= 68) && (direction <= 112)
    12. {
    13. direction = 90
    14. image_index = 1
    15. }
    Alles anzeigen


    und so weiter bis du alle 8 images abgedeckt hast ^^

    Hoffe es hilft ^^
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Benutzer online 4

    4 Besucher