Sprite rotation / bei Bewegung in 8 Richungen

  • GM 8

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

  • Sprite rotation / bei Bewegung in 8 Richungen

    Hi Leute.

    Leider bin ich gard etwas ratlos was das folgende Problem angeht. Und hoffe das ihr mir etwas helfen könnt.
    In meinem Spiel soll / darf der Player mit den " Arrow " Tasten Schüsse abfeuern. Diese werden zur gewünschten ( gedrückten Taste ) hin gedreht bzw. rotiert. Links, oben , unten ,... rechts stellt soweit kein Problem da. Aber wenn 2 Tasten zusammen gedrückt werden ,.. z.b. rechts + oben ,...soll natürlich auch der Schuss im 45 grad Winkel erscheinen. Das bekomme ich leider nicht ganz zu 100 % hin,.. da leider auch bei dieser Aktion Schüsse angezeigt ( erzeugt ) werden von Richtungen oben und rechts.
    Wie bekomme ich das hin,.. das ich nur Schüsse erzeuge die auch dem entsprechenden Winkel entsprechen. Und so auch dargestellt werden,...
    Hier ein Beispiel der Problematik

    mediafire.com/download/e744tmrwbydm7de/test1.gm81

    Andy

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

  • Habe mir das nicht runtergeladen, aber wie wäre es irgendwie so

    GML-Quellcode

    1. if((keyboard_check_pressed(vk_up)) && (keyboard_check_pressed(vk_right)))
    2. {schief = true//damit die einzelnen nicht geschossen werden
    3. ...}//feuer in 45 grad, weiß nicht wie ich es machen würde
    4. //z.b für nen geraden
    5. if((keyboard_check_press(vk_up)) && schief = false)
    6. {...}//feuer nur nach oben

    Und dann logischerweise für die anderen Kombinationen auch noch.

    Bestimmt nicht besonders elegant und auch nicht getestet, aber vielleicht hilft es dir ja...
    GML lernen geht leicht :)
    1. http://www.gm-d.de/help/ (deutsch)
    2. gm-d.de/wbb/index.php/Thread/2270/ (Einsteiger-Referenz)
    3. docs.yoyogames.com/ (Hilfe auf Englisch von GM:S)
  • vielleicht ja so:

    GML-Quellcode

    1. var i;
    2. i=instance_create(x,y,schuss);
    3. i.direction=floor(point_direction(0,0,keyboard_check(vk_left)-keyboard_check(vk_right),keyboard_check(vk_up)-keyboard_check(vk_down))/45)*45;
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • hmm, ja ja,.. hat leider auch nix gebracht.
    Ich hab wie gesagt 8 unterschiedliche Schussrichtungen , die klappen auch. Ich hab auch dazu 8 " unterschiedliche " Schussobjekte die ich für die einzelnen Winkel starten lassen möchte. Also drückt man rechts + oben zusammen soll ,..OBj_ Schuss winkel 45 grad erstellt werden. Da macht er auch irgendwie , nur halt gepaart mit Schüssen der Richtung oben + Rechts. Die da nicht hingehören.

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

  • Dann würd ich vermuten, dass du bei den Schrägschüssen die gerade-aus-schieß-option blockierst. Ich hab das bei meinem Code mit schief = true probiert.
    Soweit wie ich es gemacht hab, kannst du ja dann auswählen, welches Objekt du erzeugst.
    Hab auf dem Computer kein GM, deswegen lad ich mir die Datei nicht runter, deswegen ist es vielleicht besser, wenn du nur den entsprechenden Codeschnipsel zeigst.
    GML lernen geht leicht :)
    1. http://www.gm-d.de/help/ (deutsch)
    2. gm-d.de/wbb/index.php/Thread/2270/ (Einsteiger-Referenz)
    3. docs.yoyogames.com/ (Hilfe auf Englisch von GM:S)
  • create

    GML-Quellcode

    1. cooldown = 7
    2. heat = 0
    3. image_speed = 0




    step event

    GML-Quellcode

    1. image_index = point_direction(x,y,obj_ziel.x,obj_ziel.y) / 4 ;
    2. if keyboard_check(vk_right) && keyboard_check(vk_up) if (heat <= 0){
    3. instance_create(obj_myshipparent.x,obj_myshipparent.y,obj_schuss145)
    4. heat = cooldown
    5. }
    6. if keyboard_check(vk_left) && keyboard_check(vk_up) if (heat <= 0){
    7. instance_create(obj_myshipparent.x,obj_myshipparent.y,obj_schuss1135)
    8. heat = cooldown
    9. }
    10. if keyboard_check(vk_left) && keyboard_check(vk_down) if (heat <= 0){
    11. instance_create(obj_myshipparent.x,obj_myshipparent.y,obj_schuss1215)
    12. heat = cooldown
    13. }
    14. if keyboard_check(vk_down) && keyboard_check(vk_right) if (heat <= 0){
    15. instance_create(obj_myshipparent.x,obj_myshipparent.y,obj_schuss1315)
    16. heat = cooldown
    17. }
    18. if keyboard_check(vk_down) if (heat <= 0){
    19. instance_create(obj_myshipparent.x,obj_myshipparent.y,obj_schuss1unten)
    20. heat = cooldown
    21. }
    22. if keyboard_check(vk_right) if (heat <= 0){
    23. instance_create(obj_myshipparent.x,obj_myshipparent.y,obj_schussrechts)
    24. heat = cooldown
    25. }
    26. if keyboard_check(vk_up) if (heat <= 0){
    27. instance_create(obj_myshipparent.x,obj_myshipparent.y,obj_schuss1oben)
    28. heat = cooldown
    29. }
    30. if keyboard_check(vk_left) if (heat <= 0){
    31. instance_create(obj_myshipparent.x,obj_myshipparent.y,obj_schuss1links)
    32. heat = cooldown
    33. }
    34. heat = max(0, heat - 1)
    Alles anzeigen


    soweit die Code - Geschichte

    edit : Problem ist leider immernoch nicht behoben.

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

  • Mit ein wenig Ahnung für Binär#swag geht das auch vieeel einfacher:

    GML-Quellcode

    1. count = 0;
    2. if heat>0 { heat-=1; exit; }
    3. if keyboard_check_pressed(vk_right) { count += 1; }
    4. if keyboard_check_pressed(vk_up) { count += 2; }
    5. if keyboard_check_pressed(vk_left) { count += 4; }
    6. if keyboard_check_pressed(vk_down) { count += 8; }
    7. shot = instance_create(x,y,objShot)
    8. shot.speed = 10;
    9. if count = 1 {shot.direction = 0;}
    10. if count = 2 {shot.direction = 90;}
    11. if count = 3 {shot.direction = 45;}
    12. if count = 4 {shot.direction = 180;}
    13. if count = 6 {shot.direction = 135;}
    14. if count = 8 {shot.direction = 270;}
    15. if count = 9 {shot.direction = 315;}
    16. if count = 12 {shot.direction = 235;}
    17. shot.image_angle = shot.direction;
    18. heat = cooldown;
    19. /*
    20. auch mit switch(count) {} möglich, ev. sogar einfacher.
    21. */
    Alles anzeigen


    Versuchs einfach mal, ich kann mir vorstellen, dass es ein oder zwei kleine Probleme geben wird (zB die reihenfolge, in der man die tasten drückt), aber wenn alles funktioniert bin ich bereit dir den gesamten code zu schreiben :)
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)

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

  • Sauber! Die Antwort ( Vorschlag ) von Levarris07 passt! Danke Dir!
    Ich hab ihn auch ein wenig nach meien Bedürfnissen angepasst. Da ich z.b. eine Dauerfeuerfunktion brauche.
    EINE kleine Sache noch!
    Kannst Du mir noch eventuell verraten , wie ich deinen Code ändern muß damit nicht permanent Schüsse erzeugt werden. Sondern die sollten auch wirklich nur dann erzeugt werden wenn man die entsprechende Arrow- Taste betätigt.

    GML-Quellcode

    1. count = 0;
    2. count2 = 0;
    3. if heat>0 { heat-=1; exit; }
    4. if keyboard_check(vk_right) { count += 1; }
    5. if keyboard_check(vk_up) { count += 2; }
    6. if keyboard_check(vk_left) { count += 4; }
    7. if keyboard_check(vk_down) { count += 8; }
    8. if keyboard_check(vk_right) { count2 += 1; }
    9. if keyboard_check(vk_up) { count2 += 2; }
    10. if keyboard_check(vk_left) { count2 += 4; }
    11. if keyboard_check(vk_down) { count2 += 8; }
    12. shot = instance_create(x,y,obj_schussrechts)
    13. shot2 = instance_create(x,y,obj_schussrechts2)
    14. if count = 1 {shot.direction = 0;}
    15. if count = 2 {shot.direction = 90;}
    16. if count = 3 {shot.direction = 45;}
    17. if count = 4 {shot.direction = 180;}
    18. if count = 6 {shot.direction = 135;}
    19. if count = 8 {shot.direction = 270;}
    20. if count = 9 {shot.direction = 315;}
    21. if count = 12 {shot.direction = 235;}
    22. shot.image_angle = shot.direction;
    23. if count = 1 {shot2.direction = 10;}
    24. if count = 2 {shot2.direction = 100;}
    25. if count = 3 {shot2.direction = 55;}
    26. if count = 4 {shot2.direction = 190;}
    27. if count = 6 {shot2.direction = 145;}
    28. if count = 8 {shot2.direction = 280;}
    29. if count = 9 {shot2.direction = 325;}
    30. if count = 12 {shot2.direction = 245;}
    31. shot2.image_angle = shot2.direction;
    32. heat = cooldown;
    Alles anzeigen
  • Öhm, wie?
    Es werden durchgehend Schüsse erzeugt? 8|

    Das sollte eigentlich durch "if heat>0" geregelt sein.

    Ich versteh grad nicht ganz, Du willst eine Dauerfeuerfunktion, aber es soll nicht durchgehend schießen?
    Nochmals genauer bitte und ich versuchs zu lösen ^^
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
  • Naja,.. in diesem Code läßt du ja die Schüsse automatisch starten. Shot = instance create...usw. Und ich möchte!!! gerne das die Schüsse nicht automatisch erzeugt werden. Sonder erst wenn ich die Arrow- Tasten drücke.
    Das mit der Dauerfeueroption ,.. da meinte ich das es möglich ist wenn man die Arrowtasten gedrückt hält ,.. auch permanent Schüsse erzeugt werden.
  • Dann stimmt was nicht, denn in diesem Code werden sie nur dann erzeugt, wenn die Taste gedrückt wird 8|

    GML-Quellcode

    1. count = 0;
    2. if heat>0 { heat-=1; exit; }
    3. if keyboard_check_pressed(vk_right) { count += 1; }
    4. if keyboard_check_pressed(vk_up) { count += 2; }
    5. if keyboard_check_pressed(vk_left) { count += 4; }
    6. if keyboard_check_pressed(vk_down) { count += 8; }
    7. //füg das hier noch ein
    8. if count = 0 { exit; }
    9. //ev. funktioniert das so
    10. shot = instance_create(x,y,objShot)
    11. shot.speed = 10;
    Alles anzeigen


    Edit: @CAS:
    Versuchs einfach mal, ich kann mir vorstellen, dass es ein oder zwei kleine Probleme geben wird (zB die reihenfolge, in der man die tasten drückt), aber wenn alles funktioniert bin ich bereit dir den gesamten code zu schreiben :)


    Das habe ich bereits erwähnt, ich werde den Code auch noch sauberer machen.
    Wenn man mit dem jetzigen Code nach links UND rechts drückt, kommt einfach ein Schuss nach rechts.
    Immer mit der Ruhe :)
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
  • CAS schrieb:

    @levarris07: Schonmal drüber nachgedacht, was passiert, wenn der Spieler zwei gegenüberliegende Tasten drückt, oder mehr als 2 Tasten?


    Kein Problem :)

    Und hier noch ein kleiner Schnipsel, um die Probleme, die CAS angesprochen hat, zu lösen:

    GML-Quellcode

    1. if keyboard_check_pressed(vk_down) { count += 8; }
    2. //füg das hier noch ein
    3. if count = 0 or count = 5 or count = 7 or count = 10 or count = 11 or count >12 { exit; } //gott ist das hässlich D:
    4. //ev. funktioniert das so
    5. shot = instance_create(x,y,objShot)
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)