HelloPolycodeApp.cpp 4.3 KB

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