Newsgroup: it.comp.java
Titolo: Help comunicazione client server videogame applet

Ciao a tutti,
sono una studentessa universitaria di ingegneria informatica e siccome devo 
fare come elaborato per un esame un programma java che tratti di 
sincronizzazione fra thread e comunicazione fra thread via tcp... allora 
l'idea era di fare una specie di videogioco...
un mio amico che ha già fatto l'esame ha fatto un laser game testuale...
ha fatto il server che riceve le chiamate dai client che sono nient'altro 
che telnet richiamato da shell dos sotto windows...
ogni client è un thread giocatore sul server c'è una classe campo di gioco 
dove vengono condivisi dei metodi quindi sincronizzati... e dal client al 
server vengono spediti come dati solo gli input della tastiera dal client 
(telnet) verso il server e dal server verso il client dei messaggi testuali 
per dirgli dove è il giocatore nel labirinto del lasergame e se ha davanti 
altri giocatori per potergli sparare... ecco per quanto semplice è carino ma 
testuale c'è abbastanza poco divertimento... allora io vorrei riprendere la 
cosa facendo un gioco simile solo però con un server e tanti client applet 
sotto browser che si collegano e che possono giocare insieme... sto 
guardando vari giochi tipo pacman o altri su questo sito 
http://www.homepages.hetnet.nl/~brianpostma/java.html
o su questo
http://www.javacooperation.gmxhome.de/OnlineSpieleStartEng.html
o su questo
http://www.java-tutorial.net/DownloadsEng.html
da qualche ora mi sto studiando il codice del gioco pacman nel primo sito e 
l'ho capito non mi è risultato difficile... il problema è che io vorrei fare 
uno di questi giochi che sia pacman o anche un pong... versione multiplayer 
via internet con 2 o più giocatori a seconda del tipo di gioco... per 
esempio per pacman farei entrare in partita i client che devono mangiare i 
quadratini ed evitare eventualmente se ce li voglio mettere i 
mostriciattoli... chi mangia più quadratini alla fine della partita vince e 
viene stilata la classifica... altrimenti un semplice pong con due racchette 
e una pallina da giocare in 2... premetto che io programmo in java da 2 
minuti e non è più che altro il fatto di imparare, quello ci riesco bene ma 
è il fatto che ho poco tempo... questa cosa andrà fatta nel giro di un 
mese... un'ora il giorno magari... il tipo che ha fatto pacman ci ha messo 5 
ore facendolo monoutente (dice lui) ma per me è diverso... ed è diverso 
anche ciò che voglio fare...
ora vengo (scusate il romanzo) al problema principale... nel gioco del mio 
amico come dicevo l'unica comunicazione è quella dei tasti della tastiera... 
ma in un'interfaccia grafica dovrei tenere conto della posizione di oggetti 
che si muovono su tutti gli schermi dei client... e non ho ben idea di come 
fare...
non sapete voi di siti dove ci sono degli esempi anche semplicissimi da cui 
posso imparare?
ad esempio con un pacman multiplayer server e più client dovrei comunque 
avere il campo con metodi condivisi sincronizzati e per ogni client un 
thread ok... però ogni thread dovrebbe gestire la comunicazione relativa e 
dovrebbe poter dire al cliente tutte le posizioni di tutte le cose da 
cambiare nello schermo... insomma tutti devono sapere dove sono tutti gli 
altri e ridisegnarli sullo schermo... sto cercando di ragionarci sopra ma... 
non l'ho mai fatto e se qualcuno mi aiuta a capire gliene sarei grata... 
grazie ciao... scusate ancora il romanzo... 

Ecco ho trovato adesso questo link 
http://arianne.sourceforge.net/?arianne_url=content/download
č cosě complesso fare quello che voglio fare?
Ancora non ho guardato nel sito ma, a parte il gioco gladiators ma...
quello di pacman multiplayer č cosě difficile da realizzare... cmq adesso mi 
guardo i codici... 


wrote:

Uhm di solito per i giochi multplayer si usa il protocollo UDP... la
ricezione/invio delle info deve essere veloce.... e anche se viene
perso un pacchetto il danno non è grave visto che poi verranno spediti
(si spera) correttamente i successivi.... 
Penso che cmq la soluzione piu semplice sarebbe quella di memorizzare
la posizione dei giocatori NEL server.... e poi tramite il server
comunicare ad intervalli regolari le posizioni dei rispettivi
giocatori..... 
Potresti quindi semplicemente mandare al server il tuo spostamento
corrente (se è avvenuto uno spostamento), al quale il server
ricalcolera la tua posizione e quindi invierà le cordinate agli altri
giocatori.... (o semplicemente ogni tot millisecondi manda le
coordinate a TUTTI i giocatori). Quindi il tuo applet riceve le
coordinate dal server e una volta inidividuate le coordinate
corrispondenti visualizza il giocatore alla posizione calcolata...
Per spostamento intendo gli incrementi delle coordinate x e y in base
alla pressione dei tasti.... (se ad esempio ti vuoi spostare in alto
alla pressione del tasto di direzione "SU" manderai al server la
coppia (0,-1)  dove 0 è lo spostamento relativo all'asse x e -1 lo
spostamento relativo all'asse y) 
Il mio è solo uno spunto... sono rimasto solo incuriosito dal tuo
post... Mi scuso se questa soluzione sembra banale....  ma nemmeno io
ho fatto programmi del genere.... 
Ciauz

 corrispondenti visualizza il giocatore alla posizione calcolata...
Si anche io ho pensato una cosa del genere abbastanza in fretta... domani 
sentirò anche se più che altro va bene al prof o se mi assegna la classica 
battaglia navale o qualche altro progetto che usa di default come elaborato 
per gli studenti...
Sul server ci deve essere una classe con metodi sincronizzati... questa 
classe dovrebbe essere il campo di gioco, il labirinto insomma.
Praticamente tutti i client mandano ai rispettivi thread del server le loro 
coordinate ad ogni evento cioè quando viene premuta una freccia direzionale 
diciamo...
Il server da parte sua riceve tutte le coordinate che immagazzina nella 
classe del campo di gioco.
I thread che rappresentano i vari client ricevono i dati intervengono sulla 
classe condivisa e la leggono per rimandare al client singolo tutte le 
coordinate degli altri clients...
Ma non so come mandare questi dati perchè oltre alle coordinate vanno 
mandati anche altri dati... insomma è come spedire un oggetto direttamente e 
non un semplice codice di un tasto premuto... non so bene... cioè perchè 
nell'esempio del mio amico il client manda solo i codici dei caratteri 
premuti che vengono letti via via o finché non si rileva il tasto invio ad 
esempio... ma io non devo mandare codici singoli devo mandare che ne so 
un'array di coppie di coordinate dove l'indice indica l'id del client e... 
poi appunto altri dati come la fine della partita o... boh
Io credo che esistono altri metodi della classe socket o socket datagram per 
mandare altri tipi di dati organizzarli in qualche modo... cmq ci sto 
studiando... tu che dici?
Io avevo anche trovato un pacman multiplayer già fatto qua:
http://arianne.sourceforge.net/?arianne_url=games/game_mapacman
il problema è che... insomma non sono due semplici classi java server e 
client... qui ci hanno fatto un framework intero... e c'è pyton di mezzo... 
insomma non ci ho capito molto ma la cosa è troppo grossa... almeno credo... 
o no?
ora cercherò ancora e poi domani mattina me la devo vedere col prof e vedrò 
che dice lui...

La parte sincronizzata, il montor è data dalla classe che deve gestire
le coordinate dei giocatori.... l'accesso alle coordinate deve essere
esclusivo... cioè finche il server è impegnato a mandare le
coordianate attuali ai giocatori. i giocatori non possono inviare al
server nuovi spostamenti... (o almeno vengono ignorati mentre il
server è impegnato a inviare le coordinate a tutti i giocatori).
In pratica la classe che gestisce le coordinate dei giocatori sara un
MONITOR.... penso quindi che questo vada bene per il tuo progetto no? 
Attenzione!!! io ho detto SPOSTAMENTI non i tasti premuti ne , peggio
ancora, le coordinate calcolate LOCALMENTE dall'applet.... devi fare
in modo che se fai una modifica allo stato del tuo giocatore essa si
deve rifllettere anche agli altri giocatori e con possibilmente, la
stessa frequenza di aggiornamento!!! cioè deve essere il server a
calcolare e mantenere, le coordinate di ogni giocatore...
Prova ad immaginare questo caso: tu premi i tasti di direzione, sulla
tua schermata vedi il tuo giocatore spostarsi... ma i pacchetti che tu
invii al server vengono persi.... quindi tu occuperesti posizioni che
gli altri giocatori nn hanno modo di conoscere!!! 
Ovvio questo modello è molto semplice... di certo il professore ti
sapra indicare qualcosa di piu appropriato.... ma considerando il
fatto che questo è un programma semplice... credo proprio che vada
bene. 
Per l'udp nn c'è alcun problema... utilizzarlo è molto semplice
Basta che per inviare le info usi un array di interi o quello che ti
serve... e poi lo converti in array di byte creando cosi il pacchetto
udp.
Nel programma puoi usare un array di 3 byte:
                    il byte 0 indica l'operazione
SPOSTAMENTO/TERMINEGIOCO/
INIZIO PARTITA
i rimanenti due byte sono invece gli argomenti dell'operazione:
per mandare quindi al server la notifica che vuoi fare uno spostamento
vero la direzione (1,1) dovresti mandare il seguente array:
(SPOSTAMENTO,1,1)
ovviamente spostamento sara una costante definita sia nel server che
nel client.... 
Il problema è pero un altro... ora nn so se mi ricordo bene ma mi
sembra che le applet non accettino l'utilizzo di socket su protocollo
UDP.... dovresti guardare nella documentazione, ma mi sa proprio di
no.
Mi sa che ti devi creare delle applicazione stand alone anziche degli
applet... se ci pensi è meglio perche nel caso delle applet il server
web e il server del gioco devono risiedere sullo stesso host....
appunto per le limitazioni di sicurezza delle applet... cosa che
invece non avrai nel caso delle applicazioni
Scusami se sono stato troppo lungo... quand le dita partono chi le
ferma piu? ^_^
Spero di esserti stato di aiuto, poi fammi sapere
ciauz