| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- #include "HelloPolycodeApp.h"
-
- HelloPolycodeApp::HelloPolycodeApp(PolycodeView *view) : ServerWorld(), EventHandler() {
- core = new POLYCODE_CORE(view, 640,480,false,false,0,0,90);
- CoreServices::getInstance()->getResourceManager()->addArchive("Resources/default.pak");
- CoreServices::getInstance()->getResourceManager()->addDirResource("default", false);
- memset(serverInfo.motd, 0, 256);
- strcat(serverInfo.motd, "MOTD : ** Welcome to the Network Example server! **");
- gameScene = new Scene(Scene::SCENE_2D);
- Scene *hudScene = new Scene(Scene::SCENE_2D);
- infoLabel = new SceneLabel("Example server. [0 Players]", 32);
- hudScene->addChild(infoLabel);
-
- server = new Server(52345, 50, this);
-
- server->addEventListener(this, ServerEvent::EVENT_CLIENT_CONNECTED);
- server->addEventListener(this, ServerEvent::EVENT_CLIENT_DISCONNECTED);
- }
- HelloPolycodeApp::~HelloPolycodeApp() {
- }
- void HelloPolycodeApp::updateWorld(Number elapsed) {
-
- for(int i=0; i < players.size(); i++) {
- Player *player = players[i];
-
- // handle input flags
- if(player->thrusting == 1) {
- player->moveSpeed = 80;
- } else {
- player->moveSpeed = 0;
- }
- switch(player->turning_state) {
- case NOT_TURNING:
- player->rotateSpeed = 0;
- break;
- case TURNING_LEFT:
- player->rotateSpeed = 100;
- break;
- case TURNING_RIGHT:
- player->rotateSpeed = -100;
- break;
-
- }
-
- // process movement
- player->angle += player->rotateSpeed * elapsed;
- player->position.x += sin(player->angle * PI/180.0) * player->moveSpeed * elapsed;
- player->position.y += -cos(player->angle * PI/180.0) * player->moveSpeed * elapsed;
-
- // update the server display
- player->playerEntity->setPosition(player->position.x, player->position.y);
- player->playerEntity->setRoll(player->angle);
-
- }
-
- // set the server state
- for(int i=0; i < MAX_PLAYERS; i++) {
- if(i < players.size()) {
- serverState.players[i] = players[i]->getClientInfo();
- } else {
- serverState.players[i].state = 0;
- }
- }
- }
- void HelloPolycodeApp::getWorldState(ServerClient *client, char **worldData,unsigned int *worldDataSize) {
- *worldData = (char*)&serverState;
- *worldDataSize = sizeof(ServerState);
- }
- void HelloPolycodeApp::handleEvent(Event *event) {
- for(int i=0; i < players.size(); i++) {
- if(event->getDispatcher() == players[i]->client) {
- ServerClientEvent *clientEvent = (ServerClientEvent*) event;
- Player *player = players[i];
- switch(clientEvent->getEventCode()) {
- case ServerClientEvent::EVENT_CLIENT_DATA:
- switch(clientEvent->dataType) {
- case CLIENT_READY:
- {
- ServerClientInfo info = player->getClientInfo();
- server->sendReliableDataToAllClients((char*)&info, sizeof(ServerClientInfo), PLAYER_JOIN);
- }
- break;
- case PLAYER_SHOOT:
- {
-
- }
- break;
- case PACKET_TYPE_CLIENT_DATA:
- ClientData *clientData = (ClientData*) clientEvent->data;
- player->turning_state = clientData->turning_state;
- player->thrusting = clientData->thrusting;
- break;
- }
- break;
- }
- }
- }
- if(event->getDispatcher() == server) {
- ServerEvent *serverEvent = (ServerEvent*) event;
- switch(serverEvent->getEventCode()) {
-
- case ServerEvent::EVENT_CLIENT_DISCONNECTED:
- {
- for(int i=0;i<players.size();i++) {
- if(players[i]->client == serverEvent->client) {
- Player *player = players[i];
- players.erase(players.begin()+i);
-
- gameScene->removeEntity(player->playerEntity);
- delete player->playerEntity;
- delete player;
- }
- }
- }
- break;
-
- case ServerEvent::EVENT_CLIENT_CONNECTED:
- {
- Player *newPlayer = new Player();
- newPlayer->position.x = 640/2;
- newPlayer->position.y = 480/2;
- newPlayer->client = serverEvent->client;
- newPlayer->client->addEventListener(this, ServerClientEvent::EVENT_CLIENT_DATA);
- SceneEntity *playerEntity = new SceneEntity();
- ScenePrimitive *playerBody = new ScenePrimitive(ScenePrimitive::TYPE_CIRCLE, 30,30,3);
- playerBody->setRoll(-90.0);
- playerEntity->addChild(playerBody);
- gameScene->addChild(playerEntity);
- newPlayer->playerEntity = playerEntity;
- players.push_back(newPlayer);
- printf("Player connected\n");
- serverInfo.initialServerState = serverState;
- server->sendReliableDataToClient(newPlayer->client, (char*) &serverInfo, sizeof(ServerInfo), SERVER_INFO);
- }
- break;
- }
-
- }
- }
- bool HelloPolycodeApp::Update() {
- updateWorld(core->getElapsed());
- infoLabel->setText("Example server. ["+String::IntToString(players.size())+" Players]");
- return core->updateAndRender();
- }
|