2
0

HelloPolycodeApp.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include "HelloPolycodeApp.h"
  2. HelloPolycodeApp::HelloPolycodeApp(PolycodeView *view) : ServerWorld(), EventHandler() {
  3. #ifdef __APPLE__
  4. core = new CocoaCore(view, 640,480,false,false,0,0,90);
  5. #else
  6. core = new SDLCore(view, 640,480,false,false,0,0,90);
  7. #endif
  8. CoreServices::getInstance()->getResourceManager()->addArchive("Resources/default.pak");
  9. CoreServices::getInstance()->getResourceManager()->addDirResource("default", false);
  10. memset(serverInfo.motd, 0, 256);
  11. strcat(serverInfo.motd, "MOTD : ** Welcome to the Network Example server! **");
  12. gameScreen = new Screen();
  13. Screen *hudScreen = new Screen();
  14. infoLabel = new ScreenLabel("Example server. [0 Players]", 32);
  15. hudScreen->addChild(infoLabel);
  16. server = new Server(52345, 50, this);
  17. server->addEventListener(this, ServerEvent::EVENT_CLIENT_CONNECTED);
  18. server->addEventListener(this, ServerEvent::EVENT_CLIENT_DISCONNECTED);
  19. }
  20. void HelloPolycodeApp::updateWorld(Number elapsed) {
  21. for(int i=0; i < players.size(); i++) {
  22. Player *player = players[i];
  23. // handle input flags
  24. if(player->thrusting == 1) {
  25. player->moveSpeed = 80;
  26. } else {
  27. player->moveSpeed = 0;
  28. }
  29. switch(player->turning_state) {
  30. case NOT_TURNING:
  31. player->rotateSpeed = 0;
  32. break;
  33. case TURNING_LEFT:
  34. player->rotateSpeed = -100;
  35. break;
  36. case TURNING_RIGHT:
  37. player->rotateSpeed = 100;
  38. break;
  39. }
  40. // process movement
  41. player->angle += player->rotateSpeed * elapsed;
  42. player->position.x += sin(player->angle * PI/180.0) * player->moveSpeed * elapsed;
  43. player->position.y += -cos(player->angle * PI/180.0) * player->moveSpeed * elapsed;
  44. // update the server display
  45. player->playerEntity->setPosition(player->position.x, player->position.y);
  46. player->playerEntity->setRotation(player->angle);
  47. }
  48. // set the server state
  49. for(int i=0; i < MAX_PLAYERS; i++) {
  50. if(i < players.size()) {
  51. serverState.players[i] = players[i]->getClientInfo();
  52. } else {
  53. serverState.players[i].state = 0;
  54. }
  55. }
  56. }
  57. void HelloPolycodeApp::getWorldState(ServerClient *client, char **worldData,unsigned int *worldDataSize) {
  58. *worldData = (char*)&serverState;
  59. *worldDataSize = sizeof(ServerState);
  60. }
  61. void HelloPolycodeApp::handleEvent(Event *event) {
  62. for(int i=0; i < players.size(); i++) {
  63. if(event->getDispatcher() == players[i]->client) {
  64. ServerClientEvent *clientEvent = (ServerClientEvent*) event;
  65. Player *player = players[i];
  66. switch(clientEvent->getEventCode()) {
  67. case ServerClientEvent::EVENT_CLIENT_DATA:
  68. switch(clientEvent->dataType) {
  69. case CLIENT_READY:
  70. {
  71. ServerClientInfo info = player->getClientInfo();
  72. server->sendReliableDataToAllClients((char*)&info, sizeof(ServerClientInfo), PLAYER_JOIN);
  73. }
  74. break;
  75. case PLAYER_SHOOT:
  76. {
  77. }
  78. break;
  79. case PACKET_TYPE_CLIENT_DATA:
  80. ClientData *clientData = (ClientData*) clientEvent->data;
  81. player->turning_state = clientData->turning_state;
  82. player->thrusting = clientData->thrusting;
  83. break;
  84. }
  85. break;
  86. }
  87. }
  88. }
  89. if(event->getDispatcher() == server) {
  90. ServerEvent *serverEvent = (ServerEvent*) event;
  91. switch(serverEvent->getEventCode()) {
  92. case ServerEvent::EVENT_CLIENT_DISCONNECTED:
  93. {
  94. for(int i=0;i<players.size();i++) {
  95. if(players[i]->client == serverEvent->client) {
  96. Player *player = players[i];
  97. players.erase(players.begin()+i);
  98. gameScreen->removeChild(player->playerEntity);
  99. delete player->playerEntity;
  100. delete player;
  101. }
  102. }
  103. }
  104. break;
  105. case ServerEvent::EVENT_CLIENT_CONNECTED:
  106. {
  107. Player *newPlayer = new Player();
  108. newPlayer->position.x = 640/2;
  109. newPlayer->position.y = 480/2;
  110. newPlayer->client = serverEvent->client;
  111. newPlayer->client->addEventListener(this, ServerClientEvent::EVENT_CLIENT_DATA);
  112. ScreenEntity *playerEntity = new ScreenEntity();
  113. playerEntity->setPositionMode(ScreenEntity::POSITION_CENTER);
  114. ScreenShape *playerBody = new ScreenShape(ScreenShape::SHAPE_CIRCLE, 30,30,3);
  115. playerBody->setRotation(-90.0);
  116. playerEntity->addChild(playerBody);
  117. playerEntity->setPosition(640/2,480/2);
  118. gameScreen->addChild(playerEntity);
  119. newPlayer->playerEntity = playerEntity;
  120. players.push_back(newPlayer);
  121. printf("Player connected\n");
  122. serverInfo.initialServerState = serverState;
  123. server->sendReliableDataToClient(newPlayer->client, (char*) &serverInfo, sizeof(ServerInfo), SERVER_INFO);
  124. }
  125. break;
  126. }
  127. }
  128. }
  129. bool HelloPolycodeApp::Update() {
  130. updateWorld(core->getElapsed());
  131. infoLabel->setText("Example server. ["+String::IntToString(players.size())+" Players]");
  132. return core->Update();
  133. }