instance_create-Problem im Multiplayer

  • GM 8
  • instance_create-Problem im Multiplayer

    Moin,

    ich bin neu hier. Ich habe mir haufenweise Tutorials angesehen und auch dieses Forum hat mir schon oft weitergeholfen. Nun allerdings habe ich ein Problem, das ich einfach nicht gelöst bekomme:
    Im Multiplayer lasse ich in einem step-Event alle ankommenden Nachrichten verarbeiten. Bei zwei bstimmten id's (der Message) soll beim Slave ein Objekt erstellt werden. Einmal funktioniert es reibungslos (Kugel, id=6) und einmal nicht (id=12).

    Hier ist ein Ausschnitt des Codes zum Senden der Message:

    Quellcode

    1. typ=instance_create(posx,posy,obj_finish);
    2. typ=typ.object_index;
    3. text=string(posx)+"|"+string(posy)+"|"+string(typ);
    4. mplay_message_send_guaranteed(0,12,text);


    Hier ist der Code der Message-Verarbeitung:

    Quellcode

    1. //1-x, 2-y, 3-direction, 4-speed, 5-top_direction, 6-fire, 7-Cash, 8-global.weight2, 9-global.bulletlife2, 10-bottom_sprite, 11-top_sprite, 12-instance-create
    2. var messid, val, posx, posy, typ, speicher, kugel, richtung;
    3. while (mplay_message_receive(0)) {
    4. messid = mplay_message_id();
    5. val = mplay_message_value();
    6. //Nachrichten nur für den Master
    7. if (global.master) {
    8. if (messid == 1) obj_bottom2.x = val;
    9. if (messid == 2) obj_bottom2.y = val;
    10. if (messid == 3) {obj_bottom2.direction = val; obj_bottom2.image_angle=val;}
    11. if (messid == 4) obj_bottom2.speed = val;
    12. if (messid == 5) {obj_top2.direction = val; obj_top2.image_angle=val;}
    13. if (messid == 6) {
    14. richtung=obj_top2.direction;
    15. kugel=instance_create(obj_top2.x+lengthdir_x(24,richtung),obj_top2.y+lengthdir_y(24,richtung),obj_bullet2);
    16. kugel.direction=obj_top2.direction;
    17. kugel.speed=val;
    18. }
    19. if (messid == 10) {obj_bottom2.image_index=val;}
    20. if (messid == 11) {obj_top2.image_index=val;}
    21. }
    22. //Nachrichten nur für den Slave
    23. else {
    24. if (messid == 1) obj_bottom1.x = val;
    25. if (messid == 2) obj_bottom1.y = val;
    26. if (messid == 3) {obj_bottom1.direction = val; obj_bottom1.image_angle=val;}
    27. if (messid == 4) obj_bottom1.speed = val;
    28. if (messid == 5) {obj_top1.direction = val; obj_top1.image_angle=val;}
    29. if (messid == 6) {
    30. richtung=obj_top1.direction;
    31. kugel=instance_create(obj_top1.x+lengthdir_x(24,richtung),obj_top1.y+lengthdir_y(24,richtung),obj_bullet2);
    32. kugel.direction=richtung;
    33. kugel.speed=val;
    34. }
    35. if (messid == 10) {obj_bottom1.image_index=val;}
    36. if (messid == 11) {obj_top1.image_index=val;}
    37. if (messid == 12) {
    38. speicher=script_execute(script_explode(val));
    39. posx=ds_list_find_value(speicher,0);
    40. posy=ds_list_find_value(speicher,1);
    41. typ=ds_list_find_value(speicher,2);
    42. instance_create(posx,posy,typ);
    43. ds_list_destroy(speicher);
    44. }
    45. }
    46. //Nachrichten für beide
    47. if (messid == 7) {global.cash+=val;}
    48. if (messid == 8) {global.weight2=val;}
    49. if (messid == 9) {global.bulletlife2=val;}
    50. }
    Alles anzeigen


    Und hier der Code meines eigenen Skripts "script_explode":

    Quellcode

    1. var stelle,text,speicher;
    2. text=string(argument0);
    3. speicher=ds_list_create();
    4. while (string_count("|",text)>0) do {
    5. stelle=string_pos("|",text);
    6. ds_list_add(speicher,string_copy(text,0,stelle-1));
    7. text=string_copy(text,stelle+1,string_length(text)-stelle);
    8. }
    9. ds_list_add(speicher,text);
    10. return speicher;


    Ich habe mit dem show_message-Befehl schon einige Variablen ingame überprüft. Der String wird korrekt aufgeteilt und übergeben. Die Variablen posx, posy und typ enthalten die richtigen Werte. Wenn ich mir die instance_id des neu erstellten Objektes ausgeben lasse, stimmt auch diese. Sie wird allerdings weder auf dem Bildschirm vom Slave angezeigt, noch kann ich außerhalb der Funktion darauf zugreifen (z.B. instance_number gibt immer 0 zurück).

    Meine Vermutung ist, dass ich entweder den Wald vor lauter Bäumen nicht sehe oder das Objekt nur innerhalb der Funktion besteht und anschließend gleich wieder zerstört wird. (Ich vermute ersteres ^^ )

    So, ich hoffe, dass war jetzt nicht allzu verwirrend.
    Der Herr gebe mir die Gelassenheit, die Dinge zu ertragen, die ich nicht ändern kann,
    den Mut, die Dinge zu ändern, die ich ändern kann,
    und die Weisheit, zwischen beiden zu unterscheiden.
  • Hallo Cinemaniac,

    Deine Nachricht mit der ID 12 übermittelt einen Text an den anderen Spieler der von deinem script_explode als Text in die Liste "speicher" abgelegt wird.
    Dein Code:
    posx=ds_list_find_value(speicher,0);
    posy=ds_list_find_value(speicher,1)
    typ=ds_list_find_value(speicher,2);
    greift nun Text aus deiner Liste "speicher".
    Für die Funktion instance_create(x,y,obj) werden aber reelle Zahlen benötigt.

    Wandle den Text also noch in Zahlen um, so in etwa:

    GML-Quellcode

    1. posx=real(ds_list_find_value(speicher,0));
    2. posy=real(ds_list_find_value(speicher,1))
    3. typ=real(ds_list_find_value(speicher,2));



    So sollte es gehen, hab ein Beispiel in den Anhang gelegt :)
    Ist nur leider mit Game Maker 6 erstellt.
    Dateien
    • test.rar

      (2,07 kB, 143 mal heruntergeladen, zuletzt: )
  • Boah, natürlich!!!

    Vielen Dank, padi. Wer weiß, wie lange ich da noch gesucht hätte. Es klappt jetzt wunderbar. Problem gelöst.
    Der Herr gebe mir die Gelassenheit, die Dinge zu ertragen, die ich nicht ändern kann,
    den Mut, die Dinge zu ändern, die ich ändern kann,
    und die Weisheit, zwischen beiden zu unterscheiden.
  • Ich wundere mich gerade nur ...

    GML-Quellcode

    1. speicher=script_execute(script_explode(val));
    Bin ich von gestern oder ergibt das nur für mich keinen Sinn?

    Um Skripte aufzurufen brauchst du nicht script_execute(), du kannst ihn so aufrufen wie jede andere eingebaute Funktion:

    GML-Quellcode

    1. speicher=script_explode(val);
  • Hmm, du hast Recht.

    Ich hatte das aus der Hilfedatei. Hab's offenbar zu schnell überflogen und falsch verstanden. Danke für den Hinweis.
    Der Herr gebe mir die Gelassenheit, die Dinge zu ertragen, die ich nicht ändern kann,
    den Mut, die Dinge zu ändern, die ich ändern kann,
    und die Weisheit, zwischen beiden zu unterscheiden.