gms_instance_sync

Gebruik: gms_instance_sync ( id, flags, "var1", "var2"... )

Omschrijving

Synchroniseert de opgegeven instantie. id is de id van de instance, te verkrijgen via de standaardvariabele 'id.'

Met flags kun je specificeren hoe de instantie moet worden gesynchroniseerd.

is_onetime: Instantie wordt een keer gesynchroniseerd. Handig voor voorwerpen die een voorspelbare beweging en een voorspelbare vernietiging hebben, bijvoorbeeld kogels.

is_extended: Instantie wordt aan het begin gesynchroniseerd en zodra de instantie gedestroyed wordt. Gebruik dit type voor voorwerpen met een voorspelbare beweging, maar een onvoorspelbaar moment van vernietiging, bijvoorbeeld een op afstand-vernietigbare bom.

is_full: De instantie wordt volledig gesynchroniseerd. Voorwerpen die een onvoorspelbare beweging hebben, en een onvoorspelbaar moment van vernietiging, bijvoorbeeld NPCs met een AI. Met deze functie kan ook

Verder kan aan de flags ook nog de waarde 'isc_local' worden toegevoegd, op deze manier: 'is_extended | isc_local'. Hiermee zal de instantie alleen worden verzonden naar de andere spelers die de instantie ook werkelijk kunnen zien.

De opgegeven variabelen "var1", "var2", "var3" plus de x, y, speed en direction zullen worden verzonden.

Voorbeeld

//De kogel heeft een variabele damage, dus die wordt meeverzonden
i = instance_create(x, y, obj_bullet)
i.damage = 50;
gms_instance_sync(i, is_extended, "damage")

Reacties (13)

Laatste bericht op 17 Jun 2023

TomPostmus op 24 Jan 2017, 20:03:10
Hallo Size43,

Voor de verandering ben ik begonnen aan een Multiplayergame met Physics. Het gaat verrassend goed. De spelers kunnen elkaar aanraken en wegduwen. Ze kunnen zelfs onafhankelijke objecten zoals balletjes wegduwen en die bewegingen worden gewoon goed gesynchroniseerd (deze balletjes worden niet gesynchroniseerd met de gms_instance_sync-functie). De synchronisatie via gms_instance_sync met physics lijkt GameMakerServer minder goed te ondersteunen. Het gekke is, dat hij kogels (one_time) soms wel synchroniseerd, maar vaak niet. Ik heb momenten gehad dat de kogels gewoon gesynchroniseerd werden en ze werkten perfect, maar 5 seconden later werden ze niet meer gesynchroniseerd. Dit is de code:

gms_instance_sync_var_add("phy_speed_x",i.phy_speed_x)
gms_instance_sync_var_add("phy_speed_y",i.phy_speed_y)
gms_instance_sync_var_add("phy_rotation",i.phy_rotation)
gms_instance_sync(i,is_onetime | isc_local)

De phy_position_x en y worden in het User Defined 12 bepaalt.
TomPostmus op 27 Jan 2017, 16:18:46
Ik ben erachter gekomen dat non-physics objecten hetzelfde doen. Ook zij worden soms gesynchroniseerd, maar later niet meer.
TomPostmus op 29 Jan 2017, 11:27:33
Ik heb het al gevonden! Ik had isc_local aanstaan bij de synchronisatie. Nu doet hij het!
Size43 (Beheerder) op 30 Jan 2017, 11:08:58
isc_local is op zich wel handig, aangezien het de hoeveelheid data die de server naar iedereen stuurt vermindert. Je kan op de site de afstand instellen waarbinnen de instanties met elkaar gesynchroniseerd moeten worden.
R1ckx op 1 Jul 2016, 17:15:22
Is er een manier om te kijken of een object al wordt gesynced voordat je het met gms_instance_sync flagt dat een object gesyncd moet worden?
Size43 (Beheerder) op 3 Jul 2016, 22:49:26
GameMaker Server ondersteunt het magisch resurrecten van instanties die eigenlijk gedestroyed zijn niet echt. Het makkelijkste zou zijn om zoals Shaddovv aangeeft isc_local te gebruiken. Dat zorgt ervoor dat instanties alleen gesynchroniseerd worden als ze binnen een bepaalde range van de speler zitten.
R1ckx op 4 Jul 2016, 17:03:17
Zou ik het liefst ook wel willen gebruiken, maar de wereld is zo groot (een soort MMO) dat er meer dan 500 instances (die moeten worden gesychroniseert) zijn in de wereld ten alle tijden. Om lag te voorkomen deactivate ik de instances die buiten de views vallen. De bedoeling was dus dan ze te destroyen op anderen hun client en ze zelf te houden en deactiveren(elke speler laadt de objecten rond zich ook mee net zoals de hoofdspeler, dus die objecten zijn weer wél actief) en weer te laden als ze in je view komen (en dus ook weer syncen) zodat je onder de 500 objecten zit die met is_full worden gesynced.

Ik denk dat ik een omweggetje moet gaan nemen met p2p berichten :P
Size43 (Beheerder) op 9 Jul 2016, 21:14:26
Ja dat is inderdaad niet iets wat op het moment ondersteund wordt door GameMaker Server. Het makkelijkste lijkt mij ook om iets met de p2p berichten te doen.
Shaddovv op 2 Jul 2016, 13:27:52
Dan zou je gms_instance_created_by_sync() moeten gebruiken. Dat is de eerste script van deze pagina :)
R1ckx op 2 Jul 2016, 17:16:24
Hmm, ik bedoelde meer op de manier van: elke keer als een object te ver is van iedereen wordt hij bij iedereen verwijdert en dan gede-load. Als hij weer ingeladen wordt gaat hij weer opnieuw syncen maar ik neem aan dat gms_instance_sync maar enkelmaar moet worden uitgevoerd.. Dit alles doe ik om de 500 instance limiet te overkomen die kan worden gesynced met full_sync.

Ik heb het (denk ik) opgelost met elke instance een variabel te geven genaamd get_synced, deze op 0 te zetten bij create of als hij geload wordt, en op 1 zetten wanneer hij gesynced wordt met die functie. Tot slotte kan die functie alleen lopen als hij op 0 staat.

Echter worden instances nog niet gecreerd op andere clients, wat me verbaast..
Shaddovv op 2 Jul 2016, 19:58:22
Maak je de instanties aan door gms_self_ismaster() te gebruiken? Als je ze via elke maakt geeft dat denk ik problemen
R1ckx op 2 Jul 2016, 20:32:25
Yup, ik zorg dat de master de enigste is die instances maakt en aanpast
Shaddovv op 2 Jul 2016, 21:48:34
Ik denk dat het mischien te maken heeft met dat je isc_local gebruikt. Zoniet zou ik het ook niet weten, maar het heeft waarschijnlijk te maken met gms_settings(1,0,obj_player,obj_other_player).

De eerste argument staat voor simple mode die je dan waarschijnlijk uit moet zetten omdat hij alles automatisch voor je doet, maar ik zou dat niet echt aanraden totdat Size43 je een beter antwoord kan bevestigen.