Zelfgemaakte variabelen synchroniseren

Vooraf

In deze post zal ik uitleggen hoe je zelfgemaakte variabelen kunt synchroniseren met andere spelers. Deze tutorial gaat ervan uit dat je al een basis voor een game hebt waarop je verder kunt bouwen. Een loginscherm laten zien, het "speler object" en het "andere speler object" komen niet aan bod. Als je nog niet zover bent, in de beginnen met GameMaker Server tutorial komen die onderwerpen wel aan bod.

Kleren

Er is een variabele "clothing_sprite", die opslaat welke sprite bovenop de sprite van de speler wordt getekend, op deze manier:

draw_self();
draw_sprite(clothing_sprite,0, x, y);

We willen dat deze sprite ook bij alle other player objecten verschijnt, en het moet dezelfde sprite zijn die de speler gebruikt. Voor deze tutorial neem ik aan dat de sprites gewisseld worden door op 1, 2 of 3 te drukken. Voeg deze code toe aan het player object:

if(keyboard_check_pressed(ord('1')))clothing_sprite =spr_clothing_1;
if(keyboard_check_pressed(ord('2')))clothing_sprite =spr_clothing_2;
if(keyboard_check_pressed(ord('3')))clothing_sprite = spr_clothing_3;

Parent-object

Ik houd ervan om dubbele code in mijn projecten zo minimaal mogelijk te houden. Ik wil de drawing-code niet op twee verschillende plaatsen hoeven te updaten als ik besluit dat ik de code wil veranderen. Maak een nieuw object, en noem het iets in de zin van "par_players". In dit object gaan we alle code voor zowel het player object als het other player object neerzetten.

Voeg deze code voor het tekenen van de kleren toe aan het draw event:

draw_self();
draw_sprite(clothing_sprite,0, x, y);

Initialiseer de variabele in het create event:

clothing_sprite= spr_clothing_1

Stel het parent-object van zowel het player object als het other player object in op dit nieuwe "par_players" object. Zorg ervoor dat je het overgeërfde event aanroept, als je al een create of draw event aan het player object of het other player object hebt toegevoegd:

event_inherited();

De variabele synchroniseren

Als laatste moet de waarde van de variabele nog naar de andere clients worden verzonden. Je hoeft er niet voor te zorgen dat de variabele naar andere spelers wordt verzonden als die verbinden en je hoeft er ook niet voor te zorgen dat een variabele alleen wordt verzonden als de waarde verandert.

Voeg deze code toe aan het step event van het player object:

gms_self_set(“clothing_sprite”,clothing_sprite);

Bovenstaande code vertelt de extensie dat er een variabele met de naam clothing_sprite is die naar andere spelers moet worden verzonden. De extensie zal vervolgens bepalen wat de beste manier is om de variabele te verzenden en wanneer deze verzonden moet worden.

Let op: Als je een getal verzend waarvan alleen het hele gedeelte van belang is, maar je weet dat het getal een kommagetal is, round(...), floor(...) of ceil(...) de waarde dan alvorens deze te verzenden. Hele getallen gebruiken minder bandbreedte dan kommagetallen. Strings gebruiken in het algemeen ook meer dan getallen. Als je een getal als string verzend, converteer het dan eerst naar een real. Met gms_self_set_precision(...) kun je instellen hoe precies een variabele moet worden verzonden.

Voeg deze code toe aan het draw event van het other player object:

clothing_sprite= gms_other_get(player_id, “clothing_sprite”)
event_inherited();

Die code vraagt de waarde van de variabele op, en slaat die waarde op in "clothing_sprite". Vervolgens roept de code het overgeërfde draw event aan, dat de sprite van de speler, en de kleren erbovenop drawt. De player_id variabele is automatisch door de extensie aangemaakt, en wordt gebruikt om spelers van elkaar te onderscheiden. De variabele bestaat in elke instantie van het other player object die gemaakt is door GameMaker Server.

Reacties (3)

Laatste bericht op 21 Apr 2020

R1ckx op 21 Jun 2016, 14:39:07
Als je een variable hebt die maar 1 step een waarde bevat, bv of die heeft geschoten of niet, wordt die dan maar 1 step bij de andere clients verzonden, als hij uberhaupt wel wordt verzonden? Of is er een mogelijkheid een soort commando's te sturen? Hoe kan je er ook bijvoorbeeld voor zorgen dat als je op een guest een bed aanmaakt dat de master dat te weten komt, het bed aanmaakt en iedereen die informatie krijgt dat er een bed is?

Ik zat al te denken om als eventuele alternatief p2p messages te gebruiken voor enkele functiecommando's en die te filteren uit de chat
Size43 (Beheerder) op 22 Jun 2016, 14:25:51
Als aanvulling: GameMaker Server probeert variabeles zo snel mogelijk te synchroniseren, maar dit lukt natuurlijk niet altijd. Soms kan het gebeuren dat het netwerk pakketten wat vertraagt. Als er meer dan één wijziging van een variabele tegelijk binnen komt, zal GameMaker Server alleen de meest recente waarde van de variabele opslaan.

Het kan dus inderdaad zijn dat andere clients niks merken van een variabele die voor 1 step een andere waarde heeft.
R1ckx op 21 Jun 2016, 17:44:08
Laat maar, al opgelost, toch bedankt :)

Ff voor ieder ander met mijn probleem: je hebt chat-berichten en p2p messages. De tweede is specifiek gemaakt voor dit doeleinde, terwijl de eerste is gemaakt voor tekst chat. De p2p is dus geen private message systeem.