HelloPolycodeApp.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include "HelloPolycodeApp.h"
  2. HelloPolycodeApp::HelloPolycodeApp(PolycodeView *view) : EventHandler() {
  3. #ifdef __APPLE__
  4. core = new CocoaCore(view, 640,480,false,0,90);
  5. #else
  6. core = new SDLCore(view, 640,480,false,0,90);
  7. #endif
  8. CoreServices::getInstance()->getResourceManager()->addArchive("default.pak");
  9. CoreServices::getInstance()->getResourceManager()->addDirResource("default", false);
  10. gameScreen = new Screen();
  11. Screen *hudScreen = new Screen();
  12. ScreenLabel *label = new ScreenLabel("Example client. Connecting.... Press escape to exit.", 16);
  13. hudScreen->addChild(label);
  14. motdLabel = new ScreenLabel("", 16);
  15. motdLabel->setPosition(0, 20);
  16. hudScreen->addChild(motdLabel);
  17. client = new Client(6543, 50);
  18. client->setPersistentData(&clientData, sizeof(ClientData));
  19. client->addEventListener(this, ClientEvent::EVENT_CLIENT_READY);
  20. client->addEventListener(this, ClientEvent::EVENT_SERVER_DATA);
  21. client->addEventListener(this, ClientEvent::EVENT_SERVER_DISCONNECTED);
  22. core->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
  23. core->getInput()->addEventListener(this, InputEvent::EVENT_KEYUP);
  24. // client->Connect("127.0.0.1", 52345);
  25. client->Connect("192.168.2.3", 52345);
  26. state = 0;
  27. }
  28. HelloPolycodeApp::~HelloPolycodeApp() {
  29. }
  30. void HelloPolycodeApp::createClientPlayer(int clientID) {
  31. ClientPlayer *player = new ClientPlayer();
  32. player->clientID = clientID;
  33. ScreenEntity *playerEntity = new ScreenEntity();
  34. playerEntity->setPositionMode(ScreenEntity::POSITION_CENTER);
  35. ScreenShape *playerBody = new ScreenShape(ScreenShape::SHAPE_CIRCLE, 30,30,3);
  36. playerBody->setRotation(-90.0);
  37. playerEntity->addChild(playerBody);
  38. playerEntity->setPosition(640/2,480/2);
  39. gameScreen->addChild(playerEntity);
  40. player->playerEntity = playerEntity;
  41. player->state = 0;
  42. players.push_back(player);
  43. }
  44. void HelloPolycodeApp::handleEvent(Event *event) {
  45. if(event->getDispatcher() == core->getInput()) {
  46. InputEvent *inputEvent = (InputEvent*)event;
  47. switch(event->getEventCode()) {
  48. case InputEvent::EVENT_KEYDOWN:
  49. switch (inputEvent->keyCode()) {
  50. case KEY_ESCAPE:
  51. client->Disconnect();
  52. break;
  53. case KEY_UP:
  54. clientData.thrusting = 1;
  55. break;
  56. case KEY_LEFT:
  57. clientData.turning_state = TURNING_LEFT;
  58. break;
  59. case KEY_RIGHT:
  60. clientData.turning_state = TURNING_RIGHT;
  61. break;
  62. }
  63. break;
  64. case InputEvent::EVENT_KEYUP:
  65. switch (inputEvent->key) {
  66. case KEY_UP:
  67. clientData.thrusting = 0;
  68. break;
  69. case KEY_LEFT:
  70. case KEY_RIGHT:
  71. clientData.turning_state = NOT_TURNING;
  72. break;
  73. }
  74. break;
  75. }
  76. }
  77. if(event->getDispatcher() == client) {
  78. ClientEvent *clientEvent = (ClientEvent*) event;
  79. switch(clientEvent->getEventCode()) {
  80. case ClientEvent::EVENT_CLIENT_READY:
  81. Logger::log("Connected to server with client ID: %d!\n", client->getClientID());
  82. break;
  83. case ClientEvent::EVENT_SERVER_DISCONNECTED:
  84. core->Shutdown();
  85. break;
  86. case ClientEvent::EVENT_SERVER_DATA:
  87. {
  88. switch(clientEvent->dataType) {
  89. case PACKET_TYPE_SERVER_DATA:
  90. {
  91. ServerState *serverState = (ServerState*) clientEvent->data;
  92. for(int i=0; i < players.size(); i++) {
  93. ClientPlayer *clientPlayer = players[i];
  94. for(int j=0; j < MAX_PLAYERS; j++) {
  95. if(clientPlayer->clientID == serverState->players[j].clientID && serverState->players[j].state != 0) {
  96. clientPlayer->playerEntity->setPosition(serverState->players[j].posX, serverState->players[j].posY);
  97. clientPlayer->playerEntity->setRotation(serverState->players[j].angle);
  98. }
  99. }
  100. }
  101. }
  102. break;
  103. case PLAYER_JOIN:
  104. {
  105. ServerClientInfo *newClientInfo = (ServerClientInfo*) clientEvent->data;
  106. createClientPlayer(newClientInfo->clientID);
  107. }
  108. break;
  109. case SERVER_INFO:
  110. {
  111. ServerInfo *info = (ServerInfo*) clientEvent->data;
  112. motdLabel->setText(info->motd);
  113. ServerState *serverState = &info->initialServerState;
  114. // create initial players
  115. for(int j=0; j < MAX_PLAYERS; j++) {
  116. if(serverState->players[j].state != 0) {
  117. createClientPlayer(serverState->players[j].clientID);
  118. }
  119. }
  120. client->sendReliableDataToServer(NULL, 0, CLIENT_READY);
  121. }
  122. break;
  123. }
  124. }
  125. break;
  126. }
  127. }
  128. }
  129. bool HelloPolycodeApp::Update() {
  130. return core->Update();
  131. }