HelloPolycodeApp.cpp 4.7 KB

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