diff options
Diffstat (limited to 'src/game.cpp')
| -rw-r--r-- | src/game.cpp | 135 |
1 files changed, 62 insertions, 73 deletions
| diff --git a/src/game.cpp b/src/game.cpp index 2db0a2c..cbbae06 100644 --- a/src/game.cpp +++ b/src/game.cpp | |||
| @@ -1,124 +1,113 @@ | |||
| 1 | #include "game.h" | 1 | #include "game.h" |
| 2 | #include "renderer.h" | 2 | #include "renderer.h" |
| 3 | #include "components.h" | ||
| 3 | 4 | ||
| 4 | Game::Game() | 5 | Game::Game() |
| 5 | { | 6 | { |
| 6 | window = initRenderer(); | 7 | m.setLeftMap(&m2); |
| 7 | glfwSwapInterval(1); | 8 | m2.setRightMap(&m); |
| 8 | |||
| 9 | m = new Map("../maps/embarass.txt"); | ||
| 10 | m2 = new Map("../maps/second.txt"); | ||
| 11 | |||
| 12 | m->setLeftMap(m2); | ||
| 13 | m2->setRightMap(m); | ||
| 14 | |||
| 15 | world = new World(); | ||
| 16 | 9 | ||
| 17 | auto player = std::make_shared<Entity>(world); | 10 | player = std::make_shared<Entity>(); |
| 11 | player->position = std::make_pair(100.0,100.0); | ||
| 12 | player->size = std::make_pair(10.0,12.0); | ||
| 18 | 13 | ||
| 19 | auto player_input = std::make_shared<UserMovementComponent>(*player); | 14 | auto player_input = std::make_shared<UserMovementComponent>(); |
| 20 | player->addComponent(player_input); | 15 | player->addComponent(player_input); |
| 21 | 16 | ||
| 22 | auto player_physics = std::make_shared<PlayerPhysicsComponent>(*player); | 17 | auto player_physics = std::make_shared<PlayerPhysicsComponent>(); |
| 23 | player_physics->position = std::make_pair(100.0,100.0); | ||
| 24 | player_physics->size = std::make_pair(10.0,12.0); | ||
| 25 | player->addComponent(player_physics); | 18 | player->addComponent(player_physics); |
| 26 | 19 | ||
| 27 | auto player_anim = std::make_shared<PlayerSpriteComponent>(*player, *player_physics); | 20 | auto player_anim = std::make_shared<PlayerSpriteComponent>(); |
| 28 | player->addComponent(player_anim); | 21 | player->addComponent(player_anim); |
| 29 | 22 | ||
| 30 | world->addEntity(player); | ||
| 31 | world->player = player; | ||
| 32 | |||
| 33 | loadMap(m); | 23 | loadMap(m); |
| 34 | } | 24 | } |
| 35 | 25 | ||
| 36 | Game::~Game() | 26 | void key_callback(GLFWwindow* window, int key, int, int action, int) |
| 37 | { | 27 | { |
| 38 | if (world != 0) | 28 | Game* game = (Game*) glfwGetWindowUserPointer(window); |
| 39 | { | ||
| 40 | delete world; | ||
| 41 | } | ||
| 42 | 29 | ||
| 43 | if (nextWorld != 0) | 30 | if ((key == GLFW_KEY_ESCAPE) && (action == GLFW_PRESS)) |
| 44 | { | 31 | { |
| 45 | delete nextWorld; | 32 | game->shouldQuit = true; |
| 46 | } | 33 | } |
| 47 | 34 | ||
| 48 | delete m; | 35 | for (auto entity : game->entities) |
| 49 | delete m2; | ||
| 50 | |||
| 51 | destroyRenderer(); | ||
| 52 | } | ||
| 53 | |||
| 54 | void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) | ||
| 55 | { | ||
| 56 | (void)window; | ||
| 57 | (void)scancode; | ||
| 58 | (void)mods; | ||
| 59 | |||
| 60 | if ((key == GLFW_KEY_ESCAPE) && (action == GLFW_PRESS)) | ||
| 61 | { | 36 | { |
| 62 | Game::getInstance().shouldQuit = true; | 37 | entity->input(*game, key, action); |
| 63 | } | 38 | } |
| 64 | |||
| 65 | Game::getInstance().input(key, action); | ||
| 66 | } | 39 | } |
| 67 | 40 | ||
| 68 | void Game::execute() | 41 | void Game::execute(GLFWwindow* window) |
| 69 | { | 42 | { |
| 43 | glfwSwapInterval(1); | ||
| 44 | glfwSetWindowUserPointer(window, this); | ||
| 70 | glfwSetKeyCallback(window, key_callback); | 45 | glfwSetKeyCallback(window, key_callback); |
| 71 | 46 | ||
| 72 | Texture* buffer = createTexture(GAME_WIDTH, GAME_HEIGHT); | 47 | Texture buffer(GAME_WIDTH, GAME_HEIGHT); |
| 73 | 48 | ||
| 49 | double lastTime = glfwGetTime(); | ||
| 50 | int nbFrames = 0; | ||
| 74 | while (!(shouldQuit || glfwWindowShouldClose(window))) | 51 | while (!(shouldQuit || glfwWindowShouldClose(window))) |
| 75 | { | 52 | { |
| 53 | double currentTime = glfwGetTime(); | ||
| 54 | nbFrames++; | ||
| 55 | if (currentTime - lastTime >= 1.0) | ||
| 56 | { | ||
| 57 | printf("%f ms/frame\n", 1000.0/double(nbFrames)); | ||
| 58 | nbFrames = 0; | ||
| 59 | lastTime += 1.0; | ||
| 60 | } | ||
| 61 | |||
| 76 | // Should we load a new world? | 62 | // Should we load a new world? |
| 77 | if (nextWorld != 0) | 63 | if (newWorld) |
| 78 | { | 64 | { |
| 79 | delete world; | 65 | newWorld = false; |
| 80 | world = nextWorld; | 66 | entities.clear(); |
| 81 | world->player->world = world; | 67 | entities = std::move(nextEntities); |
| 82 | nextWorld = 0; | ||
| 83 | } | 68 | } |
| 84 | 69 | ||
| 85 | // Handle input | 70 | // Handle input |
| 86 | glfwPollEvents(); | 71 | glfwPollEvents(); |
| 87 | 72 | ||
| 88 | // Tick! | 73 | // Tick! |
| 89 | world->tick(); | 74 | for (auto entity : entities) |
| 75 | { | ||
| 76 | entity->tick(*this); | ||
| 77 | } | ||
| 90 | 78 | ||
| 91 | // Do rendering | 79 | // Do rendering |
| 92 | world->render(buffer); | 80 | buffer.fill(buffer.entirety(), 0, 0, 0); |
| 93 | renderScreen(buffer); | 81 | for (auto entity : entities) |
| 94 | } | 82 | { |
| 95 | 83 | entity->render(*this, buffer); | |
| 96 | destroyTexture(buffer); | 84 | } |
| 97 | } | ||
| 98 | 85 | ||
| 99 | void Game::input(int key, int action) | 86 | buffer.renderScreen(); |
| 100 | { | ||
| 101 | if (world != NULL) | ||
| 102 | { | ||
| 103 | world->input(key, action); | ||
| 104 | } | 87 | } |
| 105 | } | 88 | } |
| 106 | 89 | ||
| 107 | void Game::loadMap(Map* map) | 90 | void Game::loadMap(Map& map) |
| 108 | { | 91 | { |
| 109 | nextWorld = new World(); | 92 | auto mapEn = std::make_shared<Entity>(); |
| 110 | |||
| 111 | nextWorld->player = world->player; | ||
| 112 | |||
| 113 | auto mapEn = std::make_shared<Entity>(nextWorld); | ||
| 114 | 93 | ||
| 115 | auto map_render = std::make_shared<MapRenderComponent>(*mapEn, map); | 94 | auto map_render = std::make_shared<MapRenderComponent>(map); |
| 116 | mapEn->addComponent(map_render); | 95 | mapEn->addComponent(map_render); |
| 117 | 96 | ||
| 118 | auto map_collision = std::make_shared<MapCollisionComponent>(*mapEn, map); | 97 | auto map_collision = std::make_shared<MapCollisionComponent>(map); |
| 119 | mapEn->addComponent(map_collision); | 98 | mapEn->addComponent(map_collision); |
| 120 | nextWorld->bodies.push_back(map_collision.get()); | ||
| 121 | 99 | ||
| 122 | nextWorld->addEntity(mapEn); | 100 | nextEntities.clear(); |
| 123 | nextWorld->addEntity(nextWorld->player); | 101 | nextEntities.push_back(mapEn); |
| 102 | nextEntities.push_back(player); | ||
| 103 | |||
| 104 | newWorld = true; | ||
| 105 | } | ||
| 106 | |||
| 107 | void Game::detectCollision(Entity& collider, std::pair<double, double> old_position) | ||
| 108 | { | ||
| 109 | for (auto entity : entities) | ||
| 110 | { | ||
| 111 | entity->detectCollision(*this, collider, old_position); | ||
| 112 | } | ||
| 124 | } | 113 | } |
