n° 219
Novembre 2017
Dicembre 12, 2017, 02:16:31 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Gioco multigiocatore UDP C++ SDL2  (Letto 2140 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
DiCri
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« inserita:: Giugno 25, 2017, 06:02:19 »

Salve sono un programmatore di 15 anni ma ho ua buona conoscenza del linguaggio tantoda aver creato un videogioco disponibile su gamejolt (per chi fosse interessato il gioco si chiama "Geometric Hunt").
Volevo rendere il gioco multigiocatore tramite il protocollo UDP che purtroppo non so usare!
L'API che sto utilizzando è SDL2 che contiene SDL2_net per appunto roba del genere..
Potete dirmi un tutorial su come posso rendere il o gioco multigiocatore? Tipo vado su un pulsante "cerca giocatore" e mi risultano le persone online e invio una sfida senza sapere l' indirizzo ip del compagno..
Perche recentemente ho usato un codice esempio per farlo ma richiedeva che io mettessi il l'indirizzo IPv4 e porta della persona a cui volevo connettermi..
Per favore aiutatemi non so a chi chiedere!! Grazie
Registrato
michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #1 inserita:: Giugno 26, 2017, 12:10:33 »

Presumo che il gioco sia questo: https://gamejolt.com/games/gh/263866  Sorriso


In sostanza cerchi un qualcosa che "parta da 0" per SDL_net e che utilizzi UDP?

Qui c'è un interessante tutorial:

http://headerphile.com/sdl2/sdl2-part-12-multiplayer/

Dopo qualche richiamo sull'header IP e sul protocollo UDP, inizia a fare qualche esempio applicativo con relativi output.

Una "roba"  Ghigno del genere intendevi?

Poi c'è un intero sito dedicato a tutorial sulle librerie SDL:

http://www.sdltutorials.com

e SDL_net:

Parte 1: http://www.sdltutorials.com/sdl-net-part-1-user-tutorial
Parte 2: http://www.sdltutorials.com/sdl-net-part-2-user-tutorial
Registrato
DiCri
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #2 inserita:: Giugno 26, 2017, 04:04:32 »

Proprio il tutorial da headerphile ho usato..
Ma quel codice richiedeva che per connettermi e comunicqre con una persona avevo bisogno del suo ip...
Ma in altri giochi non ci sono ip a mettere..
Registrato
DEV-01
Full Member
***

Karma: +11/-23
Scollegato Scollegato

Messaggi: 472

Me.Shift ^(n)


Mostra profilo E-mail
« Risposta #3 inserita:: Giugno 26, 2017, 05:51:53 »

Non ci sono ip da mettere perché la sessione che si connette lo preleva e lo trasmette automaticamente all'engine del programma.

Una struttura tipo array (ad esempio e tanto per capirci) condivisa fra le sessioni tiene traccia degli utenti (nome) connessi da mostrare e dei relativi indirizzi ip (che tiene nascosti alla grafica).

Quando tu selezioni un partecipante, il programma assegna il relativo ip per creare la connessione fra i due.

Ovviamente anche la parte relativa alla trasmissione dei dati deve essere implementata:

Se il gioco è online tutti possono trasmettere i dati all'engine del gioco e visualizzare o ricevere eventuali altre informazioni.

Se invece è un point-to-point oppure le sessioni di gioco devono essere esclusive per due giocatori, o fai come sopra, oppure metti entrambe le istanze in comunicazione tramite socket per fargli scambiare i dati di gioco (posizione, danno, energia, etc.).
Registrato

01000100 01100101 01110110 00101101 00110000 00110001
DiCri
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #4 inserita:: Giugno 28, 2017, 06:57:50 »

Eccomi, a quanto ho capito cercando varia roba suinternet so che ci sono due codici da scrivere, uno per il server e uno per il client.
Ecco non ho capito cosa si intende per due codici. Il gioco ovviamente è uno solo e chi ci gioca è il client quindi a cosa mi serve il codice del server.. cioe non ho capito proprio..
Non ho capito da dove prendere sto server..
Registrato
paooolino
Full Member
***

Karma: +16/-10
Scollegato Scollegato

Messaggi: 380

Ideas in programming


Mostra profilo WWW
« Risposta #5 inserita:: Giugno 28, 2017, 09:06:35 »

"il gioco è uno solo", appunto, ma se ci sono in giro 100 client come fa ognuno di questi client a comunicare con gli altri?

nel caso del point-to-point, funziona tra due giocatori, metti il caso di una partita a scacchi: il software è lo stesso (hai due client) che si collegano l'uno all'altro attraverso l'ip.
 
ma se i giocatori sono di più non si può obbligare tutti ad inserire l'ip degli altri!

allora si crea una applicazione server, che gira di solito su un server pubblico (ha un indirizzo internet tipo server.gioco.com) e non fa altro che "rimanere in ascolto" dei client e dei loro input. Solo il server è l'unica fonte di verità del tuo gioco: il server sa che il personaggio X si trova in posizione (10,10) nel gioco e che il personaggio Y si trova in posizione (15, 32).

TUTTI gli altri client non sanno nulla e si collegano al server. Il server comunica a TUTTI, quando si collegano, le posizioni dei vari personaggi in modo da visualizzarli sullo schermo del giocatore.

il SERVER può anche non avere interfaccia grafica, rimane in ascolto e mantiene in memoria lo stato del gioco (le posizioni di tutti i giocatori, nell'esempio, e anche molto altro). Comunica con un database, o scrive tutto su disco, o mantiene solo nella RAM, a scelta.

i n CLIENT invece non memorizzano proprio nulla ma servono solo a renderizzare (leggere i dati dal server e visualizzare sullo schermo) e ad accettare l'input utente.

quando un giocatore muove il suo personaggio, invia l'azione al server. Quest'ultimo aggiorna la posizione e comunica a TUTTI i client il cambiamento.

Client e server sono naturalmente due applicazioni diverse: sono le due parti che compongono il tuo gioco.
Registrato

DiCri
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #6 inserita:: Giugno 29, 2017, 12:37:14 »

Ok grazie fino a qui ci sono. Ma non ho capito l' applicazione server dov'è che viene utilizzata? Nel mio computer? Cioe.. vedevo che codice server e codice ent erano entrambi c++. Ma se è un sito dovrebbe essere php credo. Una volta ho provato a chiedere anche ad un mio prof e neanche lui ha saputo fare bene questa cosa.
Questo codice server una volta compilato dove si deve usare in pratica
Registrato
paooolino
Full Member
***

Karma: +16/-10
Scollegato Scollegato

Messaggi: 380

Ideas in programming


Mostra profilo WWW
« Risposta #7 inserita:: Giugno 29, 2017, 12:49:43 »

L'applicazione server puoi farla girare dove vuoi.

Puoi anche metterla sul tuo pc ed avviarla, l'importante è che sia raggiungibile dall'esterno. In questo caso gli altri giocatori non avranno un indirizzo server.gioco.com a cui collegarsi (perchè il tuo pc non è pubblico), ma darai a tutti l'ip pubblico del tuo router. Sul router dovrai aprire la porta su cui l'applicazione server rimane in ascolto e reindirizzarla all'ip interno (192.168.1.xxx) del tuo pc.

Puoi anche metterla su un server pubblico e farla girare lì. I server sono macchine a tutti gli effetti, non ci gira solo apache e php. Se sono macchine linux poi col C++ ci vanno a nozze. il vantaggio è che hai una macchina dedicata che non dipende dalla tua connessione, e raggiungibile attraverso un indirizzo http. Lo svantaggio è che non puoi usare un hosting "normale" perchè hai limitazioni, dovresti avere un server dedicato o una macchina in cloud dedicata (non so se ci siano servizi gratuiti per questo).

Se vuoi usare un hosting gratuito o a basso prezzo, nè più nè meno quello che useresti per un sito, sì, dici bene, l'applicazione dovrebbe essere scritta in php, o python, o nodejs, o qualsiasi linguaggio l'hosting ti metta a disposizione.

Di solito per fare dei test o per lo sviluppo non c'è bisogno di macchine separate, puoi benissimo avviare l'applicazione server e due o tre istanze dell'applicazione client all'interno della tua rete o addirittura sul tuo stesso pc. Sempre che l'applicazione te lo permetta però.


Registrato

DiCri
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #8 inserita:: Giugno 29, 2017, 02:59:33 »

Wow ora ho capito!
Ho gia due siti ma in nessuno dei due riesco a connettermi. Uno con altervista e l' altro con 000webhost e quando uso il cmd per averne l'indirizzo IP vedo che ogni volta cambia.
Ma l'IP di un sito rimane cosi per sempre no? Invece quello del router a quanto pare cambia?
Se tipo metto l'IP del mio router nel programma client in modo che l' utente possa connettersi senza inserirlo funzionerà sempre?
Grazie mille comunque
Registrato
DiCri
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #9 inserita:: Giugno 29, 2017, 03:01:02 »

Ah ma quindi se uno si vuole connettere al server (cioe del mio router) devo tenere l' applicazione server accesa nel pc sempre?
Registrato
paooolino
Full Member
***

Karma: +16/-10
Scollegato Scollegato

Messaggi: 380

Ideas in programming


Mostra profilo WWW
« Risposta #10 inserita:: Giugno 29, 2017, 03:13:33 »

L'indirizzo ip di un sito non dovrebbe cambiare... quanto meno, non ogni volta. In teoria è fisso, a meno che chi gestisce il sito non si trasferisca su un nuovo server - e allora cambia IP, ma è una cosa che non si fa spesso. Oppure grandi siti con più server potrebbero indirizzarti ogni volta su un server diverso (es. google ha più server e quindi più IP, e quando ti connetti in base a quello più vicino/più veloce vieni reindirizzato). Comunque se ti devi collegare a un sito non usare l'ip, usa il nome del dominio (che se anche l'ip cambia quello rimane sempre uguale).

L'IP del tuo router può cambiare, sì. Mettere l'ip del tuo router nel programma client potrebbe essere una buona idea, se non cambiasse. Se tu spegni e riaccendi il router probabilmente cambi ip. se lo lasci acceso due settimane e non ci sono interruzioni di corrente, l'ip rimane sempre lo stesso. Ci sono dei servizi tipo questo https://www.noip.com/it-IT che in pratica ti permettono di avere una specie di nome a dominio per la tua macchina anche in caso l'ip cambi: devi solo installare il programmino e mantenerlo in esecuzione sulla tua macchina, serve appunto per aggiornare l'IP ed indirizzare correttamente i tuoi utenti verso la tua macchina.

Sì, se l'applicazione server gira sul tuo pc, questo deve essere sempre acceso e online se vuoi che qualcuno si connetta.
Registrato

DiCri
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #11 inserita:: Giugno 29, 2017, 03:31:20 »

Ho appena installato l'ADSL ieri pero purtroppo non va internet (e suppongo per fare sta cosa ovviamente serva internet). Quindi spero mi si attivi e il tempo di attesa non sia lungo.
Pero intanto credo potrei testarlo usando due dispositivi connessi tramite wi-fi allo stesso router del server no? Anche se non vi è internet c'è lo stesso una connessione.
Appena possibile metterò il titolo di questa discussione come [RISOLTO]
Registrato
paooolino
Full Member
***

Karma: +16/-10
Scollegato Scollegato

Messaggi: 380

Ideas in programming


Mostra profilo WWW
« Risposta #12 inserita:: Giugno 29, 2017, 03:59:54 »

certo puoi fare tutti i test che vuoi offline nella tua rete interna

devi vedere l'ip locale del tuo pc com'è e usare quello. Puoi impostare l'ip locale del tuo computer dove gira l'applicazione server in modo che sia fisso.
Registrato

DiCri
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 8


Mostra profilo E-mail
« Risposta #13 inserita:: Giugno 30, 2017, 07:27:36 »

Cosa importante.
Ho un struct da inviare dal client al server e questo struct contiene
Int x =100; int y = 50; int score = 271; char* name = "DiCri";

Invio lo struct cosi:
Pstruct p;
//do a p dei valori (quelli indicati sopra)
SDLNet_TCP_Send (client, (char*)&p, sizeof (p));

Il server riceve i dati e li mostra
Tutto va bene tranne il nome
Il server dice che p.name = [caratteri strani a caso]
Stessa cosa se quel char* fosse na stringa
Come posso fare?
Grazie


Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines