Normales Bewegen + motion_add()

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

  • Normales Bewegen + motion_add()

    Hi,
    so ich habe ein Riesen Problem:

    Ich programmiere gerade eine Online Engine, die funktioniert soweit auch schon. Beim eigenen Spieler geht sowieso alles(ich sage es deshalb, weil der Code der zum bewegen verwendet wird beim eigenen und anderen Spieler der selbe ist). Eigentlich geht alles: Vorwärts gehen, rückwärts gehen, seitwärts gehen (und schießen). Das Problem: Wenn ich vorwärts + seitwärts, oder rückwärts+seitwärts gehe, fliegt der Spieler sinnlos durch die Gegend (das ganze passiert aber nur bei "anderen" Spielern, also die, die online übertragen werden obwohl der code beim eigenen Spieler gleich ist und es dort einwandfrei funktioniert).

    Hier der Code:

    Nummer 1.: Das Skript im Spieler (Server/Client ist egal, das ist beides ungefähr gleich und es gibt auch das gleiche problem):

    Quellcode

    1. if(keyboard_check(ord('W')) &! keyboard_check(ord('S')) &! keyboard_check(ord('D')) &! keyboard_check(ord('A'))) {direction = image_angle; speed = global.max_speed_forward*fps_based; o_server_turn(1);}
    2. if(keyboard_check(ord('S')) &! keyboard_check(ord('W')) &! keyboard_check(ord('D')) &! keyboard_check(ord('A'))) {direction = image_angle; speed = global.max_speed_reverse*fps_based; o_server_turn(1);}
    3. if(keyboard_check(ord('W')) &! keyboard_check(ord('S')) &(keyboard_check(ord('D')) || keyboard_check(ord('A')))) {direction = image_angle; speed = global.max_speed_forward*fps_based; o_server_sideward(1,1);}
    4. if(keyboard_check(ord('S')) &! keyboard_check(ord('W')) &(keyboard_check(ord('D')) || keyboard_check(ord('A')))) {direction = image_angle; speed = global.max_speed_reverse*fps_based; o_server_sideward(1,1);}
    5. if(! keyboard_check(ord('W')) && speed > 0) {speed = 0; o_server_stop(1);}
    6. if(! keyboard_check(ord('S')) && speed < 0) {speed = 0; o_server_stop(1);}
    7. if(keyboard_check(ord('A')) &! keyboard_check(ord('D'))) {motion_add(image_angle+90,global.max_speed_strafe*fps_bas
    8. ed);}
    9. if(keyboard_check(ord('D')) &! keyboard_check(ord('A'))) {motion_add(image_angle-90,global.max_speed_strafe*fps_based);}
    10. if(keyboard_check_pressed(ord('A')) &! keyboard_check(ord('D'))) {o_server_sideward(1,1);}
    11. if(keyboard_check_pressed(ord('D')) &! keyboard_check(ord('A'))) {o_server_sideward(1,-1);}
    12. if(keyboard_check_released(ord('A')) &! keyboard_check(ord('D'))) {o_server_stop(1);}
    13. if(keyboard_check_released(ord('D')) &! keyboard_check(ord('A'))) {o_server_stop(1);}
    14. if(keyboard_check_pressed(ord('W')) &! keyboard_check(ord('S'))) {o_server_forward(1);}
    15. if(keyboard_check_pressed(ord('S')) &! keyboard_check(ord('W'))) {o_server_backward(1);}
    Alles anzeigen



    No 2.: "o_server_forward": Wird ausgeführt wenn die "W" Taste gedrückt wird zum senden der Daten.

    Quellcode

    1. clearbuffer()
    2. writeshort(1)
    3. writeshort(argument0)
    4. writeshort(global.max_speed_forward)
    5. writeshort(image_angle)
    6. sendmessage_ext()


    No 3.:"o_server_sideward" Wird ausgeführt wenn die "A" oder "D" Taste gedrückt wird zum senden der Daten. argument 1 gibt beim empfangen die richtung des seitwärts gehen an.

    Quellcode

    1. clearbuffer()
    2. if argument1>0
    3. {
    4. writeshort(4)
    5. }
    6. if argument1<0
    7. {
    8. writeshort(5)
    9. }
    10. writeshort(argument0)
    11. writeshort(image_angle)
    12. sendmessage_ext()
    Alles anzeigen


    No. 4: "o_client_rmessage": Das Empfang skript. 1=vorwärts, 2=rückwärts, 3=anhalten, 4 und 5=seitwärts, 6=schießen, 7=direction (wird während des laufens ausgeführt)

    Quellcode

    1. var g,d1,d2,d3;
    2. if receivemessage(sok)>0
    3. {
    4. g=readshort()
    5. if g=1 {speed = readshort()*fps_based; image_angle=readshort() direction = image_angle; o_server_forward(spielernummer+1)}
    6. if g=2 {speed = readshort()*fps_based; image_angle=readshort() direction = image_angle; o_server_backward(spielernummer+1)}
    7. if g=3 {speed = 0; x=readshort(); y=readshort() o_server_stop(spielernummer+1)}
    8. if g=4 {image_angle=readshort(); motion_add(image_angle+90,global.max_speed_strafe*fps_bas
    9. ed); o_server_sideward(spielernummer+1,1);}
    10. if g=5 {image_angle=readshort(); motion_add(image_angle-90,global.max_speed_strafe*fps_based); o_server_sideward(spielernummer+1,-1);}
    11. if g=6 {x=readshort(); y=readshort(); image_angle=readshort(); d=instance_create(x,y,obj_bullet_overall); d.direction=image_angle; d.my_speed=readshort()+16; o_server_shoot(spielernummer+1);}
    12. if g=7 {image_angle=readshort(); direction=image_angle; o_server_turn(spielernummer+1);}
    13. }
    Alles anzeigen


    Ich hoffe ihr könnt mir helfen, weil mir das Problem unverständlich ist (der selbe code geht ja im offline teil >.<).

    Gruß,
    ghost
  • Ich kenn mich da ja nicht so aus... aber kannst du mir erklären, wieso und was im Empfang-Skript an den Server geschickt wird? Hat der das nicht schon versendet und sendet es nur nochmal an die anderen Clienten? Ich weis ja nicht.. aber vielleicht.. ^^
    "das war meine letzte flamewar PM an dich ."
  • Ops, das ist das server Empfangsskript, aber wie gesagt, es ist völlig egal! Es ist bei Server und Client fast das selbe. Nur halt dieses

    Quellcode

    1. o_server_backward(spielernummer+1);

    welches halt das ganze an alle spieler weiterschickt,ja. ;)

    EDIT: Um hier mal weitere Informationen zu geben:

    Ich hab es jetzt nochmal genau getestet und komm zu folgendem schluss: Der "andere" Spieler wird bei Vorwärts + seitwärts expotentiell zur Seite schneller und hält sich anscheinend nicht die ganze Zeit an image_angle (warum auch immer, image_angle wird ja während des laufens die ganze zeit übertragen).

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

  • was genau is fpsbased für ne variable?
    hast du schon getestet, ob die werte von client zu client übereinstimmen?
    "das war meine letzte flamewar PM an dich ."
  • Ich weiß zwar immernochnicht woran es lag, aber ich habe die engine einfach (anders) neu geschrieben. Die hat jetzt eh eine viel bessere Performance also ist das hier sozusagen gelöst. Naja, ich hätte trotzdem gern gewusst worans lag, aber egal. ;)

    EDIT:
    hast du schon getestet, ob die werte von client zu client übereinstimmen?

    Ja, die Werte waren alle korrekt, es ging ja wie gesagt nur wenn vorwärts+seitwärts bzw., rückwärts+seitwärts war.