Beispiel #1
0
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();
}
Beispiel #3
0
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);
}
Beispiel #4
0
void LocalRulesManager::onBallOut(const Ball& ball)
{
	m_gameRules->onBallOut();
	checkGameRules();

}
Beispiel #5
0
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;
		}
	}
}