void LocalRulesManager::onBallHitTable(const Ball& ball, const Table& table) { PlayerId side = ball.getPosition().x() < 0.0f ? getOpponentId() : getPlayerId(); m_gameRules->onBallHitTable(side); checkGameRules(); }
void GameControlRulesDaemon::updateGameControlFlow() { if ( NetworkState::status == _network_state_server ) { mapCycleFsmServer(); } else { mapCycleFsmClient(); } checkGameRules(); }
void LocalRulesManager::onBallHitRacket(const Ball& ball, const Racket& racket, float hitMagnitude) { m_gameRules->onBallHitRacket(racket.getPlayerId()); checkGameRules(); btTransform transform; ball.getBody()->getMotionState()->getWorldTransform(transform); btVector3 vel = ball.getVelocity(); btVector3 angVel = ball.getAngularVelocity(); sendMessage(MessagePtr(new BallState(transform.getOrigin(), vel, angVel, hitMagnitude)), ENET_PACKET_FLAG_RELIABLE); }
void LocalRulesManager::onBallOut(const Ball& ball) { m_gameRules->onBallOut(); checkGameRules(); }
void LocalRulesManager::update(const double& timeStep) { ENetEvent event; while(enet_host_service(m_server, &event, 0) > 0) { switch (event.type) { case ENET_EVENT_TYPE_CONNECT: std::cout<<"Client connected: "<< event.peer->address.host << " : " << event.peer->address.port<<std::endl; break; case ENET_EVENT_TYPE_RECEIVE: updateMessages(event.packet->data, event.packet->dataLength); for(auto msg : m_messageQueue) { switch(msg->getType()) { case C_HELLO: { sendMessage(MessagePtr(new Welcome("Server")), ENET_PACKET_FLAG_RELIABLE); m_isWaiting = false; } break; case G_UPDATE_POS: m_pongScene->updateOpponentPos(((UpdatePos*)msg.get())->getPosition()); break; case G_BALLEVENT: { //std::cout<<"Ball event: " << (int)((BallEvent*)msg.get())->getEventType() << " "<< (int)((BallEvent*)msg.get())->getPlayerId() << std::endl; BallEvent* evt = (BallEvent*)msg.get(); switch(evt->getEventType()) { case BallEvent::BALLEVENT_TABLE: m_gameRules->onBallHitTable(evt->getPlayerId()); break; case BallEvent::BALLEVENT_RACKET: m_gameRules->onBallHitRacket(evt->getPlayerId()); break; case BallEvent::BALLEVENT_OUTSIDE: m_gameRules->onBallOut(); break; } checkGameRules(); } break; case G_BALLSTATE: { BallState* ballState = (BallState*)msg.get(); m_pongScene->updateBallState( ballState->getPosition(), ballState->getVelocity(), ballState->getAngularVelocity(), ballState->getServe(), ballState->getHitMagnitude()); if(ballState->getServe() != 0) m_gameRules->onNewRound(); } break; } } m_messageQueue.clear(); //std::cout<<"Got data: "<< event.packet->dataLength << std::endl; break; case ENET_EVENT_TYPE_DISCONNECT: std::cout<<"Client disconnected: "<< event.peer->address.host << " : " << event.peer->address.port<<std::endl; break; } } }