Implement player movement

This commit is contained in:
Reimar 2025-10-23 14:37:46 +02:00
parent 2fe29c1c0c
commit 7f7aa9e72f
6 changed files with 87 additions and 19 deletions

View File

@ -1,15 +1,44 @@
#include <thread>
#include "GameRenderer.hpp" #include "GameRenderer.hpp"
#include "Player.hpp" #include "Player.hpp"
#include "Game.hpp" #include "Game.hpp"
#include <iostream> using namespace std::literals::chrono_literals;
Game::Game() : renderer("Zombo Shooter", 800, 450), player(&renderer), map(&renderer, 40) {} Game::Game() : renderer("Zombo Shooter", 800, 450), player(&renderer), map(&renderer, 40) {}
Game::~Game() = default; Game::~Game()
{
stopping = true;
update_thread.join();
}
void Game::update()
{
while (!stopping) {
player.update();
renderer.redraw();
std::this_thread::sleep_for(16666us);
}
}
void Game::draw() const
{
renderer.clear_screen(0x80, 0x40, 0xFF, 0xFF);
map.draw(player.x, player.y);
player.draw();
renderer.flush();
}
void Game::run() void Game::run()
{ {
update_thread = std::thread(&Game::update, this);
while (true) { while (true) {
SDL_Event e; SDL_Event e;
SDL_WaitEvent(&e); SDL_WaitEvent(&e);
@ -22,21 +51,40 @@ void Game::run()
switch (e.key.keysym.sym) { switch (e.key.keysym.sym) {
case SDLK_RIGHT: case SDLK_RIGHT:
case SDLK_d: case SDLK_d:
player.x_vel = 5; player.x_vel = player.speed;
break;
case SDLK_LEFT: case SDLK_LEFT:
case SDLK_a: case SDLK_a:
player.x_vel = -5; player.x_vel = -player.speed;
break;
case SDLK_DOWN:
case SDLK_s:
player.y_vel = player.speed;
break;
case SDLK_UP:
case SDLK_w:
player.y_vel = -player.speed;
break;
} }
} }
player.update(); if (e.type == SDL_KEYUP) {
switch (e.key.keysym.sym) {
case SDLK_RIGHT:
case SDLK_d:
case SDLK_LEFT:
case SDLK_a:
player.x_vel = 0;
break;
case SDLK_DOWN:
case SDLK_s:
case SDLK_UP:
case SDLK_w:
player.y_vel = 0;
break;
}
}
renderer.clear_screen(0x80, 0x40, 0xFF, 0xFF); draw();
map.draw(player.x, player.y);
player.draw();
renderer.flush();
} }
} }

View File

@ -1,6 +1,7 @@
#ifndef GAME_HPP #ifndef GAME_HPP
#define GAME_HPP #define GAME_HPP
#include <thread>
#include "GameRenderer.hpp" #include "GameRenderer.hpp"
#include "Player.hpp" #include "Player.hpp"
#include "Map.hpp" #include "Map.hpp"
@ -12,12 +13,19 @@ private:
Player player; Player player;
Map map; Map map;
std::thread update_thread;
bool stopping = false;
void update();
public: public:
Game(); Game();
~Game(); ~Game();
void run(); void run();
void draw() const;
}; };
#endif #endif

View File

@ -64,3 +64,12 @@ void GameRenderer::flush() const
{ {
SDL_RenderPresent(renderer); SDL_RenderPresent(renderer);
} }
void GameRenderer::redraw() const
{
SDL_Event event;
event.type = SDL_WINDOWEVENT;
event.window.event = SDL_WINDOWEVENT_EXPOSED;
event.window.windowID = SDL_GetWindowID(window);
SDL_PushEvent(&event);
}

View File

@ -28,6 +28,8 @@ public:
void clear_screen(int r, int g, int b, int a) const; void clear_screen(int r, int g, int b, int a) const;
void flush() const; void flush() const;
void redraw() const;
}; };
#endif #endif

View File

@ -1,5 +1,4 @@
#include <vector> #include <vector>
#include <iostream>
#include "Map.hpp" #include "Map.hpp"
Map::Map(GameRenderer *renderer, int tile_size) : Map::Map(GameRenderer *renderer, int tile_size) :
@ -27,8 +26,8 @@ void Map::draw(int player_x, int player_y) const
{ {
for (int tile_x = 0; tile_x < tiles.size(); tile_x++) { for (int tile_x = 0; tile_x < tiles.size(); tile_x++) {
for (int tile_y = 0; tile_y < tiles[tile_x].size(); tile_y++) { for (int tile_y = 0; tile_y < tiles[tile_x].size(); tile_y++) {
int screen_x = player_x + tile_x * tile_size + tile_offset_x * tile_size + renderer->screen_width / 2; int screen_x = tile_x * tile_size + tile_offset_x * tile_size + renderer->screen_width / 2 - player_x;
int screen_y = player_y + tile_y * tile_size + tile_offset_y * tile_size + renderer->screen_height / 2; int screen_y = tile_y * tile_size + tile_offset_y * tile_size + renderer->screen_height / 2 - player_y;
if ( if (
screen_x < -tile_size || screen_y < -tile_size || screen_x < -tile_size || screen_y < -tile_size ||

View File

@ -10,11 +10,13 @@ private:
Sprite hero_sprite; Sprite hero_sprite;
public: public:
int x = 0; double x = 0;
int y = 0; double y = 0;
int x_vel = 0; double x_vel = 0;
int y_vel = 0; double y_vel = 0;
const double speed = 0.9;
Player(GameRenderer *renderer); Player(GameRenderer *renderer);