Problem beim drawen des Gesichts in Richtung des Players

  • GM 7

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

  • Problem beim drawen des Gesichts in Richtung des Players

    Hi,

    ich hab da ein Problem. Im Großen und Ganzen funktionierts eigentlich größtenteils, aber wenn der Spieler zum Stillstand kommt dreht sich das Gesicht entweder nach rechts (0°), unten (270°) oder nach unten-rechts (315°).

    Hier ist der Code:

    GML-Quellcode

    1. if (xspeed != 0 || yspeed != 0) {dir = point_direction(xprevious,yprevious,x,y);}
    2. d3d_draw_wall(x+8+lengthdir_x(9.9,dir+45),y+8+lengthdir_y(9.9,dir+45),z+15,x+8+lengthdir_x(9.9,dir-45),y+8+lengthdir_y(9.9,dir-45),z+1,tex_face,1,1);


    Die Variable dir wird sonst nirgendwo verwendet, nur im Create auf 90 gesetzt. Ich hab echt keine Ahnung, an was der Fehler liegt. Bitte helft ;(

    Danke im Voraus,
    Lightning the Hedgehog
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • Dem Code entnehme ich, dass es um ein 3D Spiel geht. Deine Beschreibung hört sich allerdings nach 2d (TopDown) an.
    Für den Fall dass es doch 2D sein sollte hätte ich ne vernünftige Lösung parat, für 3D fehlt mir ne Testumgebung.
  • Es ist ein 3D Spiel, aber es ist hier glaub ich ziemlich egal. Das d3d_draw_wall könnte man in 2D mit draw_line ersetzen. Wie auch immer, hier ist die GMK: mediafire.com/?d84nl3f3748g99a
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • Habs mir mal schnell angeguckt, und muss erstmal sagen:
    Deine im if-Abfragen im Step event sind ja der horror oO

    Naja das soll ja nicht stören.

    Zuerst einmal möchte ich dir sagen was der Fehler war:
    Du hast die Richtung dadurch bestimmt, dass du die von der vorherigen Position auf die neue Position guckst. Da bei solchen "smoothen" bewegungen, wo die Beschleunigung langsam abnimmt, nachher beispielsweiße yspeed = 0 ist, aber in den meisten fällen xspeed != 0 guckt der Spieler dann nach links oder rechts (da er sich ja auf einer linie bewegt sogesehen).
    Das Gleiche gilt natrülich auch umgekehrt.

    Hier nur mal mein verbesserungsvorschlag für dein Step Event

    Step:
    Spoiler anzeigen

    GML-Quellcode

    1. if (keyboard_check(vk_left) && xspeed > -4) {xspeed -= 0.4;}
    2. if (keyboard_check(vk_right) && xspeed < 4) {xspeed += 0.4;}
    3. if (keyboard_check(vk_up) && yspeed > -4) {yspeed -= 0.4;}
    4. if (keyboard_check(vk_down) && yspeed < 4) {yspeed += 0.4;}
    5. if !keyboard_check(vk_left) && !keyboard_check(vk_right) { // So sieht diese If-Abfrage doch viel hübscher aus, als den Klotz der da vorher drin war^^
    6. if (xspeed >= 0.4) {xspeed -= 0.4;}
    7. if (xspeed <= -0.4) {xspeed += 0.4;}
    8. else if (xspeed < 0.4 && xspeed > -0.4) {xspeed = 0;}
    9. }
    10. if !keyboard_check(vk_up) ^^ keyboard_check(vk_down) { // siehe oben ^^ (ist das gleiche wie oben, nur eine andere Schreibweise)
    11. if (yspeed >= 0.4) {yspeed -= 0.4;}
    12. if (yspeed <= -0.4) {yspeed += 0.4;}
    13. else if (yspeed < 0.4 && yspeed > -0.4) {yspeed = 0;}
    14. }
    15. if (place_meeting(x+xspeed,y,obj_wall_parent)) {
    16. move_contact_all(point_direction(0,0,xspeed,0),4);
    17. xspeed = 0;
    18. }
    19. if (place_meeting(x,y+yspeed,obj_wall_parent)) {
    20. move_contact_all(point_direction(0,0,0,yspeed),4);
    21. yspeed = 0;
    22. }
    23. if (place_meeting(x+xspeed,y+yspeed,obj_wall_parent)) {
    24. move_contact_all(point_direction(0,0,xspeed,yspeed),4);
    25. xspeed = 0;
    26. yspeed = 0;
    27. }
    28. x += xspeed;
    29. y += yspeed;
    Alles anzeigen


    So nun zu den oben erklärten problem, da du ja die Richtungsbestimmung im Draw Event hast (warum frag ich mich eigentlich!? naja jeder wie er willst ;) )

    Draw:
    Spoiler anzeigen

    GML-Quellcode

    1. draw_set_color(c_blue);
    2. d3d_draw_cone(x,y,z+8,x+16,y+16,z+16,tex_player,1,1,1,4);
    3. d3d_draw_cone(x,y,z+8,x+16,y+16,z,tex_player,1,1,1,4);
    4. draw_set_color(c_white);
    5. if (keyboard_check(vk_left) ^^ keyboard_check(vk_right)) || (keyboard_check(vk_down) ^^ keyboard_check(vk_up))
    6. {dir = point_direction(xprevious,yprevious,x,y);}
    7. d3d_draw_wall(x+8+lengthdir_x(9.9,dir+45),y+8+lengthdir_y(9.9,dir+45),z+15,x+8+lengthdir_x(9.9,dir-45),y+8+lengthdir_y(9.9,dir-45),z+1,tex_face,1,1);


    Was ist anders? Es wird nun geguckt, ob der Spieler noch eine Taste drückt zur fortbewegung, da sonst die Beschleunigung sinkt, und der Spieler sich (wie oben erklärt) sonst in den meisten Fällen nur noch auf der x-/y-achse bewegt zu irgendeinen Step und dieses "in 4-Richtungen" gucken zustande kommt. Falls der Spieler kein Knopf, beziehungsweiße alle 4 gleichzeitig drückt, wird die dir-Variable nicht geändert, womit das Gesicht immer in die Richtung guckt, in die der Spieler sich bewegt.

    Mfg.,
    Mokuyobi
    木曜日 (Mokuyōbi)
  • Hey, danke, es funktioniert, aber er dreht sich immer noch nach links wenn ich eine Wand gehe.
    EDIT: ehhhh rechts
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • GML-Quellcode

    1. if (keyboard_check(vk_left) && xspeed > -4) {xspeed -= 0.4;}
    2. if (keyboard_check(vk_right) && xspeed < 4) {xspeed += 0.4;}
    3. if (keyboard_check(vk_up) && yspeed > -4) {yspeed -= 0.4;}
    4. if (keyboard_check(vk_down) && yspeed < 4) {yspeed += 0.4;}
    5. if !keyboard_check(vk_left) && !keyboard_check(vk_right) {
    6. if (xspeed >= 0.4) {xspeed -= 0.4;}
    7. if (xspeed <= -0.4) {xspeed += 0.4;}
    8. else if (xspeed < 0.4 && xspeed > -0.4) {xspeed = 0;}
    9. }
    10. if !keyboard_check(vk_up) ^^ keyboard_check(vk_down) {
    11. if (yspeed >= 0.4) {yspeed -= 0.4;}
    12. if (yspeed <= -0.4) {yspeed += 0.4;}
    13. else if (yspeed < 0.4 && yspeed > -0.4) {yspeed = 0;}
    14. }
    15. if (place_meeting(x+xspeed,y,obj_wall_parent)) {
    16. move_contact_all(point_direction(0,0,xspeed,0),4);
    17. xspeed = 0;
    18. }
    19. if (place_meeting(x,y+yspeed,obj_wall_parent)) {
    20. move_contact_all(point_direction(0,0,0,yspeed),4);
    21. yspeed = 0;
    22. }
    23. if (place_meeting(x+xspeed,y+yspeed,obj_wall_parent)) {
    24. move_contact_all(point_direction(0,0,xspeed,yspeed),4);
    25. xspeed = 0;
    26. yspeed = 0;
    27. }
    28. x += xspeed;
    29. y += yspeed;
    30. if ((keyboard_check(vk_left) ^^ keyboard_check(vk_right)) || (keyboard_check(vk_down) ^^ keyboard_check(vk_up))) && (xspeed != 0 || yspeed != 0)
    31. {dir = point_direction(xprevious,yprevious,x,y);}
    Alles anzeigen


    Wichtig:
    Die if-Abfrage aus dem Draw Event nehmen. Tu sie, wie hier, im Step Event rein, und ganz wichtig: erst nachdem du die Position geändert hast (x+=xspeed;y+=yspeed). Ansonsten ist x = xprevious und y = yprevious, der Abstand damit = 0 und der Spieler guckt immer nach rechts.

    Es gibt dabei noch zwei Verschiedene arte. Einmal wie ich es jetzt hier gemacht habe:

    GML-Quellcode

    1. if ((keyboard_check(vk_left) ^^ keyboard_check(vk_right)) || (keyboard_check(vk_down) ^^ keyboard_check(vk_up))) && (xspeed != 0 || yspeed != 0)

    oder einmal mit einem UND anstatt einem ODER

    GML-Quellcode

    1. if ((keyboard_check(vk_left) ^^ keyboard_check(vk_right)) || (keyboard_check(vk_down) ^^ keyboard_check(vk_up))) && (xspeed != 0 && yspeed != 0)

    Welche der beiden Methoden dir lieber ist, musst du wissen, mir persöhnlich spricht die ODER - Variante eher zu, es ist jedoch dein Spiel und deine entscheidung ;)

    Mfg.,
    Mokuyobi


    // Edit:
    Das stand doch oben dabei;
    Spoiler anzeigen

    GML-Quellcode

    1. if !keyboard_check(vk_left) && !keyboard_check(vk_right) { // So sieht diese If-Abfrage doch viel hübscher aus, als den Klotz der da vorher drin war^^
    2. if (xspeed >= 0.4) {xspeed -= 0.4;}
    3. if (xspeed <= -0.4) {xspeed += 0.4;}
    4. else if (xspeed < 0.4 && xspeed > -0.4) {xspeed = 0;}
    5. }
    6. if !keyboard_check(vk_up) ^^ keyboard_check(vk_down) { // siehe oben ^^ (ist das gleiche wie oben, nur eine andere Schreibweise)
    7. if (yspeed >= 0.4) {yspeed -= 0.4;}
    8. if (yspeed <= -0.4) {yspeed += 0.4;}
    9. else if (yspeed < 0.4 && yspeed > -0.4) {yspeed = 0;}
    10. }

    Man achte auf das zweite Kommentar: "// siehe oben ^^ (ist das gleiche wie oben, nur eine andere Schreibweise)"Die beiden If-Abfragen sind in ihrem Ergebnis identisch, es sind nur zwei verschiedene Schreibweisen. Man hätte genausogut den Code von links-rechts für oben-unten auch nehmen können, und umgekehrt, ich wollte dir nur damit Zeigen das es durchaus auch anderes geht als diese Verschachtlung die du vorher hattest, und auch viel einfacher/kürzer.
    Manchmal lassen sich solche if-Fragen natürlich nicht verkürzen, beziehungsweiße nur über mehrere Zeilen Spilten oder in mehreren if-Abfragen hintereinander verpacken, aber dies ist meist Übersichtlicher.
    Also wie schon gesagt: Das ist genau das gleiche, nur eine andere Schreibweise, man kann beide Schreibweisen miteinander auch austauschen, das Ergebnis ist das gleiche.
    木曜日 (Mokuyōbi)

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

  • Aber wenn beides und ist triffts ja nur zu, wenn der Player schräg läuft. Und ich hab das schon ausprobiert. Ab und zu dreht er sich immer noch nach rechts. Warum ist eig bei deinem Step Event das links/rechts laufen komplett unterschiedlich zum oben/unten laufen?
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • Ich konnte den Fehler jetzt beheben!

    GML-Quellcode

    1. if ((keyboard_check(vk_left) ^^ keyboard_check(vk_right)) || (keyboard_check(vk_down) ^^ keyboard_check(vk_up))) && (xspeed != 0 || yspeed != 0)

    muss

    GML-Quellcode

    1. if ((keyboard_check(vk_left) ^^ keyboard_check(vk_right)) || (keyboard_check(vk_down) ^^ keyboard_check(vk_up))) && (x != xprevious || y != yprevious)

    heißen.

    Allerdings manchmal wenn ich schräg nach links oben in die linke Wand reinlaufe, schaut der Player dann gerade nach vorne weil er an der Wand is, sieht dann in die vorherige Richtung (also nach links oben) und dann wieder gerade nach vorne. Außerdem ruckeln die Kollisionen sowieso ein bisschen... Kann mir jemand sagen, wie ich den Glitch beseitigen und evtl. die Kollisionen verbessern kann?

    Hier ist die Source: mediafire.com/?8vmvrgxoti3d8ko

    Ach ja, @ Mokuyobi: Mein "Klotz" im Step Event muss schon drin bleiben, deiner beachtet nicht falls man beide Tasten gleichzeitig drückt.
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.