Nätverksspel CDX, fryslagg/krash
Goddag alla Sweclockare. Jobbar tillsammans med en polare med att skapa ett platformsspel med stöd för multiplayer. Vi har det som projektarbete nu i trean och använder oss av biblioteket CDX tillsammans med tilläggsbiblioteket CDXConnection för att få stöd för kommunikation över internet.
Jag har skrivit kod som ritar upp 4 simpla kuber som man sedan kan välja en av för att spela, jag har även skapat en simpel server som tar emot positionerna för kuberna och skickar ut dem till alla som är uppkopplade mot servern. Det är inget fel på koden och den klarar av att skicka mellan de olika klienterna i cirka 30sekunder. Sedan krashar spelet av någon anledning och du måste avsluta processen via aktivitetshanteraren. Då jag inte lyckas hitta några fel i koden har jag svårt att förstå varför spelet fryser.
Det jag undrar är om ni har några tips på vad som kan få det här problemet att uppstå. Vid behov kan jag bifoga all kod som är skriven men då den är så simpel som den kan bli kan jag inte hitta några fel i den. Allt den gör är att skapa 4 bilder(objekt) och skicka positionerna över internet med TCP/IP protokoll.
EDIT:
SERVER
Deklarering
// alltid med, skärmen och indata
DECLARE CDXScreen *Screen;
DECLARE CDXInput Input;
// referens till skärmytan i minnet, dit man ritar allt
DECLARE CDXSurface *BackBuffer;
DECLARE CDXConnection *Con;
DECLARE char data[256];
DECLARE int node;
DECLARE int read;
DECLARE int x;
Initiering
// skapa skärmen
Screen = new CDXScreen;
Screen->CreateFullScreen(hWnd, 640, 480, 16);
// rensa back- och frontbuffer
Screen->GetBack()->Fill(0);
Screen->GetFront()->Fill(0);
// skapa en referens till backbuffer (för enklare användning senare, rita på denna)
BackBuffer = Screen->GetBack();
Con = new CDXConnection();
Con->CreateHost();
Con->Listen(4404);
x=0;
data[256]
//
// Här ska vår kod för att skapa objekt in
//
SetRect(&Window, 0, 0, 640, 480);
Active (den del som körs om och om igen medans programmet är igång ^^)
if(Con->isDataReady()){
Con->getData(node, data, sizeof(data), read);
//cout<<Node<<endl<<endl;
//cout<<Con->getNumConnections()<<endl;
//cout<<Data<<endl;
//x++;
}
//if(x>=90){
Con->sendData(NODE_ALL, data, sizeof(data));
//x=0;
//}
Klient
Deklarering
// alltid med, skärmen och indata
DECLARE CDXScreen *Screen;
DECLARE CDXInput Input;
// referens till skärmytan i minnet, dit man ritar allt
DECLARE CDXSurface *BackBuffer;
DECLARE CDXSurface *Grund;
DECLARE CDXSprite *Player_1;
DECLARE CDXSprite *Player_2;
DECLARE CDXSprite *Player_3;
DECLARE CDXSprite *Player_4;
DECLARE CDXSprite *Local_player;
DECLARE CDXConnection *Con;
DECLARE bool meny;
DECLARE bool playing;
DECLARE int player;
DECLARE char data[256];
DECLARE int read;
DECLARE int node;
void Encode_Int(int start, int message);
int Decode_Int(int start);
Initiering
// skapa skärmen
Screen = new CDXScreen;
Screen->CreateFullScreen(hWnd, 1280, 960, 16);
// rensa back- och frontbuffer
Screen->GetBack()->Fill(0);
Screen->GetFront()->Fill(0);
// skapa en referens till backbuffer (för enklare användning senare, rita på denna)
BackBuffer = Screen->GetBack();
Grund = new CDXSurface();
Grund->Create(Screen, "data/grund.bmp");
Player_1 = new CDXSprite();
Player_1->Create(Screen, "data/red.bmp", 34, 66, 1);
Player_1->SetColorKey();
Player_1->SetPos(320,240);
Player_2 = new CDXSprite();
Player_2->Create(Screen, "data/blue.bmp", 34, 66, 1);
Player_2->SetColorKey();
Player_2->SetPos(960,240);
Player_3 = new CDXSprite();
Player_3->Create(Screen, "data/yellow.bmp", 34, 66, 1);
Player_3->SetColorKey();
Player_3->SetPos(320,720);
Player_4 = new CDXSprite();
Player_4->Create(Screen, "data/green.bmp", 34, 66, 1);
Player_4->SetColorKey();
Player_4->SetPos(960,720);
Con = new CDXConnection();
Con->CreateClient();
Con->Connect("localhost",4404);
//213.114.77.81
meny=true;
playing=false;
player=0;
data[256]=new char;
Active
Input
Input.Update();
if(Input.GetKeyState(CDXKEY_T) && meny) {
Local_player=Player_1;
player=1;
meny=false;
}
if(Input.GetKeyState(CDXKEY_Y) && meny) {
Local_player=Player_2;
player=2;
meny=false;
}
if(Input.GetKeyState(CDXKEY_U) && meny) {
Local_player=Player_3;
player=3;
meny=false;
}
if(Input.GetKeyState(CDXKEY_I) && meny) {
Local_player=Player_4;
player=4;
meny=false;
}
if(Input.GetKeyState(CDXKEY_P)){
playing=true;
}
if(Input.GetKeyState(CDXKEY_W) && !meny) {
// Upp
if(Local_player->GetVelY() != -2)
Local_player->SetVelY(-2);
else
Local_player->SetPosY(Local_player->GetPosY()+Local_player->GetVelY());
}
if(Input.GetKeyState(CDXKEY_S) && !meny) {
// Ner
if(Local_player->GetVelY() != 2)
Local_player->SetVelY(2);
else
Local_player->SetPosY(Local_player->GetPosY()+Local_player->GetVelY());
}
if(Input.GetKeyState(CDXKEY_A) && !meny) {
// Vänster
if(Local_player->GetVelX() != -2)
Local_player->SetVelX(-2);
else
Local_player->SetPosX(Local_player->GetPosX()+Local_player->GetVelX());
}
if(Input.GetKeyState(CDXKEY_D) && !meny) {
// Höger
if(Local_player->GetVelX() != 2)
Local_player->SetVelX(2);
else
Local_player->SetPosX(Local_player->GetPosX()+Local_player->GetVelX());
}
Uppdatering
if(Con->isDataReady()){
Con->getData(node, data, sizeof(data), read);
switch(player){
case 0:
break;
case 1:
Player_2->SetPos(Decode_Int(20),Decode_Int(24));
Player_3->SetPos(Decode_Int(40),Decode_Int(44));
Player_4->SetPos(Decode_Int(60),Decode_Int(64));
break;
case 2:
Player_1->SetPos(Decode_Int(0),Decode_Int(4));
Player_3->SetPos(Decode_Int(40),Decode_Int(44));
Player_4->SetPos(Decode_Int(60),Decode_Int(64));
break;
case 3:
Player_1->SetPos(Decode_Int(0),Decode_Int(4));
Player_2->SetPos(Decode_Int(20),Decode_Int(24));
Player_4->SetPos(Decode_Int(60),Decode_Int(64));
break;
case 4:
Player_1->SetPos(Decode_Int(0),Decode_Int(4));
Player_2->SetPos(Decode_Int(20),Decode_Int(24));
Player_3->SetPos(Decode_Int(40),Decode_Int(44));
break;
}
}
if(playing){
switch(player){
case 0:
break;
case 1:
Encode_Int(0, Local_player->GetPosX());
Encode_Int(4, Local_player->GetPosY());
break;
case 2:
Encode_Int(20, Local_player->GetPosX());
Encode_Int(24, Local_player->GetPosY());
break;
case 3:
Encode_Int(40, Local_player->GetPosX());
Encode_Int(44, Local_player->GetPosY());
break;
case 4:
Encode_Int(60, Local_player->GetPosX());
Encode_Int(64, Local_player->GetPosY());
break;
}
//Encode_Int(0, Local_player->GetPosX());
//Encode_Int(4, Local_player->GetPosY());
//if(Con->StillConnected())
Con->sendData(NODE_SERVER, data, sizeof(data));
}
Uppritning och de två funktionerna för char->int och vice versa
void Draw(void) {
// rita allting här, till BackBuffer (eller Screen->GetBack())
Grund->DrawBlk(BackBuffer, 0, 0);
Player_2->Draw(BackBuffer, 0, 0, CDXBLT_TRANS);
Player_3->Draw(BackBuffer, 0, 0, CDXBLT_TRANS);
Player_4->Draw(BackBuffer, 0, 0, CDXBLT_TRANS);
Player_1->Draw(BackBuffer, 0, 0, CDXBLT_TRANS);
// flippa så att skärmytan i minnet (backbuffer) visas
Screen->Flip(TRUE,TRUE,TRUE);
}
void Encode_Int(int start, int message){
data[start] = message & 0xFF;
data[start+1] = (message >> 8) & 0xFF;
data[start+2] = (message >> 16) & 0xFF;
data[start+3] = (message >> 24) & 0xFF;
}
int Decode_Int(int start){
return (int)((UCHAR)data[start]+((UCHAR)*data[start+1] << 8)+((UCHAR)data[start+2] << 16)+((UCHAR)data[start+3] << 24));
}