naputtelija wrote:Toimiiko tuo coolbasicin SaveGame tämän kanssa ihan normaalisti? Eli ideana olisi se, että uuden clientin tullessa linjoille sen lähettämä ID tarkastetaan ja jos se on uusi, sama clientin ID tallennetaan serverin puolelle ja peli tallennetaan. Jos se on taas vanha, serveri antaa oman pelitilanteensa takaisin. Entä onko tälle minun idealleni jotain käytännöllisempää ratkaisua?
Kuten Viltzu sanoi, SaveGame on on todella epäkäytännöllinen eikä sitä kannata käyttää missään isohkommassa projektissa. Ei varsinkaan sellaisessa, jossa cbNetwork on osallisena.
Mutta niin, periaate siitä että ID tallennettaisiin johonkin ja sitten sitä verrattaisiin myöhemmin tarkistettaessa että onko client sama, toimii vissiinkin vain silloin kun palvelinta eikä clienttiä ole sammutettu. Muistaakseni client saa ID:n palvelimelta silloin, kun se ensimmäistä kertaa yhdistää palvelimeen. Sitten client voi katkaista yhteyden ja yhdistää uudelleen sammuttamatta ohjelmaa ja saa saman ID:n uudelleen. Mutta mikäli client sammuttaa ohjelman, ei samaa ID:tä tule vaan palvelin tarjoaa clientille uuden ID:n.
Voin olla väärässäkin siitä, että uusi ID tarjottaisiin, jos client on sammutettu välissä. Voi olla, että palvelin antaa clientille aina saman ID:n, kunhan palvelinta ei ole clientin yhdistelyiden välissä sammuteltu. Se ainakin on varmaa, että ID:t eivät pysy samoina jos palvelin sammutetaan ja käynnistetään uudelleen.
Tuon idean voisi ehkä toteuttaa sillä tavalla, että teet palvelimen puolelle jokaiselle clientille omalla algoritmillasi jonkin tunnistamis-ID:n. Kun uusi, tuntematon client yhdistää palvelimelle, palvelin lähettää tuon tunnistus-ID:n clientille joka tallentaa sen. Kun client seuraavan kerran yhdistää palvelimelle, lähettää se yhdistyksen yhteydessä tuon tunnistus-ID:n ja palvelin huomaa sen olevan jo entuudestaan tunnettu. Tällöin palvelin voi lähettää pelin sen hetken tilanteen clientille.
## Client yhdistää palvelimelle ensimmäistä kertaa ##
1. Client lähettää login-paketin
- login-paketti sisältää tyhjän tunnistus-ID:n
2. Palvelin vastaanottaa login-paketin
- huomaa että tunnistus-ID on tyhjä
3. Palvelin generoi uuden tunnistus-ID:n
4. Palvelin lähettää tavaraa
- generoitu tunnistus-ID
- pelin alun tilanne
5. Client vastaanottaa tavaraa
- tunnistus-ID
- pelin alun tilanne
6. Client tallentaa tunnistus-ID:n johonkin tiedostoon
7. Client pelaa...
....
....
8. Client katkaisee yhteyden. Lähettää lopetuspaketin.
9. Palvelin vastaanottaa lopetuspaketin.
10. Palvelin tallentaa clientin pelin tiedoston johonkin tiedostoon
ja/tai tallentaa sen muistiin.
11. Palvelin poistaa clientin listaltaan.
## Client yhdistää palvelimelle, jolla on jo ollut aikaisemmin ##
1. Client lukee tiedostosta oman tunnistus-ID:nsä
2. Client lähettää login-paketin
- login-paketti sisältää tunnistus-ID:n
3. Palvelin vastaanottaa login-paketin
- huomaa ettei tunnistus-ID ole tyhjä
4. Palvelin etsii, onko tunnistus-ID jo entuudestaan olemassa
- löytää vastaavuuden
5. Palvelin lukee muistista/tiedostosta clientin viimekertaisen pelitilanteen
6. Palvelin lähettää tavaraa
- jokin tieto siitä, että client on tuttu ja tulossa on pelitietoa
* Voi olla myös tunnistus-ID, joka on sama kuin clientilla,
jonka perusteella client huomaa että palvelin on todennut
pelaajan olevan tuttu. Näin client osaa odottaa pelitietoa.
- pelin tilanne silloin, kun client viimeksi lopetti
7. Client vastaanottaa tiedot
- huomaa että palvelin tunnisti pelaajan
- asettaa pelin tilanteen siihen, mitä palvelin antoi tietona
8. Client pelaa...
....
....
9. Client katkaisee yhteyden. Lähettää lopetuspaketin.
10. Palvelin vastaanottaa lopetuspaketin.
11. Palvelin tallentaa clientin pelin tiedoston johonkin tiedostoon
ja/tai tallentaa sen muistiin.
12. Palvelin poistaa clientin listaltaan.
EDIT: Oman algoritmin etuihin kuuluu myös se, että jos clientin IP-osoite vaihtuu, voi palvelin silti tunnistaa clientin samaksi. Idea voi laajeta jopa niin pitkälle, että clientin tunnistus-ID:n voi antaa myös kaverille ja hän pääsee pelaamaan sinun peliäsi. Kuitenkaan useammalla kuin yhdelllä pelaajalle ei voi olla samanaikaisesti sama tunnistus-ID, muutoin pelin lopetuksen yhteydessä tallennustilanne voisi mennä sekaisin.
Re: CoolBasic & netti = cbNetwork
Posted: Fri Oct 14, 2011 12:05 pm
by naputtelija koulussa
Juu tein siis oman id:n että kun clientti yhdistää ekan kerran se arpoo ID:n itselleen 10 miljardista vaihtoehdosta, tallentaa sen omaan kryptattuun tiedostoonsa, lähettää sen servulle joka luo sitten oman tiedoston kyseiselle id:lle ja tallentaa siihen koordinaatit, kulman ja kaikki muut kamat. Sitten toisella kerralla clientti pääsee käsiksi siihen serverin tiedostoon ja renderöi sen pohjalta itsensä ja kaikki muut muina ukkoina, jotka näkyvät ympärillä. Eli:
1. Client a painaa nappia ylös.
2. Client b painaa nappia alas
3. Molemmat napinpainallukset lähetetään servulle
4. Joka lähettää uudet koordinaatit joka clientille
5. Jos vastaanotettu on oma id, se renderöi oman ohjattavan ukon.
6. Jos on joku muu, se renderöi sen muualle.
7. Complete multi-client peli!
Re: CoolBasic & netti = cbNetwork
Posted: Sat Oct 15, 2011 12:23 pm
by naputtelija
Kysyisin onko tässä koodissa kaikki kohdallaan (olenko unohtanu mitään tärkeää)
Include "cbNetwork.cb"
Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION = 254
Const INFO_GET_PLAYERLIST = 253
Const INFO_MOVING = 252
Const INFO_GIVE_ID = 251
Const INFO_NUM_OF_CLIENTS = 250
Const INFO_SENDING_COORDS = 249
Const INFO_SENDING_IDS = 248
Type UKOT
Field obj
Field id
End Type
Dim cli (27)
FrameLimit 40 'rajoita pelin toimintanopeutta
ukko = LoadObject("Media\guy.bmp", 72)
If Not FileExists("localdata") Then MakeDir "localdata"
If Not FileExists("localdata") Then MakeError "creating localdata-folder failed."
ChDir "localdata"
StartSearch
file$=FindFile()
If file="" Then
f=OpenToWrite("id")
id=Rand(1,10000000000)
WriteInt f,id
CloseFile f
EndIf
If file<>"" Then
f=OpenToRead("id")
id=ReadInt(f)
CloseFile f
EndIf
EndSearch
ClsColor cbWhite
masterukko=LoadObject("ukko.bmp")
InitClient("local",1234,1000)
_Net_InitMemBlock()
_Net_PutByte(INFO_STARTING_CONNECTION)
_Net_PutByte(id)
ClientSend()
Repeat
rtn = ClientRead()
If rtn = 0 Then
_Net_GetInt()
infoByte = _Net_GetByte()
EndIf
If infobyte=INFO_NUM_OF_CLIENTS Then
numoc=_Net_GetInt()
For i=1 To numoc
ukko.UKOT=New(UKOT)
ukko\obj=CloneObject(masterukko)
Next i
EndIf
If infobyte=INFO_SENDING_IDS Then
For ukko.UKOT = Each UKOT
count=count+1
tempid=_Net_GetInt()
If ukko\id=0 Then ukko\id=tempid
cli(count)=tempid
Next ukko
count=0
EndIf
If infobyte=INFO_SENDING_COORDS() Then
For ukko.UKOT = Each UKOT
id2=_Net_GetInt()
If id2=id Then
PositionObject ukko\obj,_Net_GetInt(),_Net_GetInt()
RotateObject ukko\obj,_Net_GetInt()
CloneCameraPosition ukko\obj
Else
PositionObject ukko\obj,_Net_GetInt(),_Net_GetInt()
RotateObject ukko\obj,_net_GetInt()
EndIf
PositionObject ukko\obj,
Next ukko
EndIf
If LeftKey() Then turnplus=5
If RightKey() Then turnplus=-5
If UpKey() Then moveplus=2
If DownKey() Then moveplus=-2
_NetInitMemBlock()
_Net_PutByte(INFO_MOVING)
_Net_PutInt(id)
_Net_PutByte(moveplus)
_Net_PutByte(turnplus)
ClientSend()
DrawScreen
Forever
Include "cbNetwork.cb"
Dim rtn As integer
Type CLIENTS
Field id
Field obj
Field status As Byte
End Type
masterukko=LoadObject("clients/masterukko.bmp",360)
Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION = 254
Const INFO_GET_PLAYERLIST = 253
Const INFO_MOVING = 252
Const INFO_GIVE_ID = 251
Const INFO_NUM_OF_CLIENTS = 250
Const INFO_SENDING_COORDS = 249
Const INFO_SENDING_IDS = 248
If Not FileExists("clients") Then MakeDir "clients"
If Not FileExists("clients") Then MakeError "creating clients-folder failed."
ChDir "clients"
InitServer(1234,1000)
LoadClients()
Repeat
SendClients()
SendIds()
rtn = ServerRead()
If rtn = 0 Then
_Net_GetInt()
infoByte = _Net_GetByte()
EndIf
If infobyte=INFO_STARTING_CONNECTION Then
tempid=_Net_GetInt() //otetaan talteen ID
tempidstr=Str(tempid) //tehdään siitä merkkijono
ChDir "clients" //työkansio: clients
StartSearch //etsitään vastaavuuksia
Repeat
currentfile$=FindFile() //otetaan talteen nyk. tiedosto
If currentfile=tempidstr Then //Löytyi!
EndIf
If currentfile="" Then //ei löytynyt.
newclient(tempid)
EndIf
Forever
EndSearch
EndIf
If infobyte=INFO_MOVING Then sendstuff()
Forever
Function LoadClients()
StartSearch
Repeat
file$=FindFile()
If file="" Then Exit
f=OpenToRead(file)
client.CLIENTS = New(CLIENTS)
client\id=Int(file)
client\obj=CloneObject(masterukko)
PositionObject client\obj,ReadInt(f),ReadInt(f)
RotateObject client\obj,ReadInt(f)
CloseFile f
Forever
EndSearch
End Function
Function newclient(ident)
client.CLIENTS = New(CLIENTS)
client\id=ident
client\status=True
client\obj=CloneObject(masterukko)
f=OpenToWrite(Str(client\id))
WriteInt f,ObjectX(client\obj)
WriteInt f,ObjectY(client\obj)
WriteInt f,ObjectAngle(client\obj)
CloseFile f
End Function
Function sendstuff()
id=_Net_GetInt()
For client.CLIENTS = Each CLIENTS
If client\id=id Then
MoveObject client\obj,_Net_GetByte()
TurnObject client\obj,_Net_GetByte()
_Net_InitMemBlock()
_Net_PutByte(INFO_SENDING_COORDS)
_Net_PutInt(client\id)
_Net_PutInt(ObjectX(client\obj))
_Net_PutInt(ObjectY(client\obj))
_Net_PutInt(ObjectAngle(client\obj))
f=OpenToWrite(Str(client\id))
WriteInt f,ObjectX(client\obj)
WriteInt f,ObjectY(client\obj)
WriteInt f,ObjectAngle(client\obj)
CloseFile f
EndIf
Next client
ServerSend()
End Function
Function SendClients()
For client.CLIENTS = Each CLIENTS
count=count+1
Next client
_Net_InitMemBlock()
_Net_PutByte(INFO_NUM_OF_CLIENTS)
ServerSend()
End Function
Function SendIds()
_Net_InitMemBlock
_Net_PutByte(INFO_SENDING_IDS)
For client.CLIENTS = Each CLIENTS
_Net_PutInt(client\id)
Next client
ServerSend()
End Function
EDIT:
Hups väärä koodi
EDIT:
Muutaman muokkauksen jälkeen käynnistin serverin mutta se ei suostunut käynnistymään! Mikä avuksi?
Re: CoolBasic & netti = cbNetwork
Posted: Sat Oct 15, 2011 2:36 pm
by valscion
Koodissa kommentointi ei olisi pahitteeksi...
Ainakin se on ongelmana clientin puolella, että annat heti aluksi InitClient-funktiolle väärän osoitteen. Ei ole olemassa sellaista osoitetta kuin "local" mutta "localhost" on.
EDIT: Lataat clientin puolella muuttujaan "ukko" objektin, mutta yrität käyttää syntaksia "ukko.UKOT = New(UKOT)" ja kääntäjä herjaa. Käytä jotain muuta nimeä tyypin instansseille kuin "ukko", esim. "iUkko.UKOT" tai vastaava.
EDIT2: Ja pari kohtaa sulla on ihan väärällä syntaksilla. "PositionObject ukko\obj," ??? mitäs tuon koodinrivin clientin puolella pitäisi tehdä? Ja palvelimen puolella oli SendIds()-funktiossa "_Net_InitMemBlock", kun tarkoitit varmaankin kutsua funktiota, eli "_Net_InitMemBlock()". Myös clientin puolella olit kirjoittanut "_NetInitMemBlock()". Myös ongelmana "If infobyte=INFO_SENDING_COORDS()" kun tarkoitit varmaan "If infobyte=INFO_SENDING_COORDS". Sekä sinulla oli client-puolella Rand()-funktiossa liian suuri luku ja se aiheutti overflown CB:n kääntäjässä. Poistin parit nollat perästä ja se kääntyy viimeinkin.
Testaisit edes että koodisi kääntyy kun laitat sen tänne...
EDIT3: Huhhuh, että pistät sitten auttajat vielä fiksaamaan koodisi käyttämään oletusmediaa, koska et jaksanut omaa koodiasi muuttaa / jakaa kuvatiedostoja...
EDIT4: Koodisi on sen verran kommentoimatonta ja epäselvästi rakennettua (et hoida nettiliikennettä samalla tavalla kuin chattiesimerkissä tai NetMatchissa), en ehkä jaksa auttaa. Sain koodit kääntymään ja toimimaan, mutta kun client yhdisti palvelimelle, kaatui homma MAViin. Tässä minun muokkaamani koodinpätkät:
//server.cb
Include "cbNetwork.cb"
Dim rtn As integer
Type CLIENTS
Field id
Field obj
Field status As Byte
End Type
masterukko=LoadObject("Media\ukkeli.bmp",360)
Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION = 254
Const INFO_GET_PLAYERLIST = 253
Const INFO_MOVING = 252
Const INFO_GIVE_ID = 251
Const INFO_NUM_OF_CLIENTS = 250
Const INFO_SENDING_COORDS = 249
Const INFO_SENDING_IDS = 248
If Not FileExists("clients") Then MakeDir "clients"
If Not FileExists("clients") Then MakeError "creating clients-folder failed."
ChDir "clients"
InitServer(1234,1000)
LoadClients()
Repeat
SendClients()
SendIds()
rtn = ServerRead()
If rtn = 0 Then
_Net_GetInt()
infoByte = _Net_GetByte()
EndIf
If infobyte=INFO_STARTING_CONNECTION Then
tempid=_Net_GetInt() //otetaan talteen ID
tempidstr=Str(tempid) //tehdään siitä merkkijono
ChDir "clients" //työkansio: clients
StartSearch //etsitään vastaavuuksia
Repeat
currentfile$=FindFile() //otetaan talteen nyk. tiedosto
If currentfile=tempidstr Then //Löytyi!
EndIf
If currentfile="" Then //ei löytynyt.
newclient(tempid)
EndIf
Forever
EndSearch
EndIf
If infobyte=INFO_MOVING Then sendstuff()
Forever
Function LoadClients()
StartSearch
Repeat
file$=FindFile()
If file="" Then Exit
If Not IsDirectory(file) Then
f=OpenToRead(file)
client.CLIENTS = New(CLIENTS)
client\id=Int(file)
client\obj=CloneObject(masterukko)
PositionObject client\obj,ReadInt(f),ReadInt(f)
RotateObject client\obj,ReadInt(f)
CloseFile f
EndIf
Forever
EndSearch
End Function
Function newclient(ident)
client.CLIENTS = New(CLIENTS)
client\id=ident
client\status=True
client\obj=CloneObject(masterukko)
f=OpenToWrite(Str(client\id))
WriteInt f,ObjectX(client\obj)
WriteInt f,ObjectY(client\obj)
WriteInt f,ObjectAngle(client\obj)
CloseFile f
End Function
Function sendstuff()
id=_Net_GetInt()
For client.CLIENTS = Each CLIENTS
If client\id=id Then
MoveObject client\obj,_Net_GetByte()
TurnObject client\obj,_Net_GetByte()
_Net_InitMemBlock()
_Net_PutByte(INFO_SENDING_COORDS)
_Net_PutInt(client\id)
_Net_PutInt(ObjectX(client\obj))
_Net_PutInt(ObjectY(client\obj))
_Net_PutInt(ObjectAngle(client\obj))
f=OpenToWrite(Str(client\id))
WriteInt f,ObjectX(client\obj)
WriteInt f,ObjectY(client\obj)
WriteInt f,ObjectAngle(client\obj)
CloseFile f
EndIf
Next client
ServerSend()
End Function
Function SendClients()
For client.CLIENTS = Each CLIENTS
count=count+1
Next client
_Net_InitMemBlock()
_Net_PutByte(INFO_NUM_OF_CLIENTS)
ServerSend()
End Function
Function SendIds()
_Net_InitMemBlock()
_Net_PutByte(INFO_SENDING_IDS)
For client.CLIENTS = Each CLIENTS
_Net_PutInt(client\id)
Next client
ServerSend()
End Function
//client.cb
Include "cbNetwork.cb"
Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION = 254
Const INFO_GET_PLAYERLIST = 253
Const INFO_MOVING = 252
Const INFO_GIVE_ID = 251
Const INFO_NUM_OF_CLIENTS = 250
Const INFO_SENDING_COORDS = 249
Const INFO_SENDING_IDS = 248
Type UKOT
Field obj
Field id
End Type
Dim cli(27)
FrameLimit 40 'rajoita pelin toimintanopeutta
ukko = LoadObject("Media\guy.bmp", 72)
If Not FileExists("localdata") Then MakeDir "localdata"
If Not FileExists("localdata") Then MakeError "creating localdata-folder failed."
ChDir "localdata"
StartSearch
file$=FindFile()
If file="" Then
f=OpenToWrite("id")
id=Rand(1,100000000)
WriteInt f,id
CloseFile f
ElseIf Not IsDirectory(file) Then
f=OpenToRead("id")
id=ReadInt(f)
CloseFile f
EndIf
EndSearch
ClsColor cbWhite
masterukko=LoadObject("..\Media\ukkeli.bmp")
InitClient("localhost",1234,1000)
_Net_InitMemBlock()
_Net_PutByte(INFO_STARTING_CONNECTION)
_Net_PutByte(id)
ClientSend()
Repeat
rtn = ClientRead()
If rtn = 0 Then
_Net_GetInt()
infoByte = _Net_GetByte()
EndIf
If infobyte=INFO_NUM_OF_CLIENTS Then
numoc=_Net_GetInt()
For i=1 To numoc
iUkko.UKOT=New(UKOT)
iUkko\obj=CloneObject(masterukko)
Next i
EndIf
If infobyte=INFO_SENDING_IDS Then
For iUkko.UKOT = Each UKOT
count=count+1
tempid=_Net_GetInt()
If iUkko\id=0 Then iUkko\id=tempid
cli(count)=tempid
Next iUkko
count=0
EndIf
If infobyte=INFO_SENDING_COORDS Then
For iUkko.UKOT = Each UKOT
id2=_Net_GetInt()
If id2=id Then
PositionObject iUkko\obj,_Net_GetInt(),_Net_GetInt()
RotateObject iUkko\obj,_Net_GetInt()
CloneCameraPosition iUkko\obj
Else
PositionObject iUkko\obj,_Net_GetInt(),_Net_GetInt()
RotateObject iUkko\obj,_net_GetInt()
EndIf
'PositionObject iUkko\obj,
Next iUkko
EndIf
If LeftKey() Then turnplus=5
If RightKey() Then turnplus=-5
If UpKey() Then moveplus=2
If DownKey() Then moveplus=-2
_Net_InitMemBlock()
_Net_PutByte(INFO_MOVING)
_Net_PutInt(id)
_Net_PutByte(moveplus)
_Net_PutByte(turnplus)
ClientSend()
DrawScreen
Forever
EDIT5: Palvelimen puolella vaihdat kansiota repeat-silmukassa If-lausekkeen sisällä mutta et vaihda takaisin yläkansioon. Näin palvelin ajautuu jossain vaiheessa yrittämään väärään kansioon.
If infobyte=INFO_STARTING_CONNECTION Then
tempid=_Net_GetInt() //otetaan talteen ID
tempidstr=Str(tempid) //tehdään siitä merkkijono
ChDir "clients" //työkansio: clients
StartSearch //etsitään vastaavuuksia
Repeat
currentfile$=FindFile() //otetaan talteen nyk. tiedosto
If currentfile=tempidstr Then //Löytyi!
EndIf
If currentfile="" Then //ei löytynyt.
newclient(tempid)
EndIf
Forever
EndSearch
EndIf
EDIT6: Kun korjasin tuon edellisen kohdan lisäämällä EndSearchin jälkeen rivin ChDir "..", toimi palvelin MAVittamatta. Mutta client lagaa armottomasti ja syy johtuu ClientSend:n jatkuvasta aikakatkaisusta (timeoutista).
EDIT7: Lähetä aina jonkinmoinen lopetustavu clientin ja palvelimen puolella, kun dataa ei enää tule. Näin palvelin/client tietää lopettaa lukemisen oikeassa kohdassa.
EDIT8: Et voi tietää, onko clientin ja palvelimen puolella sama määrä tyypin jäseniä varmasti. Lähetä palvelimen puolella ensin tulevien ukkojen ID:den määrä ja sen jälkeen lue dataa vastaavasti.
If infobyte=INFO_SENDING_IDS Then
For iUkko.UKOT = Each UKOT
count=count+1
tempid=_Net_GetInt()
If iUkko\id=0 Then iUkko\id=tempid
cli(count)=tempid
Next iUkko
count=0
EndIf
EDIT9: Liikaa virheitä. Järjestä clientin ja palvelimen puolella nettiliikenne selkeästi lähetykseen ja lukemiseen. Käytä clientin puolella mielummin ClientSendBack-funktiota, niin pelisi ei lagaa vaikka nettiyhteys on hidas. Ota mallia chattiesimerkistä ja NetMatchista. Minä en enää jaksa yrittää auttaa.
Re: CoolBasic & netti = cbNetwork
Posted: Sat Oct 15, 2011 3:31 pm
by naputtelija
VesQ wrote:Koodissa kommentointi ei olisi pahitteeksi...
Ainakin se on ongelmana clientin puolella, että annat heti aluksi InitClient-funktiolle väärän osoitteen. Ei ole olemassa sellaista osoitetta kuin "local" mutta "localhost" on.
EDIT: Lataat clientin puolella muuttujaan "ukko" objektin, mutta yrität käyttää syntaksia "ukko.UKOT = New(UKOT)" ja kääntäjä herjaa. Käytä jotain muuta nimeä tyypin instansseille kuin "ukko", esim. "iUkko.UKOT" tai vastaava.
EDIT2: Ja pari kohtaa sulla on ihan väärällä syntaksilla. "PositionObject ukko\obj," ??? mitäs tuon koodinrivin clientin puolella pitäisi tehdä? Ja palvelimen puolella oli SendIds()-funktiossa "_Net_InitMemBlock", kun tarkoitit varmaankin kutsua funktiota, eli "_Net_InitMemBlock()". Myös clientin puolella olit kirjoittanut "_NetInitMemBlock()". Myös ongelmana "If infobyte=INFO_SENDING_COORDS()" kun tarkoitit varmaan "If infobyte=INFO_SENDING_COORDS". Sekä sinulla oli client-puolella Rand()-funktiossa liian suuri luku ja se aiheutti overflown CB:n kääntäjässä. Poistin parit nollat perästä ja se kääntyy viimeinkin.
Testaisit edes että koodisi kääntyy kun laitat sen tänne...
EDIT3: Huhhuh, että pistät sitten auttajat vielä fiksaamaan koodisi käyttämään oletusmediaa, koska et jaksanut omaa koodiasi muuttaa / jakaa kuvatiedostoja...
EDIT4: Koodisi on sen verran kommentoimatonta ja epäselvästi rakennettua (et hoida nettiliikennettä samalla tavalla kuin chattiesimerkissä tai NetMatchissa), en ehkä jaksa auttaa. Sain koodit kääntymään ja toimimaan, mutta kun client yhdisti palvelimelle, kaatui homma MAViin. Tässä minun muokkaamani koodinpätkät:
EDIT5: Palvelimen puolella vaihdat kansiota repeat-silmukassa If-lausekkeen sisällä mutta et vaihda takaisin yläkansioon. Näin palvelin ajautuu jossain vaiheessa yrittämään väärään kansioon.
If infobyte=INFO_STARTING_CONNECTION Then
tempid=_Net_GetInt() //otetaan talteen ID
tempidstr=Str(tempid) //tehdään siitä merkkijono
ChDir "clients" //työkansio: clients
StartSearch //etsitään vastaavuuksia
Repeat
currentfile$=FindFile() //otetaan talteen nyk. tiedosto
If currentfile=tempidstr Then //Löytyi!
EndIf
If currentfile="" Then //ei löytynyt.
newclient(tempid)
EndIf
Forever
EndSearch
EndIf
EDIT6: Kun korjasin tuon edellisen kohdan lisäämällä EndSearchin jälkeen rivin ChDir "..", toimi palvelin MAVittamatta. Mutta client lagaa armottomasti ja syy johtuu ClientSend:n jatkuvasta aikakatkaisusta (timeoutista).
EDIT7: Lähetä aina jonkinmoinen lopetustavu clientin ja palvelimen puolella, kun dataa ei enää tule. Näin palvelin/client tietää lopettaa lukemisen oikeassa kohdassa.
EDIT8: Et voi tietää, onko clientin ja palvelimen puolella sama määrä tyypin jäseniä varmasti. Lähetä palvelimen puolella ensin tulevien ukkojen ID:den määrä ja sen jälkeen lue dataa vastaavasti.
If infobyte=INFO_SENDING_IDS Then
For iUkko.UKOT = Each UKOT
count=count+1
tempid=_Net_GetInt()
If iUkko\id=0 Then iUkko\id=tempid
cli(count)=tempid
Next iUkko
count=0
EndIf
EDIT9: Liikaa virheitä. Järjestä clientin ja palvelimen puolella nettiliikenne selkeästi lähetykseen ja lukemiseen. Käytä clientin puolella mielummin ClientSendBack-funktiota, niin pelisi ei lagaa vaikka nettiyhteys on hidas. Ota mallia chattiesimerkistä ja NetMatchista. Minä en enää jaksa yrittää auttaa.
Include "cbNetwork.cb"
Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION = 254
Const INFO_GET_PLAYERLIST = 253
Const INFO_MOVING = 252
Const INFO_GIVE_ID = 251
Const INFO_NUM_OF_CLIENTS = 250
Const INFO_SENDING_COORDS = 249
Const INFO_SENDING_IDS = 248
Type UKOT
Field obj
Field id
End Type
Dim cli (27)
FrameLimit 40 'rajoita pelin toimintanopeutta
masterukko = LoadObject("localdata\guy.bmp", 72)
If Not FileExists("localdata") Then MakeDir "localdata"
If Not FileExists("localdata") Then MakeError "creating localdata-folder failed."
ChDir "localdata"
StartSearch
Repeat
file$=FindFile()
If file<>"id" Then
f=OpenToWrite("id")
id=Rand(1,2147483647)
WriteInt f,id
CloseFile f
Exit
EndIf
If file="id" And file<>"guy.bmp" Then
f=OpenToRead("id")
id=ReadInt(f)
CloseFile f
Exit
EndIf
Forever
EndSearch
ClsColor cbWhite
Color cbBlack
InitClient("localhost",1234)
_Net_InitMemBlock()
_Net_PutByte(INFO_STARTING_CONNECTION)
_Net_PutByte(id)
ClientSendBack()
Repeat
rtn = ClientRead()
If rtn = 0 Then
_Net_GetInt()
infoByte = _Net_GetByte()
EndIf
If infobyte=INFO_NUM_OF_CLIENTS Then
numoc=_Net_GetInt()
For i=1 To numoc
ukko.UKOT=New(UKOT)
ukko\obj=CloneObject(masterukko)
Next i
EndIf
If infobyte=INFO_SENDING_IDS Then
For ukko.UKOT = Each UKOT
count=count+1
tempid=_Net_GetInt()
If ukko\id=0 Then ukko\id=tempid
cli(count)=tempid
Next ukko
count=0
EndIf
If infobyte=INFO_SENDING_COORDS Then
For ukko.UKOT = Each UKOT
id2=_Net_GetInt()
If id2=id Then
PositionObject ukko\obj,_Net_GetInt(),_Net_GetInt()
RotateObject ukko\obj,_Net_GetInt()
CloneCameraPosition ukko\obj
Else
PositionObject ukko\obj,_Net_GetInt(),_Net_GetInt()
RotateObject ukko\obj,_net_GetInt()
EndIf
Next ukko
EndIf
If LeftKey() Then turnplus=5
If RightKey() Then turnplus=-5
If UpKey() Then moveplus=2
If DownKey() Then moveplus=-2
_Net_InitMemBlock()
_Net_PutByte(INFO_MOVING)
_Net_PutInt(id)
_Net_PutByte(moveplus)
_Net_PutByte(turnplus)
ClientSendBack()
If KeyDown(cbKeyEsc) Then shutdown()
Text 0,0,FPS()
Text 0,20,infobyte
DrawScreen
Forever
Function shutdown()
For ukko.UKOT=Each UKOT
DeleteObject ukko\obj
Delete ukko
Next ukko
End
End Function
Include "cbNetwork.cb"
Dim rtn As integer
Type CLIENTS
Field id
Field obj
Field status As Byte
End Type
SAFEEXIT OFF
masterukko=LoadObject("clients/masterukko.bmp",360)
Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION = 254
Const INFO_GET_PLAYERLIST = 253
Const INFO_MOVING = 252
Const INFO_GIVE_ID = 251
Const INFO_NUM_OF_CLIENTS = 250
Const INFO_SENDING_COORDS = 249
Const INFO_SENDING_IDS = 248
If Not FileExists("clients") Then MakeDir "clients"
If Not FileExists("clients") Then MakeError "creating clients-folder failed."
InitServer(1234)
LoadClients()
Repeat
SendClients()
SendIds()
rtn = ServerRead()
If rtn = 0 Then
_Net_GetInt()
infoByte = _Net_GetByte()
EndIf
If infobyte=INFO_STARTING_CONNECTION Then
tempid=_Net_GetInt() //otetaan talteen ID
tempidstr=Str(tempid) //tehdään siitä merkkijono //työkansio: clients
ChDir "clients"
StartSearch //etsitään vastaavuuksia
Repeat
currentfile$=FindFile() //otetaan talteen nyk. tiedosto
If currentfile=tempidstr Then //Löytyi!
EndIf
If currentfile="" Then //ei löytynyt.
newclient(tempid)
EndIf
Forever
EndSearch
ChDir ".."
EndIf
If infobyte=INFO_MOVING Then sendstuff()
If KeyDown (cbKeyEsc) Then shutdown()
Text 0,0,FPS()
DrawScreen
Forever
Function LoadClients()
StartSearch
Repeat
file$=FindFile()
If file="" Then Exit
If file="masterukko.bmp" Then Goto ignore
f=OpenToRead(file)
client.CLIENTS = New(CLIENTS)
client\id=Int(file)
client\obj=CloneObject(masterukko)
PositionObject client\obj,ReadInt(f),ReadInt(f)
RotateObject client\obj,ReadInt(f)
CloseFile f
ignore:
Forever
EndSearch
End Function
Function newclient(ident)
client.CLIENTS = New(CLIENTS)
client\id=ident
client\status=True
client\obj=CloneObject(masterukko)
f=OpenToWrite(Str(client\id))
WriteInt f,ObjectX(client\obj)
WriteInt f,ObjectY(client\obj)
WriteInt f,ObjectAngle(client\obj)
CloseFile f
End Function
Function sendstuff()
id=_Net_GetInt()
For client.CLIENTS = Each CLIENTS
If client\id=id Then
MoveObject client\obj,_Net_GetByte()
TurnObject client\obj,_Net_GetByte()
_Net_InitMemBlock()
_Net_PutByte(INFO_SENDING_COORDS)
_Net_PutInt(client\id)
_Net_PutInt(ObjectX(client\obj))
_Net_PutInt(ObjectY(client\obj))
_Net_PutInt(ObjectAngle(client\obj))
f=OpenToWrite(Str(client\id))
WriteInt f,ObjectX(client\obj)
WriteInt f,ObjectY(client\obj)
WriteInt f,ObjectAngle(client\obj)
CloseFile f
EndIf
Next client
ServerSend()
End Function
Function SendClients()
For client.CLIENTS = Each CLIENTS
count=count+1
Next client
_Net_InitMemBlock()
_Net_PutByte(INFO_NUM_OF_CLIENTS)
ServerSend()
End Function
Function SendIds()
_Net_InitMemBlock()
_Net_PutByte(INFO_SENDING_IDS)
For client.CLIENTS = Each CLIENTS
_Net_PutInt(client\id)
Next client
ServerSend()
End Function
Function shutdown()
For client.CLIENTS=Each CLIENTS
DeleteObject client\obj
Delete client
Next client
CloseServer()
End
End Function
[/edit]
Re: CoolBasic & netti = cbNetwork
Posted: Mon Apr 02, 2012 5:00 pm
by Konstaduck
Miten saisin palvelimen vastaamaan cbNetworkin lähettämään toplistapyyntöön? Pitäisikö se toteuttaa JavaScriptilla/HTML:llä? Nyt ollaan pelissä jo siinä vaiheessa, että pitäisi saada palvelimelta TOP 5 - listat...
Kiitän jo valmiiksi kaikkia, ketkä vain tuhlaavat kallista aikaansa ja auttavat minua
Re: CoolBasic & netti = cbNetwork
Posted: Mon Apr 02, 2012 5:08 pm
by temu92
Lähetät web-palvelimelle HTTP-kutsun (kts. Wikipedia), en muista tukiko cbNetwork niitä jo muutenkin. Palvelin vastaa automaattisesti kutsuun.
Re: CoolBasic & netti = cbNetwork
Posted: Mon Apr 02, 2012 5:29 pm
by Timblex
Teet php:llä ojelman joka tulostaa nettisivulle top 5 listan ja sen jälkeen cb koodiisi:
Noniin, alanpas säätäämään tuon PHP:n ja cbNetworkin kanssa. Jospa saisinkin sen toimimaan
Re: CoolBasic & netti = cbNetwork
Posted: Sun May 06, 2012 5:57 pm
by VerkkoGuru
Kokeilin tuota Valtzun tutossa olevaa esimerkkiä, joka lataa sivun yle.fi/mobiiliuutiset ja sitten avaa sen selaimeen, valitti tällaista:Incorrect Library version(Cbnetwork.dll)!
Re: CoolBasic & netti = cbNetwork
Posted: Sun May 06, 2012 9:28 pm
by Konstaduck
VerkkoGuru wrote:Kokeilin tuota Valtzun tutossa olevaa esimerkkiä, joka lataa sivun yle.fi/mobiiliuutiset ja sitten avaa sen selaimeen, valitti tällaista:Incorrect Library version(Cbnetwork.dll)!
Sulta puuttuu sieltä samasta kansiosta cbNetwork.dll...
EDIT:
Tai se cbNetork.dll on väärä versio sen cbNetwork.cb:n kanssa
Re: CoolBasic & netti = cbNetwork
Posted: Mon May 07, 2012 3:48 pm
by VerkkoGuru
Konstaduck wrote:
VerkkoGuru wrote:Kokeilin tuota Valtzun tutossa olevaa esimerkkiä, joka lataa sivun yle.fi/mobiiliuutiset ja sitten avaa sen selaimeen, valitti tällaista:Incorrect Library version(Cbnetwork.dll)!
Sulta puuttuu sieltä samasta kansiosta cbNetwork.dll...
EDIT:
Tai se cbNetork.dll on väärä versio sen cbNetwork.cb:n kanssa
Kyllä se dll:kin sieltä löytyy. Voi olla, että on väärä versio :l
Re: CoolBasic & netti = cbNetwork
Posted: Mon May 07, 2012 3:55 pm
by valscion
Enpä usko että on väärä versio. Koitappa niin että lähdekoodi/exe ja DLL on samassa kansiossa, josko virhe korjaantuisi. DLL:ää ei tainnut saada ladattua, jos se sijaitsee alikansioissa.