Position ändern und übertragen

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

  • Position ändern und übertragen

    Hallo.

    Ich habe ein Problem.
    Ich meinem Online Chat kann eine Person Linksklick + N auf einen Spieler machen und so den namen ändern.
    Nun wollte ich das aber machen, dass man wenn man auf derselben Person Linksklick + T macht, dass man diese Person an einer Kooridnate oder in einen anderen Raum "schicken" kann.
    Nun weiß ich aber nicht wie das geht...
    Ich habe es so probiert:


    Im Mouse Left Button ( Nicht pressed ) Event:

    GML-Quellcode

    1. if keyboard_check_pressed(ord('N'))
    2. {
    3. nick = get_string("Geben Sie einen neuen Nicknamen ein","Player_00")
    4. alarm[0]=1
    5. }
    6. if keyboard_check_pressed(ord('T'))
    7. {
    8. name = get_string("Name des Spielers","")
    9. with(name)
    10. {
    11. name.x = 128
    12. name.y = 128
    13. alarm[0]=1
    14. }
    15. }
    Alles anzeigen


    Im Alarm Event ist das:

    GML-Quellcode

    1. clearbuffer();
    2. writebyte(playerlocation); //Write message id
    3. writebyte(playerid); //write my id
    4. writeshort(x); //Write x pos
    5. writeshort(y); //Write y pos
    6. //Send to all other players
    7. with(objPlayer)
    8. {
    9. if(id != other.id)
    10. {
    11. sendmessage(socketid);
    12. }
    13. }
    14. alarm[0] = 3;
    Alles anzeigen


    Dort werden also die Informationen gesendet so wie ich das verstanden habe...

    Leider passiert rein garnichts wenn ich das mache..
    So langsam geht auch schon durch mein Kopf das das vielleicht garnicht geht?!?

    Freue mich auf Antwort.

    Mit freundlichem Gruß
    icqgamer
  • du musst das ganze auf empfängerseite auch wieder auslesen und anwenden auf das objekt, das weist du schon, oder?
    "das war meine letzte flamewar PM an dich ."
  • Hallo :)

    Ist mit einer Empfängerseite eine Homepage gemeint?
    Wenn ja: Das alles läuft über der 39dll.dll .
    Das heißt ich habe einen server.gmk und einen client.gmk dort kann ich über den Server zwar den Namen vom Spieler ändern, so dass das alles auch am client kommt, aber leider funktioniert das mit der Position nicht.
    Dort habe ich kein Plan was man dort machen soll..

    Mit freundlichem Gruß
    icqgamer
  • Nein, ich meine wenn du writeshort machst, musst du ja auch iwo wieder readshort (oder so) machen.
    Das Objekt beim Empfänger muss x und y wieder auslesen und auf seine positionen anwenden, sonst hat ja nur der sender die daten.

    kenn mich aber nicht damit aus, aber vl hast du ja sowas grundlegendes vergessen ;)
    "das war meine letzte flamewar PM an dich ."
  • Achso.
    Nein, dadran kann das nicht liegen.
    Das wird im Alarm[0] Event alles versendet.

    Ich glaube ich weiß das problem, aber ich habe keine Lösung dafür...
    Der server weiß nämlich glaub ich nicht welcher Spieler gemeint ist.

    GML-Quellcode

    1. if keyboard_check_pressed(ord('T'))
    2. {
    3. name = get_string("Name des Spielers","")
    4. with(name)
    5. {
    6. name.x = 128
    7. name.y = 128
    8. alarm[0]=1
    9. }
    10. }


    Ich glaube das mit den with(name) ist falsch...
    Aber ich weiß keine Lösung wie gesagt..

    Mit freundlichem gruß
    icqgamer
  • Blubberblub hat völlig recht, du versendest mit deinem Code ja nur Nachrichten, du mußt auf der Empfängerseite die Nachrichten auch auslesen, das kommt in den StepEvent des Empfängers (Alles was gesendet wird mußt du so auslesen):

    case playerlocation:
    o_Player1.x = readshort() ///////o_Player1 ist dein Player Objekt auf der Empfängerseite
    o_Player1.y = readshort() ///////o_Player1 ist dein Player Objekt auf der Empfängerseite
    break;


    Das kommt dann noch am Schluss hin:
    }
    };



    Davor muß allerdings noch das hier:
    while(true)
    {
    size = receivemessage(global.otherplayer);
    if(size < 0) break;
    if(size == 0)
    {
    show_message("Dein Mitspieler hat das Spiel verlassen!");
    game_end();
    exit;
    }
    messageid = readbyte();
    switch(messageid)
    {


    Das ist aber Grundwissen was Onlinespiele angeht, jetzt weißt dus ja ;)
  • Ich habe das nun so gemacht wie du sagtest.

    Ich habe das im Spielerobjekt auf den client eingegeben.
    Übern Server hab ich das dannv eruscht, aber klappt immeronchnicht.

    Step Event vom Spielerobjekt auf den Client:

    GML-Quellcode

    1. while(true)
    2. {
    3. size = receivemessage(objPlayer);
    4. if(size < 0) break;
    5. if(size == 0)
    6. {
    7. show_message("Dein Mitspieler hat das Spiel verlassen!");
    8. game_end();
    9. exit;
    10. }
    11. messageid = readbyte();
    12. switch(messageid)
    13. {
    14. case beam:
    15. objPlayer.x = readshort()
    16. objPlayer.y = readshort()
    17. break;
    18. }
    19. };
    Alles anzeigen


    Mouse_left_pressed Event auf den Server:

    GML-Quellcode

    1. if keyboard_check_pressed(ord('T'))
    2. {
    3. clearbuffer();
    4. writebyte(beam);
    5. name = writestring(get_string("Nachricht:",""), true);
    6. sendmessage(server.socket);
    7. with(name);
    8. {
    9. x = 200
    10. y = 200
    11. }
    12. }
    Alles anzeigen


    Step Event vom Spielerobjet auf Server:

    GML-Quellcode

    1. while(1) //Start infinite loop
    2. {
    3. size = receivemessage(socketid); //receive next message on the queue
    4. if(size < 0)break; //if no message to receive then exit LOOP
    5. if(size == 0) //If socket disconnected then destroy player and exit loop
    6. {
    7. instance_destroy();
    8. break;
    9. }
    10. timeout = 0;
    11. mid = readbyte(); //read message id
    12. switch(mid) //compare message id
    13. {
    14. case playerlocalation: //players location
    15. x = readshort(); //read x
    16. y = readshort(); //read y
    17. break;
    18. case playernick: //new nickname
    19. nick = readstring(); //read nickname
    20. clearbuffer(); //clearbuffer
    21. writebyte(playernick); //write messageid
    22. writebyte(playerid); //write my id
    23. writestring(nick, true); //write nickname
    24. //Send to all other players
    25. with(objPlayer)
    26. {
    27. if(id != other.id)
    28. {
    29. sendmessage(socketid);
    30. }
    31. }
    32. break;
    33. case newmessage:
    34. message=readstring();
    35. clearbuffer();
    36. writebyte(newmessage);
    37. writestring(message, true);
    38. with(objPlayer)
    39. sendmessage(socketid);
    40. break;
    41. case exitgame: //Player left (if receivemessage() didnt return 0)
    42. instance_destroy(); //Destroy
    43. break;
    44. case messagewindow:
    45. message=readstring();
    46. clearbuffer();
    47. writebyte(messagewindow);
    48. writestring(message, true);
    49. with(objPlayer)
    50. {
    51. if id!=other.id
    52. sendmessage(socketid);
    53. }
    54. break;
    55. case beam: //players location
    56. x = readshort(); //read x
    57. y = readshort(); //read y
    58. break;
    59. }
    60. }
    61. timeout += current_time - deltatime;
    62. deltatime = current_time;
    Alles anzeigen
  • So ich hab mirs mal angeschaut, du kannst beim Client in deinem Player Objekt im Step Event erst mal wieder alles löschen was ich dir gesagt hab, denn genau das hast du schon in deinem objControl im StepEvent, wenn mich nicht alles täuscht ist das doch die MMO Engine von Blaxun, normalerweise muss das so funktionieren wie es ist, mit den Pfeiltasten kannst du dein Spieler bewegen, wo ist das Problem? Konnts leider nicht ausprobieren, aber eigentlich muß es gehen.




  • Ja ich weiß das das klappt, aber mein Problem sit da das "teleportieren".
    Ich möchte beim Client das so machen, dass man den Namen des anderen SPielers eingibt und den dann in den nächsten Raum teleportieren kann.
    Da steckt mein Probleem drin... Die Verbindung an sich ist kein problem.

    Mit freundlichem Gruß
    icqgamer
  • Ja das with(name) ist auch falsch, schliesslich willst du ja die id und nich den namen.
    Ich kenne keine direkte Funktion zum ausgeben des object_index vom Namen, deshalb würde ich die ids mit instance_find finden und mit dem namen vergleichen, anscliessend in eine liste speichern für bessere performance.

    GML-Quellcode

    1. object = noone;
    2. for (i=0; object_exists(i); i+=1)
    3. {
    4. if (object_get_name(i) == name) then object = i;
    5. }
    6. with (object) {..}
    "das war meine letzte flamewar PM an dich ."
  • Benutzer online 4

    4 Besucher