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 "Player.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() = 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()
{
update_thread = std::thread(&Game::update, this);
while (true) {
SDL_Event e;
SDL_WaitEvent(&e);
@ -22,21 +51,40 @@ void Game::run()
switch (e.key.keysym.sym) {
case SDLK_RIGHT:
case SDLK_d:
player.x_vel = 5;
player.x_vel = player.speed;
break;
case SDLK_LEFT:
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();
renderer.clear_screen(0x80, 0x40, 0xFF, 0xFF);
map.draw(player.x, player.y);
player.draw();
renderer.flush();
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;
}
}
draw();
}
}

View File

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

View File

@ -64,3 +64,12 @@ void GameRenderer::flush() const
{
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 flush() const;
void redraw() const;
};
#endif

View File

@ -1,5 +1,4 @@
#include <vector>
#include <iostream>
#include "Map.hpp"
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_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_y = player_y + tile_y * tile_size + tile_offset_y * tile_size + renderer->screen_height / 2;
int screen_x = tile_x * tile_size + tile_offset_x * tile_size + renderer->screen_width / 2 - player_x;
int screen_y = tile_y * tile_size + tile_offset_y * tile_size + renderer->screen_height / 2 - player_y;
if (
screen_x < -tile_size || screen_y < -tile_size ||

View File

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