HelloPolycodeApp.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include "HelloPolycodeApp.h"
  2. HelloPolycodeApp::HelloPolycodeApp(PolycodeView *view) : EventHandler() {
  3. core = new POLYCODE_CORE(view, 640,480,false,true,0,0,90, 0, true);
  4. CoreServices::getInstance()->getResourceManager()->addArchive("Resources/default.pak");
  5. CoreServices::getInstance()->getResourceManager()->addDirResource("default", false);
  6. scene = new PhysicsScene();
  7. ScenePrimitive *ground = new ScenePrimitive(ScenePrimitive::TYPE_PLANE, 10, 10);
  8. ground->loadTexture("Resources/green_texture.png");
  9. scene->addPhysicsChild(ground, PhysicsSceneEntity::SHAPE_PLANE, 0.0);
  10. for(int i=0; i < 10; i++) {
  11. ScenePrimitive *box = new ScenePrimitive(ScenePrimitive::TYPE_BOX, 0.8,0.8,0.8);
  12. box->loadTexture("Resources/pink_texture.png");
  13. box->Roll(-45 + (rand() % 90));
  14. box->Pitch(-45 + (rand() % 90));
  15. box->setPosition(-2 + (rand() % 4), i*0.5, -2 + (rand() % 4));
  16. scene->addPhysicsChild(box, PhysicsSceneEntity::SHAPE_BOX, 1.0);
  17. }
  18. player = new ScenePrimitive(ScenePrimitive::TYPE_BOX, 0.5,1.0,0.5);
  19. player->loadTexture("Resources/pink_texture.png");
  20. player->setColor(1.0, 1.0, 0.0, 1.0);
  21. player->setPosition(2,1,2);
  22. playerController = scene->addCharacterChild(player, 10.0, 1.0, 0.5);
  23. walkSpeed = 0;
  24. rotateSpeed = 0;
  25. playerDirection = 0;
  26. testBox = new ScenePrimitive(ScenePrimitive::TYPE_BOX, 2, 2, 2);
  27. testBox->loadTexture("Resources/pink_texture.png");
  28. testBox->setColor(0.3,0.5, 1.0,0.4);
  29. testBox->setPosition(2,1,-2);
  30. scene->addCollisionChild(testBox, PhysicsSceneEntity::SHAPE_BOX);
  31. Scene *hud = new Scene(Scene::SCENE_2D_TOPLEFT);
  32. onGroundLabel = new SceneLabel("Arrow keys to control, spacebar to jump, press R to reset", 16);
  33. onGroundLabel->setAnchorPoint(-1.0, -1.0, 0.0);
  34. onGroundLabel->setPosition(0,0);
  35. hud->addChild(onGroundLabel);
  36. onGroundLabel = new SceneLabel("On Ground:", 16);
  37. onGroundLabel->setAnchorPoint(-1.0, -1.0, 0.0);
  38. onGroundLabel->setPosition(0,32);
  39. hud->addChild(onGroundLabel);
  40. scene->getDefaultCamera()->setPosition(7,7,7);
  41. scene->getDefaultCamera()->lookAt(Vector3(0,0,0));
  42. core->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
  43. core->getInput()->addEventListener(this, InputEvent::EVENT_KEYUP);
  44. }
  45. void HelloPolycodeApp::handleEvent(Event *e) {
  46. if(e->getDispatcher() == core->getInput()) {
  47. InputEvent *inputEvent = (InputEvent*)e;
  48. switch(e->getEventCode()) {
  49. case InputEvent::EVENT_KEYDOWN:
  50. switch (inputEvent->keyCode()) {
  51. case KEY_r:
  52. playerController->warpCharacter(Vector3(2,1,2));
  53. break;
  54. case KEY_UP:
  55. walkSpeed = 0.05;
  56. break;
  57. case KEY_DOWN:
  58. walkSpeed = -0.05;
  59. break;
  60. case KEY_LEFT:
  61. rotateSpeed = 3.0;
  62. break;
  63. case KEY_RIGHT:
  64. rotateSpeed = -3.0;
  65. break;
  66. case KEY_SPACE:
  67. playerController->jump();
  68. break;
  69. }
  70. break;
  71. case InputEvent::EVENT_KEYUP:
  72. switch (inputEvent->key) {
  73. case KEY_UP:
  74. case KEY_DOWN:
  75. walkSpeed = 0;
  76. break;
  77. case KEY_LEFT:
  78. case KEY_RIGHT:
  79. rotateSpeed = 0;
  80. break;
  81. }
  82. break;
  83. }
  84. }
  85. }
  86. HelloPolycodeApp::~HelloPolycodeApp() {
  87. }
  88. bool HelloPolycodeApp::Update() {
  89. Number elapsed = core->getElapsed();
  90. playerDirection += rotateSpeed * elapsed;
  91. player->setYaw(playerDirection*(180/PI));
  92. playerController->setWalkDirection(Vector3(walkSpeed * cos(playerDirection),0,walkSpeed * sin(-playerDirection)));
  93. if(playerController->onGround()) {
  94. onGroundLabel->setText("On Ground: YES");
  95. } else {
  96. onGroundLabel->setText("On Ground: NO");
  97. }
  98. CollisionResult res = scene->testCollision(player, testBox);
  99. if(res.collided) {
  100. testBox->setColor(1.0,1.0,0.0,0.5);
  101. } else {
  102. testBox->setColor(0.0,1.0,1.0,0.5);
  103. }
  104. return core->updateAndRender();
  105. }