Compensazione lag proiettili

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
Barnack
Membro attivo
Messaggi: 341
Iscritto il: 03/09/2013, 13:26
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Contatta:

Compensazione lag proiettili

Messaggio da Barnack »

Ciao a tutti,
ho trovato due bei tutorial per il multiplayer, ma quando si tratta di lag compensation risolvono tutti utilizzando una linea istantanea invece di un proiettile.
Volevo fare un semplice top-down shooter/moba per 3v3.
Qualche idea per i proiettili intesi come istanze in movimento?

EDIT:
niente di complicato, 6 cerchi che si muovono e sparano. In pratica serve per giocare coi vicini di banco durante il corso di database xD

Utilizzo
GM: Studio Pro
C++ terminale
Batch
Jaschif

Spoiler
C++ WinApi / DirectX
C#



Avatar utente
boxbuilder
Membro
Messaggi: 158
Iscritto il: 25/06/2015, 10:37
Specialità: programmatore
Uso: GM:Studio 1.4 HTML5
Contatta:

Re: Compensazione lag proiettili

Messaggio da boxbuilder »

Barnack ha scritto:Ciao a tutti,
ho trovato due bei tutorial per il multiplayer, ma quando si tratta di lag compensation risolvono tutti utilizzando una linea istantanea invece di un proiettile.
Volevo fare un semplice top-down shooter/moba per 3v3.
Qualche idea per i proiettili intesi come istanze in movimento?

EDIT:
niente di complicato, 6 cerchi che si muovono e sparano. In pratica serve per giocare coi vicini di banco durante il corso di database xD
Ciao,
un paio di domande:
quale tutorial stai seguendo?
il server come funziona, il game-state viene gestito dalla macchina che crea la stanza?

Avatar utente
cp94
Moderatore
Messaggi: 2789
Iscritto il: 04/07/2009, 19:18
Specialità: ddd
Località: Brescia
Contatta:

Re: Compensazione lag proiettili

Messaggio da cp94 »

Invece di fare l'update delle coordinate dei proiettili direttamente (cosa che laggherebbe con qualsiasi server) dovresti leggere le coordinate e fare un lerp con le coordinate ricevute allo step precedente, in questo modo la traiettoria non sarà scattosa ma molto più naturale.
Games you should check out
Naemo
E T U S
Overgravity
Inside the Code

Immagine

Avatar utente
Alv
Membro
Messaggi: 133
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Compensazione lag proiettili

Messaggio da Alv »

Potresti inviare le coordinate di dove è avvenuto lo sparo e la direzione. Quando il messaggio viene ricevuto, non piazzi il proiettile direttamente lì, ma sommi alla posizione velocita_proiettile * ping: così le partite sono sincronizzate. Poi lo fai andare per i fatti suoi, con moto rettilineo e uniforme.
Ultima modifica di Alv il 25/12/2020, 12:44, modificato 3 volte in totale.

Barnack
Membro attivo
Messaggi: 341
Iscritto il: 03/09/2013, 13:26
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Contatta:

Re: Compensazione lag proiettili

Messaggio da Barnack »

okok colpa mia non mi sono spiegato abbastanza.
Non ho alcun problema di "scattosità", dei proiettili invio solo luogo di sparo e direzione, ogni client lo fa muovere da sé.
Dei giocatori invio le coordinate ogni 3 o 5 step, e ogni client fa l'animazione di spostamento del giocatore a quelle coordinate, così ho un "ritardo controllato".

L'unico problema di questo approccio sono appunto i proiettili.
Il server fa tutti i calcoli da sé, quindi nel server il proiettile segue una certa traiettoria, e quando collide si distrugge/esplode, inviando ai clients l'informazione del fatto che si è distrutto.
Però considerato il ritardo della posizione del giocatore sussistono i seguenti problemi:
- se dico che il giocatore spara in una certa direzione la traiettoria sarà spostata del ritardo del giocatore stesso, con potenziali trapassa muri o danneggia qualcuno passando a 4 pixels di distanza
- posso far partire il proiettile dalle corrette coordinate di sparo, ma a quel punto si vedrebbero giocatori che sparano dal vuoto invece che dalla loro posizione (giustificabile con qualche effetto particellare data l'idea di base fantasy xD)
- posso correggere la posizione del giocatore in quel dato istante (ovvero annullare il ritardo nello spostamento) per poi sparare, ma questo causerebbe gente che scatta in avanti in un istante.

Tutti problemi che utilizzando una linea istantanea invece di un proiettile non sussisterebbero :fapensare:

Tutorials di riferimento
https://www.youtube.com/watch?v=4_bhmfhN20Y < gestione del movimento
https://www.youtube.com/watch?v=0H5DNFSXTNk < gestione client-server

Note:
il gioco si "svolge" completamente nel server. I clients ricevono variazioni nell'input e le inviano al server (così facendo il movimento del mio oggetto giocatore subisce lo stesso ritardo degli altri oggetti giocatore, 3 step)
Alcune cose che non influiscono nella matematica del gioco come le ombre dinamiche, effetti particellari vari, textures animate e la telecamera ovviamente sono gestite dai clients. Il server invece ha una grafica minimalista limitata a quello che "accade" nel gioco, ovvero tanti cerchi per giocatori, proiettili etcc etcc

Utilizzo
GM: Studio Pro
C++ terminale
Batch
Jaschif

Spoiler
C++ WinApi / DirectX
C#



Avatar utente
boxbuilder
Membro
Messaggi: 158
Iscritto il: 25/06/2015, 10:37
Specialità: programmatore
Uso: GM:Studio 1.4 HTML5
Contatta:

Re: Compensazione lag proiettili

Messaggio da boxbuilder »

certo che la linea istantanea risolve gran parte dei problemi, perché puoi definire immediatamente se il bersaglio sia stato colpito o meno, salvo la questione "round trip time": un opponente con lag superiore potrebbe averti colpito ancor prima ma avere la sfiga di passare l'informazione dopo che il tuo colpo sia già stato processato dal server.

Per gestire traiettoria e velocità del proiettile farei così:

Il client1 spara, quindi passa l'info (sparo + time stamp al server)
Il server passa l'informazione coordinate dello sparo+ angolo ai vari client
L'eventuale collisione fra sparo e avversario viene determinata all'interno del client1 (sparante) che restituisce (hit + time_stamp) al server.
All'interno dei client (non sparanti) viene gestita l'animazione del proiettile mediante un'interpolazione.

Tutti gli hit vengono salvati in uno stack e riordinati dal server attraverso il time_stamp, e risolti ogni 3-5 fotogrammi; così forse risolvi anche il primo problema, ovvero capire chi ha sparato prima e chi dopo.

Comunque è un bel casino.

Rispondi

Chi c’è in linea

Visitano il forum: Google [Bot] e 42 ospiti