Gamestudio Links
Zorro Links
Newest Posts
Blobsculptor tools and objects download here
by NeoDumont. 03/28/24 03:01
Issue with Multi-Core WFO Training
by aliswee. 03/24/24 20:20
Why Zorro supports up to 72 cores?
by Edgar_Herrera. 03/23/24 21:41
Zorro Trader GPT
by TipmyPip. 03/06/24 09:27
VSCode instead of SED
by 3run. 03/01/24 19:06
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
3 registered members (VoroneTZ, monk12, Quad), 829 guests, and 4 spiders.
Key: Admin, Global Mod, Mod
Newest Members
sakolin, rajesh7827, juergen_wue, NITRO_FOREVER, jack0roses
19043 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
dplay_entrate, was soll das bringen? #353637
01/11/11 22:31
01/11/11 22:31
Joined: Sep 2002
Posts: 1,065
Germany, Jena, Thüringen
3D_Train_Driver Offline OP
Serious User
3D_Train_Driver  Offline OP
Serious User

Joined: Sep 2002
Posts: 1,065
Germany, Jena, Thüringen
Hallo allerseits,
irgendwie verstehe ich den Sinn von dplay_entrate nicht so ganz.
Es soll laut Manual dafür sorgen, dass sich die Bandbreite verringert, je höher ich den Wert setze. Bis dahin komm ich ja auch noch mit. Nun entsteht aber auf dem Client ein Vorwärts-Ruckeln der Entities. Das verstehe ich ja auch noch. Die ganze Sache mit der Bandbreite soll ja umgangen werden, in dem man lokale Entity-Funktionen schreibt. Man sendet Dreh- und Geschwindigkeitswerte, nur wenn sie sich verändern und die lokale Funktion führt dann die gewünschte Bewegung aus.
Doch wozu das Ganze, wenn es trotzdem durch z.B. dplay_entrate=4; ruckelt? Kann mir das mal einer verständlich erklären und beschreiben, wie ich das verhindern kann? Alle Tutorials beschreiben zwar schön wie man MP-Spiele erstellen kann, aber wenn spätestens bei 4 oder 5 Spielern die Datenleitung zusammenbricht, bringt einen das auch nicht viel weiter.
Danke Euch!

Re: dplay_entrate, was soll das bringen? [Re: 3D_Train_Driver] #353638
01/11/11 23:10
01/11/11 23:10
Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
Superku Offline
Senior Expert
Superku  Offline
Senior Expert

Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
"Einfache" Lösung: Benutze es nicht/ kaum, denn dplay_entrate ist nur eine Möglichkeit für absolute Multiplayer-Beginner, damit diese schnell sichtbare Resultate erreichen, oder aber bei der Programmierung von LAN-Games.

Setze dplay_entrate auf den Maximalwert von 100 (nicht auf -1, dann werden überhaupt keine Entity-Updates gesetzt und die Entity wird somit auf dem Klienten nicht sichtbar).
Setze nun in der smask alle möglichen NOSEND-Flags, v.a. aber _ORIGIN und _ANGLES. Verzichte jedoch darauf, stattdessen einfach (als einziges Flag) NOSEND zu setzen, da ansonsten ebenfalls keine Entity auf dem Klienten bei Beitritt erscheint.
Setze dplay_localfunction = 2.
Deine betreffenden Entity-Aktionen teilst du in zwei Teile auf, ob my.client_id == dplay_id oder aber eben nicht. Wird die Entity vom Klienten bewegt, so speicherst du nach der Bewegung die Positionen und Winkel in Skills und sendest diese an den Server. Letzterer sendet die Skills an die übrigen Klienten zurück (natürlich stets nur, wenn sich die Werte ändern und höchstens 4-8mal pro Sekunde).
Jeder Klient und der Server interpolieren nun anhand der Skills die Positionen. Dabei kannst du einen Zeit-Skill benutzen, welche die Zeit zwischen Updates speichert und so flüssigere Interpolation ermöglicht. Der Server sollte, bspw. bei Shootern oder ähnlichen Spielen, gewisse Korrektur-Algorithmen vornehmen, und somit testen, ob alle Bewegungen legal oder ercheatet worden sind.


"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual

Check out my new game: Pogostuck: Rage With Your Friends
Re: dplay_entrate, was soll das bringen? [Re: Superku] #353884
01/13/11 20:23
01/13/11 20:23
Joined: Sep 2002
Posts: 1,065
Germany, Jena, Thüringen
3D_Train_Driver Offline OP
Serious User
3D_Train_Driver  Offline OP
Serious User

Joined: Sep 2002
Posts: 1,065
Germany, Jena, Thüringen
Vielen Dank für die Antwort. Da muß ich aber trotzdem noch mal nachhaken. Ich hab nun schon mehrfach angefangen eine Multiplayer-Umgebung zu erstellen und bin bisher immer an der gleichen Stelle stecken geblieben, hab das Ganze dann gefrustet und lustlos abgebrochen, weil es mir bisher einfach keiner mal logisch erklären konnte, wie eine stinknormale flüssige Bewegung geproggt wird. Ich komme immer so weit. Auf dem Server bewegt sich alles toll und auf dem Clienten bewegt sich nur die Spielfigur, die dort erstellt wurde flüssig. Die andere ruckelt nur rum, dank dplay_entrate.
Jetzt mein Problem, was ich nicht verstehe: Ich sende die Dreh- und Bewegungsgeschwindigkeit an den Server. Doch der sendet es offensichtlich nicht zurück.
Für mich logisch klingt sowas:

Beispiel:
Code:
der skill my._force_x wurde geändert
send_skill(my._force_x,SEND_ALL); //wird zum Server geschickt

Server empfängt das Ganze, vermutlich per event_receive

if(event_type==event_receive){
send_skill(my._force_x,SEND_ALL); //sendet an alle anderen weiter
}

Da die lokale Entity-Funktion ja in einer Schleife läuft, müßte ja nun mal was passieren. weil _force_x ja nun einen Wert hat, nicht?



Das kann doch eigentlich nicht so schwer sein, ich kapier das einfach nicht.

Re: dplay_entrate, was soll das bringen? [Re: 3D_Train_Driver] #353898
01/14/11 00:04
01/14/11 00:04
Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
Superku Offline
Senior Expert
Superku  Offline
Senior Expert

Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
Das müsste (!) eigentlich funktionieren, versuche doch aber mal folgendes (habe hier keiner kein Gamestudio, daher ist es nur als Skizze zu verstehen und ohne Formatierung zu lesen):

{
...
dplay_localfunction = 2;
dplay_entrate = 100;
dplay_smooth = 0;
...
}


void train_event() { my.skill1 = 0; }

void update_train() {
while(my.skill1) {
if(my.client_id == dplay_id) {
my.dplay_x = my.x;
}
if(my.skill2 < 0) {
if(my.dplay_x != my.old_dplay_x) {
my.old_dplay_x = my.dplay_x;
send_skill(my.dplay_x,SEND_ALL);
}
my.skill2 = 2; // max. 8 mal pro Sekunde senden
}
else { my.skill2 -= time_step; }
wait(1);
}
}

action act_train() {
while(my.client_id < 0) { wait(1); }
my.emask |= ENABLE_DISCONNECT (heißt das so?);
my.event = train_event;
my.smask |= NOSEND_ORIGIN | NOSEND_ANGLES | NOSEND_...;
update_train();
my.skill1 = 1;
while(my.skill1) {
if(my.client_id == dplay_id) {
my.x += 10*(key_w-key_s)*time_step;
}
else {
my.x += (my.dplay_x-my.x)*0.1*time_step;
}
wait(1);
}
ptr_remove(me);
}

Nun spawnt jeder Klient, der dem Spiel beitritt, eine Entity mit act_train. Es sollte funktionieren. Jedoch wird der Zug zwischen den Positionen unschön beschleunigen und abbremsen, weshalb du die Zeit der empfangenen Updates speichern musst (bspw. im Entity-Event per event_receive) und anhand dessen lokal die Geschwindigkeiten errechnen musst.


"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual

Check out my new game: Pogostuck: Rage With Your Friends
Re: dplay_entrate, was soll das bringen? [Re: Superku] #354135
01/16/11 01:12
01/16/11 01:12
Joined: Sep 2002
Posts: 1,065
Germany, Jena, Thüringen
3D_Train_Driver Offline OP
Serious User
3D_Train_Driver  Offline OP
Serious User

Joined: Sep 2002
Posts: 1,065
Germany, Jena, Thüringen
Tja. Ich glaube, das Ganze wird an meiner A6 scheitern. Denn da gibt es weder my.client_id noch dplay_id.
Viel Geld für ein Update noch mal hinlegen, das kann ich nicht.
Das Online-Tutorial ist leider schon für A7.7. Zwar noch verständlich und eigentlich auch einfach. Aber ich muß mich wohl damit abfinden, dass ich das nicht so hinkriege, wie ichs mir denke. Wenns noch ne einfache Lösung gibt, dann immer her damit.

Re: dplay_entrate, was soll das bringen? [Re: 3D_Train_Driver] #354137
01/16/11 01:23
01/16/11 01:23
Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
Superku Offline
Senior Expert
Superku  Offline
Senior Expert

Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
Daran wird es doch nicht scheitern, höchstens mühsamer.
Definiere die Funktion beispielsweise wie folgt und starte die Aktion per proc_local (?), sollte es kein dplay_localfunction in A6 geben:

#define client_id skill100

var local_client_num = 0;

action act_train() {
if(connection == 2) {
my.client_id = -1;
while(my.client_id < 0) {
wait(1);
}
}
...
my.skill1 = 1;
while(my.skill1) {
if(my.client_id == local_client_num) {
my.x += 10*(key_w-key_s)*time_step;
}
else {
my.x += (my.dplay_x-my.x)*0.1*time_step;
}
wait(1);
}
ptr_remove(me);
}

Nun erstellst du die Spielfiguren nicht mehr direkt durch die Klienten, sondern einzig und allein durch den Server. An die jeweiligen übermittelst du dann auch client_id, welches du auf die entsprechende Spieler-ID setzt (local_client_num).


"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual

Check out my new game: Pogostuck: Rage With Your Friends
Re: dplay_entrate, was soll das bringen? [Re: Superku] #354191
01/16/11 14:55
01/16/11 14:55
Joined: Nov 2002
Posts: 913
Berlin, Germany
S
SchokoKeks Offline
User
SchokoKeks  Offline
User
S

Joined: Nov 2002
Posts: 913
Berlin, Germany
@Superku das war jetzt leider nicht so hilfreich, da er ja wie oben geschrieben kein client_id hat.

Ich habe mal in den alten Release-Notes gestöbert:
dplay_localfunction gibt es schon seit A6.32.
client_id aber anscheind erst seit A7 und nur mit lite-C.

Dein code oben sollte eigentlich funktionieren. Wenn man an den Server sendet, sollte man allerdings 0, also
Code:
send_skill(my._force_x,0); //wird zum Server geschickt

statt SEND_ALL verwenden.
Stelle sicher, das der code, der das ruckeln verhindern soll auch wirklich für alle anderen clients auf jedem client läuft. Lass die funktion z.b. über der entity mit draw_text was anzeigen.

Ohne dplay_localfunction oder proc_local wird die entity funktion nämlich nicht auf den anderen clienten ausgeführt, und das Ruckeln wäre ganz normal.

Re: dplay_entrate, was soll das bringen? [Re: SchokoKeks] #354202
01/16/11 17:13
01/16/11 17:13
Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
Superku Offline
Senior Expert
Superku  Offline
Senior Expert

Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
Doch, es war sehr hilfreich!
Ich habe oben doch "#define client_id skill100" geschrieben?!

Quote:
Wenn man an den Server sendet, sollte man allerdings 0, also statt SEND_ALL verwenden.

Das kann man ruhig dort stehen lassen, weil es vom Klienten ignoriert wird und keinen negativen Effekt hervorruft.


"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual

Check out my new game: Pogostuck: Rage With Your Friends
Re: dplay_entrate, was soll das bringen? [Re: Superku] #354220
01/16/11 19:11
01/16/11 19:11
Joined: Sep 2002
Posts: 1,065
Germany, Jena, Thüringen
3D_Train_Driver Offline OP
Serious User
3D_Train_Driver  Offline OP
Serious User

Joined: Sep 2002
Posts: 1,065
Germany, Jena, Thüringen
Vielen Dank für Eure zahlreichen Antworten.
Ich habe eine Lösung für das Problem gefunden, kann es mir aber nicht so ganz erklären warum.
Vielleicht habt Ihr ja eine Erklärung.

Meine Spielfigur machte vorher folgende Funktion:
Code:
function spielfigur(){
my.client_id = new_player_id;
my.string1 = STR_new_player_name;
var force_x_old;
var force_y_old;
var dist_x_old;
my.turnspeed=8;
my.speed=15;
my.ENABLE_DISCONNECT=1;
my.enable_receive=1;
my.event=player_event;
wait(1);
ent_sendnow(my);
send_skill(my.speed,SEND_ALL);
send_skill(my.turnspeed,SEND_ALL);
send_skill(my.client_id,SEND_ALL);

while(1){
if(connection & CONNECT_SERVER){
			if(my.force_x!=force_x_old){send_skill(my.force_x,SEND_ALL);force_x_old = my.force_x;}
			if(my.force_y!=force_y_old){send_skill(my.force_y,SEND_ALL);force_y_old = my.force_y;}
			}
wait(1);
}
}



und jetzt folgende (nur in der Schleife ist ein bissel was hinzugekommen, ich sende nun speed und turnspeed noch mal mit, sowie extra noch dist_x):

Code:
function spielfigur(){
my.client_id = new_player_id;
my.string1 = STR_new_player_name;
var force_x_old;
var force_y_old;
var dist_x_old;
my.turnspeed=8;
my.speed=15;
my.ENABLE_DISCONNECT=1;
my.enable_receive=1;
my.event=player_event;
wait(1);
ent_sendnow(my);
send_skill(my.speed,SEND_ALL);
send_skill(my.turnspeed,SEND_ALL);
send_skill(my.client_id,SEND_ALL);
	
while(1){
if(connection & CONNECT_SERVER){
			if(my.force_x!=force_x_old){send_skill(my.turnspeed,SEND_ALL);send_skill(my.speed,SEND_ALL);send_skill(my.force_x,SEND_ALL);force_x_old = my.force_x;}
			if(my.force_y!=force_y_old){send_skill(my.turnspeed,SEND_ALL);send_skill(my.speed,SEND_ALL);send_skill(my.force_y,SEND_ALL);force_y_old = my.force_y;}
			if(my.dist_x!=dist_x_old){send_skill(my.dist_x,SEND_ALL);dist_x_old = my.dist_x;}
			}
wait(1);
}
}



Irgendwie kommen die 3 zu sendenden Werte vor Beginn der Schleife nicht bei den Klienten an, egal ob ich noch eine Wartezeit nach ent_sendnow einfüge oder nicht.

Zumindest können sich die Figuren nun endlich auch flüssig auf den Klienten bewegen.

Die Client_id hole ich übrigens aus einer Datenbank im Netz.

Na jetzt bin ich ja mal auf Eure Antworten gespannt.

Last edited by 3D_Train_Driver; 01/16/11 19:16.
Re: dplay_entrate, was soll das bringen? [Re: 3D_Train_Driver] #354296
01/17/11 15:13
01/17/11 15:13
Joined: Sep 2002
Posts: 1,065
Germany, Jena, Thüringen
3D_Train_Driver Offline OP
Serious User
3D_Train_Driver  Offline OP
Serious User

Joined: Sep 2002
Posts: 1,065
Germany, Jena, Thüringen
Hi Leute, da kann ich mir gleich selbst wieder antworten.
Das was ich da geschrieben habe geht nur, solange sich 2 Leute verbinden. Kommt noch ein dritter hinzu, gehts schon wieder nicht mehr.


Moderated by  HeelX, Spirit 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1