18-09-2010, 01:57 PM
(Questo messaggio è stato modificato l'ultima volta il: 18-09-2010, 01:58 PM da Jonathan Archer.)
Finamente dopo 5 giorni di stress sono riuscito a capire il problema! Dato il vecchio codice:
[SPOILER]Set Window title "Star Wars Multiplayer"
Gosub ComandiOnline
REM IMPOSTAZIONI INIZIALI
Sync on : autocam off : set camera range 1,200000
REM ARRAY
Dim TimerColpi(2,19)
REM SPAZIO CIRCOSTANTE
Load image "Texture/Stelle.png",9999
Make object cube 9999,-200000
Texture object 9999,9999
REM X-WING
If ModelloTu$="Modelli/X-Wing/X-Wing.x"=1
REM TU SEI L'X-WING
Load object ModelloTu$,1
Yrotate object 1,90
Fix object pivot 1
REM IL CACCIA TIE é IL NEMICO
Load object ModelloNemico$,20
Position object 20,0,0,7000
Yrotate object 20,180
Position object 20,0,0,6700
else
REM TU SEI IL CACCIA TIE
Load object ModelloTu$,1
Position object 1,0,0,7000
Yrotate object 1,180
Position camera 0,0,6700 : REM PERCHé IL MODELLO POI SI ADEGUA ALLA POSIZIONE DELLA CINEPRESA
YRotate Camera 180
REM L'X-WING é IL TUO NEMICO
Load object ModelloNemico$,20
Yrotate object 20,90
Fix object pivot 20
Endif
ghost object on 1
RoolXWing#=0.3
PitchXWing#=0.2
REM CAMERA 1 DI PROVA
make camera 1
position camera 1,-600,0,6700
point camera 1,object position x(20),object position y(20),object position z(20)
set camera view 1,0,0,300,300
Dim Numero(2)
REM -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
do
Risultato = NET CONNECTED ()
Text 0,30,"Connesso? "+str$(Risultato)
REM COMANDI
Gosub COMANDARETU
Gosub ALLINEATUCONCINEPRESA
REM AUTOMATICI
Gosub MUOVILASERTU
Gosub CANCELLALASERTU
REM MANDA LA MIA POSIZIONE ALL'HOST/CLIENT
Gosub MANDAMIAPOSIZIONE
Gosub RICEVIPOSIZIONENEMICO
REM SISTEMARE LE VARIABILI
If Temporicarica=0=0 then dec temporicarica
text 0,0,str$(temporicarica)
sync
Loop
REM -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
REM COMANDARE IL TUO MODELLO
COMANDARETU:
if upkey()=1 then pitch camera up PitchXWing#
if downkey()=1 then pitch camera down PitchXWing#
if leftkey()=1 then roll camera left RoolXWing#
if rightkey()=1 then roll camera right RoolXWing#
if Inkey$()="q" then turn camera left RoolXWing#
if Inkey$()="e" then turn camera right RoolXWing#
if inkey$()="w" then move camera 3
if spacekey()=1
If temporicarica=0
x=0
Repeat
inc x
Until object exist(x)=0
If x=20=0
make object box x,10,0,100
color object x,rgb (255,0,0)
position object x,object position x(1),object position y(1),object position z(1)
xrotate object x,object angle x(1)
yrotate object x,object angle y(1)
zrotate object x,object angle z(1)
Temporicarica=200
Timercolpi(1,x)=5000
Endif
Endif
Endif
Return
REM ALLINEALA TUA CINEPRESA CON IL MODELLO
ALLINEATUCONCINEPRESA:
Position object 1,camera position x(),camera position y(),camera position z()
Xrotate object 1,Camera angle x()
Yrotate object 1,Camera angle y()
Zrotate object 1,Camera angle z()
Return
REM MUOVI LASER TUOI
MUOVILASERTU:
x=1
Repeat
inc x
if object exist(x)=1 then move object x,7
Until x=19
Return
REM CANCELLA I TUOI LASER
CANCELLALASERTU:
x=1
Repeat
inc x
if timerColpi(1,x)=0
If object exist(x)=1 then delete object x
else
dec timerColpi(1,x)
Endif
Until x=19
Return
REM MANDAMIAPOSIZIONE
MANDAMIAPOSIZIONE:
inc Numero(1)
NET PUT WORD (Numero(1))
Net Send
Text 0,10,"Numero Tuo: "+str$(Numero(1))
Return
REM CONTROLLA SE IL NEMICO TI HA MANDATO LA SUA POSIZIONE
RICEVIPOSIZIONENEMICO:
Risultato = net get message()
If Risultato=1
Numero(2) = NET GET WORD()
Text 0,20,"Numero Avversario: "+str$(Numero(2))
Text 0,40,"Ricevi? 1"
Endif
Return
REM COMANDI ONLINE
ComandiOnline:
Rem Controlla Windows Firewall
if net firewall enabled()
print "Windows Firewall e' attivo!"
if net firewall application enabled(appname$())
Print "Tuttavia e' gia' nella lista delle eccezioni"
else
Print "E non e' nella lista delle eccezioni"
endif
else
print "Windows Firewall e' disattivato!"
endif
Print "Premere un tasto per continuare..."
Wait key
Rem Menu di scelta
HostClient:
cls
Rem Scegli host/client
Print "Star Wars Multiplayer:"
Print
Print "1) Host"
Print "2) Client"
Print
Print "Inserisci un numero>"
Input a
Rem Hosti
if a=1
Set Window title "Ora sei Host!"
cls
Print "Inserisci il tuo ip> "
Input Ip$
Risultato = Net Host (2,Ip$)
If Risultato=0
Print "Server Fallito. Premi un tasto..."
wait key
end
Endif
ModelloTu$="Modelli/X-Wing/X-Wing.x"
ModelloNemico$="Modelli/Caccia Tie/Caccia Tie.x"
Print "In attesa di un giocatore..."
Repeat
Risultato = Net Player joined()
Until Risultato=1
cls
Center text (SCREEN WIDTH()/2),(SCREEN HEIGHT()/2),"Caricamento..."
wait 50
Return
Endif
Rem Partecipi
if a=2
Set Window title "Ora sei Client!"
cls
Input "Inserisci l'ip dell'host> ",Ip$
Risultato = Net Connect (Ip$)
If Risultato=1
cls
Center text (SCREEN WIDTH()/2),(SCREEN HEIGHT()/2),"Caricamento..."
wait 50
else
Print "Non sei riuscito a partecipare. Premi un tasto..."
wait key
end
Endif
ModelloTu$="Modelli/Caccia Tie/Caccia Tie.x"
ModelloNemico$="Modelli/X-Wing/X-Wing.x"
Return
Endif
rem Sbagli numero
if a=1=0 and a=2=0 then goto HostClient[/SPOILER]
Ebbene la soluzione sta nel codice in grassetto. Xkè ho pensato che nel protocollo TCP/IP L'host non è un giocatore qualunque ma è colui che gestisce e invia i dati a tutti i giocatori. Avendo visto il comando "Net Send All" che è un comando "Server Only" sono riuscito a capire e a confermare i miei sospetti! Il Codice va sostituito in questo modo.
[SPOILER]If ModelloTu$="Modelli/X-Wing/X-Wing.x"
Net Send All
else
Net Send
Endif[/SPOILER]
Perchè usare If? Perchè "Net send All" lo può utilizzare solo l'Host e il client non può utilizzarlo! Viceversa per "Net Send"
[SPOILER]Set Window title "Star Wars Multiplayer"
Gosub ComandiOnline
REM IMPOSTAZIONI INIZIALI
Sync on : autocam off : set camera range 1,200000
REM ARRAY
Dim TimerColpi(2,19)
REM SPAZIO CIRCOSTANTE
Load image "Texture/Stelle.png",9999
Make object cube 9999,-200000
Texture object 9999,9999
REM X-WING
If ModelloTu$="Modelli/X-Wing/X-Wing.x"=1
REM TU SEI L'X-WING
Load object ModelloTu$,1
Yrotate object 1,90
Fix object pivot 1
REM IL CACCIA TIE é IL NEMICO
Load object ModelloNemico$,20
Position object 20,0,0,7000
Yrotate object 20,180
Position object 20,0,0,6700
else
REM TU SEI IL CACCIA TIE
Load object ModelloTu$,1
Position object 1,0,0,7000
Yrotate object 1,180
Position camera 0,0,6700 : REM PERCHé IL MODELLO POI SI ADEGUA ALLA POSIZIONE DELLA CINEPRESA
YRotate Camera 180
REM L'X-WING é IL TUO NEMICO
Load object ModelloNemico$,20
Yrotate object 20,90
Fix object pivot 20
Endif
ghost object on 1
RoolXWing#=0.3
PitchXWing#=0.2
REM CAMERA 1 DI PROVA
make camera 1
position camera 1,-600,0,6700
point camera 1,object position x(20),object position y(20),object position z(20)
set camera view 1,0,0,300,300
Dim Numero(2)
REM -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
do
Risultato = NET CONNECTED ()
Text 0,30,"Connesso? "+str$(Risultato)
REM COMANDI
Gosub COMANDARETU
Gosub ALLINEATUCONCINEPRESA
REM AUTOMATICI
Gosub MUOVILASERTU
Gosub CANCELLALASERTU
REM MANDA LA MIA POSIZIONE ALL'HOST/CLIENT
Gosub MANDAMIAPOSIZIONE
Gosub RICEVIPOSIZIONENEMICO
REM SISTEMARE LE VARIABILI
If Temporicarica=0=0 then dec temporicarica
text 0,0,str$(temporicarica)
sync
Loop
REM -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
REM COMANDARE IL TUO MODELLO
COMANDARETU:
if upkey()=1 then pitch camera up PitchXWing#
if downkey()=1 then pitch camera down PitchXWing#
if leftkey()=1 then roll camera left RoolXWing#
if rightkey()=1 then roll camera right RoolXWing#
if Inkey$()="q" then turn camera left RoolXWing#
if Inkey$()="e" then turn camera right RoolXWing#
if inkey$()="w" then move camera 3
if spacekey()=1
If temporicarica=0
x=0
Repeat
inc x
Until object exist(x)=0
If x=20=0
make object box x,10,0,100
color object x,rgb (255,0,0)
position object x,object position x(1),object position y(1),object position z(1)
xrotate object x,object angle x(1)
yrotate object x,object angle y(1)
zrotate object x,object angle z(1)
Temporicarica=200
Timercolpi(1,x)=5000
Endif
Endif
Endif
Return
REM ALLINEALA TUA CINEPRESA CON IL MODELLO
ALLINEATUCONCINEPRESA:
Position object 1,camera position x(),camera position y(),camera position z()
Xrotate object 1,Camera angle x()
Yrotate object 1,Camera angle y()
Zrotate object 1,Camera angle z()
Return
REM MUOVI LASER TUOI
MUOVILASERTU:
x=1
Repeat
inc x
if object exist(x)=1 then move object x,7
Until x=19
Return
REM CANCELLA I TUOI LASER
CANCELLALASERTU:
x=1
Repeat
inc x
if timerColpi(1,x)=0
If object exist(x)=1 then delete object x
else
dec timerColpi(1,x)
Endif
Until x=19
Return
REM MANDAMIAPOSIZIONE
MANDAMIAPOSIZIONE:
inc Numero(1)
NET PUT WORD (Numero(1))
Net Send
Text 0,10,"Numero Tuo: "+str$(Numero(1))
Return
REM CONTROLLA SE IL NEMICO TI HA MANDATO LA SUA POSIZIONE
RICEVIPOSIZIONENEMICO:
Risultato = net get message()
If Risultato=1
Numero(2) = NET GET WORD()
Text 0,20,"Numero Avversario: "+str$(Numero(2))
Text 0,40,"Ricevi? 1"
Endif
Return
REM COMANDI ONLINE
ComandiOnline:
Rem Controlla Windows Firewall
if net firewall enabled()
print "Windows Firewall e' attivo!"
if net firewall application enabled(appname$())
Print "Tuttavia e' gia' nella lista delle eccezioni"
else
Print "E non e' nella lista delle eccezioni"
endif
else
print "Windows Firewall e' disattivato!"
endif
Print "Premere un tasto per continuare..."
Wait key
Rem Menu di scelta
HostClient:
cls
Rem Scegli host/client
Print "Star Wars Multiplayer:"
Print "1) Host"
Print "2) Client"
Print "Inserisci un numero>"
Input a
Rem Hosti
if a=1
Set Window title "Ora sei Host!"
cls
Print "Inserisci il tuo ip> "
Input Ip$
Risultato = Net Host (2,Ip$)
If Risultato=0
Print "Server Fallito. Premi un tasto..."
wait key
end
Endif
ModelloTu$="Modelli/X-Wing/X-Wing.x"
ModelloNemico$="Modelli/Caccia Tie/Caccia Tie.x"
Print "In attesa di un giocatore..."
Repeat
Risultato = Net Player joined()
Until Risultato=1
cls
Center text (SCREEN WIDTH()/2),(SCREEN HEIGHT()/2),"Caricamento..."
wait 50
Return
Endif
Rem Partecipi
if a=2
Set Window title "Ora sei Client!"
cls
Input "Inserisci l'ip dell'host> ",Ip$
Risultato = Net Connect (Ip$)
If Risultato=1
cls
Center text (SCREEN WIDTH()/2),(SCREEN HEIGHT()/2),"Caricamento..."
wait 50
else
Print "Non sei riuscito a partecipare. Premi un tasto..."
wait key
end
Endif
ModelloTu$="Modelli/Caccia Tie/Caccia Tie.x"
ModelloNemico$="Modelli/X-Wing/X-Wing.x"
Return
Endif
rem Sbagli numero
if a=1=0 and a=2=0 then goto HostClient[/SPOILER]
Ebbene la soluzione sta nel codice in grassetto. Xkè ho pensato che nel protocollo TCP/IP L'host non è un giocatore qualunque ma è colui che gestisce e invia i dati a tutti i giocatori. Avendo visto il comando "Net Send All" che è un comando "Server Only" sono riuscito a capire e a confermare i miei sospetti! Il Codice va sostituito in questo modo.
[SPOILER]If ModelloTu$="Modelli/X-Wing/X-Wing.x"
Net Send All
else
Net Send
Endif[/SPOILER]
Perchè usare If? Perchè "Net send All" lo può utilizzare solo l'Host e il client non può utilizzarlo! Viceversa per "Net Send"