示例#1
0
bool Server::update()
{


	if (grapple_server_messages_waiting(m_server))
	{
		grapple_message *message = grapple_server_message_pull(m_server);
		switch (message->type)
		{
		case GRAPPLE_MSG_NEW_USER:
			//Your code to handle this message
			std::cout << "new user!\n";
			break;
		case GRAPPLE_MSG_USER_NAME:
			//Your code to handle this message
			std::cout << "user name!\n";
			break;
		case GRAPPLE_MSG_USER_MSG:
		{
			grapple_user origin = message->USER_MSG.id;
			Message m( message->USER_MSG.data, message->USER_MSG.length );
			if( m_message_callbacks.find( m.id() ) != m_message_callbacks.end() )
			{
				// callback
				MessageCallback t = m_message_callbacks[m.id()];//( &m );
				(this->*t)( origin, &m );
			}
			else
				std::cerr << "Server::update: unable to handle message " << m.id() << std::endl;
		}break;
		case GRAPPLE_MSG_USER_DISCONNECTED:
			//Your code to handle this message
			std::cout << "user disconnected!\n";
			break;
		}
		grapple_message_dispose(message);
	}



	return false;
}
示例#2
0
void Server::doNetworking()
{
	grapple_message *message;
	while (grapple_server_messages_waiting(server))
	{
		message = grapple_server_message_pull(server);
		switch (message->type)
		{
		case GRAPPLE_MSG_NEW_USER:
			peer[message->NEW_USER.id] = Peer(grapple_server_client_address_get(server, message->NEW_USER.id));
			std::cerr << "client connected from " << peer[message->NEW_USER.id].name << std::endl;
		break;
		case GRAPPLE_MSG_USER_NAME:
			peer[message->USER_NAME.id].name = message->USER_NAME.name;
		break;
		case GRAPPLE_MSG_USER_MSG:
			{
				grapple_user id = message->USER_MSG.id;
				Buffer buf((char*)message->USER_MSG.data, message->USER_MSG.length);
				switch (buf.getType())
				{
				case READY:
					peer[id].ready = true;

					if (peer.size() > 1) {
						bool ready = true;
						for (std::map<grapple_user, Peer>::iterator i = peer.begin(); i != peer.end(); ++i)
						{
							if (!(*i).second.ready)
							{
								ready = false;
								break;
							}
						}

						if (ready)
							startGame();
					}
				break;
				case PADDLEMOVE:
					{
						unsigned int time = buf.popInt();
						peer[id].player->move(buf.popDouble(), buf.popDouble(), time);
						Vec2f pos = peer[id].player->getPosition();
						Buffer sbuf(PADDLEPOSITION);
						sbuf.pushId(id);
						sbuf.pushDouble(pos.y);
						sbuf.pushDouble(pos.x);
						sendPacket(sbuf, false);
					}
				break;
				case SERVE_BALL:
					peer[id].player->detachBall(ballspeed);
					break;
				case PAUSE_REQUEST:
					togglePause(true, true);
					std::cout << "Player " << peer[id].name << " paused the game." << std::endl;
				break;
				case RESUME_REQUEST:
					togglePause(false, true);
					std::cout << "Player " << peer[id].name << " resumed the game." << std::endl;
				break;
				}
			break;
			}
		case GRAPPLE_MSG_USER_DISCONNECTED:
			std::cout << "Player " << peer[message->USER_DISCONNECTED.id].name << " disconnected!" << std::endl;
			shutdown();
		break;
		}
		grapple_message_dispose(message);
	}
	while (grapple_client_messages_waiting(loopback))
	{
		message=grapple_client_message_pull(loopback);
		switch (message->type)
		{
		case GRAPPLE_MSG_NEW_USER_ME:
			{
				localid = message->NEW_USER.id;
				peer[localid].player = new Player(this, peer[localid].name, FRONT, field.getLength()/2.0f);
				player.push_back(peer[localid].player);
				peer[localid].player->attachBall(&ball[0]);
				output.addMessage(Interface::YOU_SERVE);
				peer[localid].ready = true;
				state = WAITING;
			}
			break;
		}
		grapple_message_dispose(message);
	}
}