gamepad-code optimierung

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

  • gamepad-code optimierung

    moin :)

    ich habe hier den code meiner gamepadsteuerung (xbox 360/one controller). unschön und störend ist damit, dass die diagonalsteuerung träger ist, als up/down/left/right.
    was könnte man hier optimieren? if up & left {code} etc. ??

    GML-Quellcode

    1. ///gamepad movement
    2. if sprite_index = spr_playership || sprite_index = spr_playership_lowhealth
    3. {
    4. // set up gamepad & variables
    5. (up = (gamepad_axis_value(0, gp_axislv));
    6. down = (gamepad_axis_value(0, gp_axislv));
    7. left = (gamepad_axis_value(0, gp_axislh));
    8. right = (gamepad_axis_value(0, gp_axislh));
    9. a_button = (gamepad_button_check(0, gp_face1));
    10. x_button = gamepad_button_check_pressed(0, gp_face3);
    11. //deadzone gamepad
    12. gamepad_set_axis_deadzone(0, 0.5);
    13. gamepad_set_button_threshold(0, 0.1);
    14. //do not fly outside view
    15. x = clamp(x, view_xview[0]+sprite_width,view_xview[0]+view_wview[0]-sprite_width)
    16. y = clamp(y, view_yview[0]+sprite_height, view_yview[0]+view_hview[0]-sprite_height)
    17. // move up with rotation
    18. if up < 0
    19. {
    20. image_angle += 3;
    21. y += up * playerspeed;
    22. image_angle =lerp(image_angle, 3, .1)
    23. }
    24. else
    25. if down > 0 //move down with rotation
    26. {
    27. image_angle -= 3;
    28. y += down * playerspeed;
    29. image_angle =lerp(image_angle, 3, .1)
    30. }
    31. else
    32. image_angle =lerp(image_angle,0, .1)
    33. //move left
    34. if left < 0
    35. {
    36. x += left * playerspeed;
    37. }
    38. //move right
    39. if right > 0
    40. {
    41. x += right * playerspeed;
    42. }
    43. //a_button shoot
    44. if can_shoot && a_button
    45. {
    46. //gunfire
    47. gunfire = instance_create(obj_playership.x+19 + lengthdir_x(0, image_angle), obj_playership.y+2 + lengthdir_y(20, image_angle), obj_playership_gunfire)
    48. gunfire.image_angle = image_angle;
    49. //spreadshot_bullet_straight
    50. bullet = instance_create(obj_playership.x + lengthdir_x(17, image_angle), obj_playership.y+2.5 + lengthdir_y(20, image_angle), obj_spreadshot);
    51. bullet.image_angle = image_angle;
    52. bullet.speed = playerspeed+5;
    53. bullet.direction = image_angle;
    54. //spreadshot_bullet_up
    55. bullet = instance_create(obj_playership.x + lengthdir_x(17, image_angle), obj_playership.y+2.5 + lengthdir_y(20, image_angle), obj_spreadshot);
    56. bullet.image_angle = image_angle-7;
    57. bullet.speed = playerspeed+5;
    58. bullet.direction = image_angle-7;
    59. //spreadshot_bullet_down
    60. bullet = instance_create(obj_playership.x + lengthdir_x(17, image_angle), obj_playership.y+2.5 + lengthdir_y(20, image_angle), obj_spreadshot);
    61. bullet.image_angle = image_angle+7;
    62. bullet.speed = playerspeed+5;
    63. bullet.direction = image_angle+7;
    64. //spreadshoot_sfx
    65. audio_play_sound(sfx_lightbullet, 1, false);
    66. can_shoot = false;
    67. alarm[0] = 5;
    68. }
    69. }
    Alles anzeigen


    grüße aus dem norden

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

  • Kommt drauf an, wie frei sich dein Char bewegen soll, würde ich sagen. Ist es zwingend erforderlich, dass er sich nur in 8 Richtungen bewegen soll? Oder "darf" er sich komplett frei bewegen?

    Bei freier Bewegung kannst du einfach die Direktion auf den Winkel des Stücks umrechnen und den speed auf die Distanz des Stücks

    Bei 8 Richtungen wurde etwas aufwändiger.. Ich würde wieder den Winkel des Stücks ausrechnen und dann eben abfragen
    if(Winkel >= 22,5 && Winkel < 67,5) Char diagonal rechts-oben
    Else if(Winkel >= 67,5 && Winkel < 112,5) Char nach rechts.

    Also davon ausgegangen dass stick hoch Winkel 0 ist und sich im Uhrzeigersinn erhöht.
  • moin him666!

    erst mal danke für deine antwort. es geht bei meinem optimieren aber nicht um den winkel meines charakters. es ist ein raumschiff. sidescroller-shmup. image_angle hat hier nur den einsatz, dass sich die "nase" des schiffes hebt und senkt. das funktioniert alles prächtigst. mir ist aber aufgefallen, dass die bewegungen oben/links, oben/rechts, unten/links, unten/rechts nicht so schnell sind wie up, down, left, right.

    daher mein gedanke, ob ich nun für die diagonalbewegung zusätzlich code einsetzen sollte. also nicht nur

    if up = {code}
    if down = {code}
    ...

    sondern auch

    if up && left = {code}

    ansonsten funktioniert die steuerung mit einem xbox controller tadelos..

    grüße aus dem norden
  • Du solltest deinen ganzen Code mehr an dem Beispiel aus der Hilfe orientieren:

    GML-Quellcode

    1. var haxis = gamepad_axis_value(0, gp_axislh);
    2. var vaxis = gamepad_axis_value(0, gp_axislv);
    3. dir = point_direction(0, 0, haxis, vaxis);
    4. spd = point_distance(0 ,0, haxis, vaxis) * playerspeed;


    Du willst bei der Direction wahrscheinlich nur 8 Richtungen zulassen. Das kannst du aber z.B. mit folgender Ergänzung regeln:

    GML-Quellcode

    1. dir = round(point_direction(0, 0, haxis, vaxis) / 45) * 45


    Edit:
    Wenn du dann wieder die x- und y-Komponenten haben willst:

    GML-Quellcode

    1. x += lengthdir_x(spd, dir);
    2. y += lengthdir_y(spd, dir);


    Das alles geht auch schöner, da sich hinter point_direction und lengthdir_* viel Mathe verbirgt, aber von der Funktionalität her sollte es das sein, was du willst.

  • Funktioniert das auch noch auf 8.1 die free version? bekomme es einfach nicht hinn ein gamep einzubauen...
    Mein Game und meine seite: riataliaxeas.npage.de/

    Spoiler anzeigen
    Zeit zurückspulen, Tag-/Nacht-System, Begleiter mit Boni, Shop, Dungeon und Licht-/Schatteneffekte, 3D-Fake-Natur und mehr...Termin: Mitte 2016
    :!:
  • Ritalia schrieb:

    Funktioniert das auch noch auf 8.1 die free version? bekomme es einfach nicht hinn ein gamep einzubauen...
    was hast du für ein gamepad zum testen ? ich hab bei mir gemerkt es klappt nur mit einem xbox controller bzw. wenn ich auf meinem ps4 controller über xinput laufen lasse
    Wir stehen zusammen und wir fallen zusammen
  • ja auch ein xbox 360 controler ...
    muss ich das bei dem code meiner spielfigur eingeben oder ein script schreiben?
    das das geht...
    Mein Game und meine seite: riataliaxeas.npage.de/

    Spoiler anzeigen
    Zeit zurückspulen, Tag-/Nacht-System, Begleiter mit Boni, Shop, Dungeon und Licht-/Schatteneffekte, 3D-Fake-Natur und mehr...Termin: Mitte 2016
    :!:
  • Ritalia schrieb:

    ja auch ein xbox 360 controler ...
    muss ich das bei dem code meiner spielfigur eingeben oder ein script schreiben?
    das das geht...

    je nachdem was du machen möchtest... du kannst es auch als script schreiben und bei deiner spielfigur im stepevent eintragen

    Edit: machs doch einfach so .. erstelle instance variablen für deine bewegungen und lass sie dann über das gamepad abspielen
    Wir stehen zusammen und wir fallen zusammen

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