void Game::SendFinishRace() { PacketStream PS; ENUM_Event e = FINISHEDRACE; PS.writeInt(e); e = ENDOFMESSAGE; PS.writeInt(e); // get the data from the stream char data[100]; PS.toCharArray(data); // send the data Net::GetInstance()->SendData(data,"127.0.0.1",m_sendToPort); // increment num packets sent m_numPacketsSent++; m_raceFinished = true; if(m_host) { m_hostWon = true; } else { m_hostWon = false; } }
void Game::SendStartRace() { PacketStream PS; ENUM_Event e = STARTRACE; PS.writeInt(e); e = ENDOFMESSAGE; PS.writeInt(e); // get the data from the stream char data[100]; PS.toCharArray(data); // send the data Net::GetInstance()->SendData(data,"127.0.0.1",m_sendToPort); // increment num packets sent m_numPacketsSent++; }
void Game::SendMyCarData() { PacketStream PS; //===================== send data ================================== ENUM_Event e = STATEDATA; PS.writeInt(e); // write the xy values to the stream PS.writeFloat(m_pMyCar->X()); PS.writeFloat(m_pMyCar->Y()); // write the angle of rotation to the stream PS.writeFloat(m_pMyCar->GetAngleY()); // write the direction and topspeed variables to the stream PS.writeFloat(m_pMyCar->DirectionX()); PS.writeFloat(m_pMyCar->DirectionY()); PS.writeFloat(m_pMyCar->TopSpeed()); PS.writeFloat(m_pMyCar->Speed()); PS.writeFloat(m_pMyCar->Friction()); e = ENDOFMESSAGE; PS.writeInt(e); // get the data from the stream char data[100]; PS.toCharArray(data); // send the data Net::GetInstance()->SendData(data,"127.0.0.1",m_sendToPort); // update the time of the packet sent - for interpolate m_lastPacketSentTime = GetTickCount(); // increment the number of packets sent m_numPacketsSent++; //=================================================================== }
/** * Game update function * @param pStream the packet stream to write state data to (if playing multiplayer) */ void Game::update(PacketStream* pStream) { //cout << "update" << endl; // timer g_timeNow = s3eTimerGetMs(); g_deltaTime = float( (g_timeNow - g_prevTime) * 0.001 ); // Time since last packet was sent timeSinceLastSend += g_timeNow - g_prevTime; g_prevTime = g_timeNow; if(mStage == Constants::INGAME) { for(int i = 0; i < bufferSize; i++) { mMessageReceived[i] = 0; mMessageSent[i] = 0; } if(mPlayer->getHealth() <= 0) { mPlayer->loadCheckpoint = true; mPlayer->mPos = CIwSVec2(mCheckpoint.x, mCheckpoint.y); // Create respawn effect CIwSVec2 screenCentre = CIwSVec2((int16)Iw2DGetSurfaceWidth() >> 1, (int16)Iw2DGetSurfaceHeight() >> 1); CIwSVec2 pos = screenCentre + (CIwSVec2(int16(mCheckpoint.x*8), -int16(mCheckpoint.y*8))); createEffect(CIwSVec2(pos.x, pos.y), 10, "Images/respawn.png", 1.0f); } if(mSpawnPickup == true) { mLevel->createPickup(mPickupSpawnType, mPickupSpawnPoint.x, mPickupSpawnPoint.y); mSpawnPickup = false; } if(!mPaused) { mTimeTaken += g_deltaTime; } // Sync clients if multiplayer if(mMultiplayer) { // Packet rate modification if(timeSinceLastSend >= 1000/30) { pStream->writeInt(Constants::UPDATE); // Dead reckoning if( abs(mDRPlayer->getBody()->GetPosition().Length() - mPlayer->getBody()->GetPosition().Length()) >= 1 ) { pStream->writeInt(Constants::DRUPDATE); mPlayer->serialize(pStream); mRDXVel = mPlayer->getBody()->GetLinearVelocity().x; mDRPlayer->getBody()->SetTransform(mPlayer->getBody()->GetPosition(), 0.0f); mDRPlayer->getBody()->SetLinearVelocity(b2Vec2(mRDXVel, mPlayer->getBody()->GetLinearVelocity().y)); } else { pStream->writeInt(Constants::UPDATE); } if(mHost) { // Serialize level mLevel->serialize(pStream); } pStream->writeChar('\0'); pStream->toCharArray(mMessageSent); mMessageSent[strlen(mMessageSent)-1] = '\0'; //cout << "SENDING: " << mMessageSent << endl; // Send data s3eSocketSendTo(mSock, mMessageSent, strlen(mMessageSent), 0, &mDest_addr); timeSinceLastSend = 0; } // Recieve data mBytesRecieved = s3eSocketRecvFrom(mSock, mMessageReceived, sizeof(mMessageReceived), 0, &mDest_addr); if(mBytesRecieved != -1) { cout << "RECIEVING: " << mMessageReceived << endl; pStream->fromCharArray(mMessageReceived); int type; pStream->readInt(type); while (type) { cout << "checking message types" << endl; if(type == Constants::UPDATE) { int updateType; pStream->readInt(updateType); if(updateType == Constants::DRUPDATE) { mOtherPlayer->deserialize(pStream); mRecRDXVel = mOtherPlayer->getBody()->GetLinearVelocity().x; } else { if(!mHost) { // Deserialize the level mLevel->deserialize(pStream); } } } else if(type == Constants::DESTROY) { int id; pStream->readInt(id); mLevel->killEnemy(id); } else if(type == Constants::DESTROYPICKUP) { int id; pStream->readInt(id); mLevel->destroyPickup(id); } else if(type == Constants::CREATEPICKUP) { int type, x, y, id; pStream->readInt(type); pStream->readInt(id); // Clients sends -1 pStream->readInt(x); pStream->readInt(y); mLevel->createPickup(type, x, y); if(mHost) { // Send create to peer // Send Id of created pickup PacketStream s; s.writeInt(Constants::CREATEPICKUP); s.writeInt(mLevel->getPickups().back()->getID()); s.writeInt(type); s.writeFloat(x); s.writeFloat(y); s.writeChar('\0'); char message[10]; s.toCharArray(message); message[strlen(message)-1] = '\0'; s3eSocketSendTo(mSock, message, strlen(message), 0, &mDest_addr); } else { // Set id of pickup if client if client mLevel->getPickups().back()->setID(id); } } else if(type == Constants::CREATECRATE) { int type, id; float x, y; //pStream->readInt(id); pStream->readInt(type); pStream->readFloat(x); pStream->readFloat(y); if(mHost) { mLevel->createCrate(type, x, y); crateSpawned = true; PacketStream s; s.writeInt(Constants::CREATECRATE); //s.writeInt(mLevel->getCrates().back()->getID()); s.writeInt(type); s.writeFloat(x); s.writeFloat(y); s.writeChar('\0'); char message[10]; s.toCharArray(message); message[strlen(message)-1] = '\0'; //s3eSocketSendTo(mSock, message, strlen(message), 0, mDest_addr); } else { mLevel->createCrate(type, x, y); //mLevel->getCrates().back()->setID(id); crateSpawned = true; } } else if(type == Constants::TOGGLEPLATFORM) { int id; pStream->readInt(id); mLevel->getActivatablePlatforms().at(id)->toggle(); } else if(type == Constants::ACTION) { int action; pStream->readInt(action); //Punch if(action == 0) { // Play punch animation mOtherPlayer->punch(); vector<Enemy*> enemies = mLevel->getEnemies(); b2Body* player = mOtherPlayer->getBody(); for(int i = 0; i < enemies.size(); i++) { if( abs((enemies.at(i)->getBody()->GetPosition() - player->GetPosition()).Length()) <= 10) { short direction = 1; if(enemies.at(i)->getBody()->GetPosition().x < player->GetPosition().x) { direction = -1; } b2Vec2 force = b2Vec2(50000*direction, 0); enemies.at(i)->getBody()->ApplyForce(force, enemies.at(i)->getBody()->GetWorldCenter()); enemies.at(i)->ApplyDamage(mOtherPlayer->getMeleeStr()); CIwSVec2 screenCentre = CIwSVec2((int16)Iw2DGetSurfaceWidth() >> 1, (int16)Iw2DGetSurfaceHeight() >> 1); b2Transform t = enemies.at(i)->getBody()->GetTransform(); CIwSVec2 pos = screenCentre + (CIwSVec2(int16(t.p.x*8), -int16(t.p.y*8))); createEffect(pos, 8 , "Images/blood.png", 1.0f); } } } //Kick else if(action == 1) {