Game.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include "client/Game.h"
  2. #include "client/GameClient.h"
  3. #include "client/gui/StartGUI.h"
  4. #include "client/rendering/Engine.h"
  5. #include "common/network/Packets.h"
  6. #include "common/network/toserver/ControllerPacket.h"
  7. #include "rendering/renderer/WorldRenderer.h"
  8. #include "utils/Logger.h"
  9. #include "utils/Utils.h"
  10. BlockRegistry Game::blockRegistry;
  11. World Game::world{blockRegistry};
  12. static WorldRenderer worldRenderer{Game::world};
  13. Controller Game::controller;
  14. Entity Game::player;
  15. typedef void (*State)();
  16. static State tickState;
  17. static State renderState;
  18. static BaseGUI baseGUI;
  19. static StartGUI startGUI;
  20. static void tickConnectedState() {
  21. Game::player.skip = false;
  22. Game::world.tick();
  23. GameClient::consumeEvents();
  24. Quaternion q = Game::player.getRotation();
  25. Vector3 up(0.0f, 1.0f, 0.0f);
  26. Vector3 back = q * Vector3(0.0f, 0.0f, -1.0f);
  27. back[1] = 0.0f;
  28. back.normalize();
  29. Vector3 right = back.cross(up);
  30. constexpr float rotationSpeed = 4.0f;
  31. ControllerPacket cp;
  32. Vector3 force;
  33. if(Game::controller.down.isDown()) {
  34. cp.set(ControllerPacket::Type::DOWN);
  35. force += back;
  36. }
  37. if(Game::controller.up.isDown()) {
  38. cp.set(ControllerPacket::Type::UP);
  39. force -= back;
  40. }
  41. if(Game::controller.left.isDown()) {
  42. cp.set(ControllerPacket::Type::LEFT);
  43. force -= right;
  44. }
  45. if(Game::controller.right.isDown()) {
  46. cp.set(ControllerPacket::Type::RIGHT);
  47. force += right;
  48. }
  49. if(force.squareLength() > 0.0f) {
  50. force.normalize();
  51. }
  52. Game::player.addForce(force * 0.1f);
  53. if(Game::controller.jump.isDown() && Game::player.isOnGround()) {
  54. cp.set(ControllerPacket::Type::JUMP);
  55. Game::player.addForce(up * (0.42f / 0.98f + 0.08f));
  56. }
  57. if(Game::controller.sneak.isDown()) {
  58. cp.set(ControllerPacket::Type::SNEAK);
  59. }
  60. if(Game::controller.camLeft.isDown()) {
  61. cp.set(ControllerPacket::Type::CAM_LEFT);
  62. Game::player.addLengthAngle(-rotationSpeed);
  63. }
  64. if(Game::controller.camRight.isDown()) {
  65. cp.set(ControllerPacket::Type::CAM_RIGHT);
  66. Game::player.addLengthAngle(rotationSpeed);
  67. }
  68. if(Game::controller.camUp.isDown()) {
  69. cp.set(ControllerPacket::Type::CAM_UP);
  70. Game::player.addWidthAngle(-rotationSpeed * 0.5f);
  71. }
  72. if(Game::controller.camDown.isDown()) {
  73. cp.set(ControllerPacket::Type::CAM_DOWN);
  74. Game::player.addWidthAngle(rotationSpeed * 0.5f);
  75. }
  76. OutPacket out = OutPacket::reliable(ControllerPacket::getSize());
  77. cp.write(out);
  78. GameClient::send(out);
  79. }
  80. static void renderConnectedState() {
  81. }
  82. static void tickConnectState() {
  83. startGUI.tick();
  84. StartGUI::Address a;
  85. if(startGUI.getAddress(a)) {
  86. Error error = GameClient::connect(a, 11196, 3000);
  87. if(error.has()) {
  88. LOG_INFO(error.message);
  89. } else {
  90. LOG_INFO("connected");
  91. tickState = tickConnectedState;
  92. renderState = renderConnectedState;
  93. }
  94. }
  95. }
  96. static void renderConnectState() {
  97. startGUI.render();
  98. }
  99. bool Game::init() {
  100. if(worldRenderer.init()) {
  101. return true;
  102. }
  103. controller.init();
  104. tickState = tickConnectState;
  105. renderState = renderConnectState;
  106. Game::player.setPosition(Vector3(0.0f, 2.0f, 0.0f));
  107. world.addEntity(&player);
  108. return false;
  109. }
  110. void Game::tick() {
  111. tickState();
  112. }
  113. void Game::renderWorld() {
  114. Engine::matrix.update(player.getRenderPosition(Engine::lag),
  115. player.getRenderRotation(Engine::lag));
  116. worldRenderer.render();
  117. }
  118. void Game::renderOverlay() {
  119. renderState();
  120. Engine::matrix.identity().scale(2.0f).update();
  121. StringBuffer<100> s;
  122. s.append("FPS: &074")
  123. .append(Engine::getFrameClock().getUpdatesPerSecond())
  124. .append(" &999TPS: &722")
  125. .append(Engine::getTickClock().getUpdatesPerSecond());
  126. Engine::renderer.renderString(Vector2(10.0f, 10.0f), s);
  127. s.clear().append("a = ").append(player.acceleration);
  128. Engine::renderer.renderString(Vector2(10.0f, 20.0f), s);
  129. s.clear().append("v = ").append(player.velocity);
  130. Engine::renderer.renderString(Vector2(10.0f, 30.0f), s);
  131. }
  132. void Game::onEntityUpdate(EntityUpdatePacket& p) {
  133. float distance = (p.position - player.position).squareLength();
  134. LOG_DEBUG(StringBuffer<50>(distance));
  135. if(distance > 25.0f) {
  136. LOG_DEBUG("set");
  137. player.setPosition(p.position);
  138. }
  139. // player.position = p.position;
  140. // player.lengthAngle = p.lengthAngle;
  141. // player.widthAngle = p.widthAngle;
  142. }