Implement drawing tiles

This commit is contained in:
Reimar 2025-10-23 12:20:46 +02:00
parent f735117edd
commit 2fe29c1c0c
11 changed files with 122 additions and 5 deletions

View File

@ -1,5 +1,6 @@
OBJS= \ OBJS= \
build/src/main.o \ build/src/main.o \
build/src/Map.o \
build/src/Game.o \ build/src/Game.o \
build/src/Player.o \ build/src/Player.o \
build/src/GameRenderer.o build/src/GameRenderer.o

BIN
assets/grass_tile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

BIN
assets/path_tile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 B

View File

@ -4,11 +4,11 @@
#include <iostream> #include <iostream>
Game::Game() : renderer("Zombo Shooter", 800, 450), player(&renderer) {} Game::Game() : renderer("Zombo Shooter", 800, 450), player(&renderer), map(&renderer, 40) {}
Game::~Game() = default; Game::~Game() = default;
void Game::run() const void Game::run()
{ {
while (true) { while (true) {
SDL_Event e; SDL_Event e;
@ -18,8 +18,23 @@ void Game::run() const
break; break;
} }
if (e.type == SDL_KEYDOWN) {
switch (e.key.keysym.sym) {
case SDLK_RIGHT:
case SDLK_d:
player.x_vel = 5;
case SDLK_LEFT:
case SDLK_a:
player.x_vel = -5;
}
}
player.update();
renderer.clear_screen(0x80, 0x40, 0xFF, 0xFF); renderer.clear_screen(0x80, 0x40, 0xFF, 0xFF);
map.draw(player.x, player.y);
player.draw(); player.draw();
renderer.flush(); renderer.flush();

View File

@ -3,19 +3,21 @@
#include "GameRenderer.hpp" #include "GameRenderer.hpp"
#include "Player.hpp" #include "Player.hpp"
#include "Map.hpp"
class Game class Game
{ {
private: private:
GameRenderer renderer; GameRenderer renderer;
Player player; Player player;
Map map;
public: public:
Game(); Game();
~Game(); ~Game();
void run() const; void run();
}; };
#endif #endif

46
src/Map.cpp Normal file
View File

@ -0,0 +1,46 @@
#include <vector>
#include <iostream>
#include "Map.hpp"
Map::Map(GameRenderer *renderer, int tile_size) :
renderer(renderer),
tile_size(tile_size),
tiles(renderer->screen_width / tile_size, std::vector(renderer->screen_height / tile_size, grass)),
tile_offset_x(-renderer->screen_width / tile_size / 2),
tile_offset_y(-renderer->screen_height / tile_size / 2)
{
grass_sprite = renderer->load_sprite("./assets/grass_tile.png", tile_size, tile_size);
path_sprite = renderer->load_sprite("./assets/path_tile.png", tile_size, tile_size);
}
void Map::generate_row() const
{
}
void Map::generate_col() const
{
}
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;
if (
screen_x < -tile_size || screen_y < -tile_size ||
screen_x > renderer->screen_width || screen_y > renderer->screen_height
) {
continue;
}
switch (tiles[tile_x][tile_y]) {
case grass: renderer->draw_sprite(grass_sprite, screen_x, screen_y); break;
case path: renderer->draw_sprite(path_sprite, screen_x, screen_y); break;
}
}
}
}

31
src/Map.hpp Normal file
View File

@ -0,0 +1,31 @@
#ifndef MAP_HPP
#define MAP_HPP
#include <vector>
#include "Tile.hpp"
#include "Sprite.hpp"
#include "GameRenderer.hpp"
class Map
{
private:
GameRenderer *renderer;
std::vector<std::vector<Tile>> tiles;
int tile_size;
int tile_offset_x;
int tile_offset_y;
Sprite grass_sprite;
Sprite path_sprite;
void generate_row() const;
void generate_col() const;
public:
Map(GameRenderer *renderer, int tile_size);
void draw(int player_x, int player_y) const;
};
#endif

View File

@ -14,3 +14,9 @@ void Player::draw() const
renderer->screen_height / 2 - hero_sprite.height / 2 renderer->screen_height / 2 - hero_sprite.height / 2
); );
} }
void Player::update()
{
x += x_vel;
y += y_vel;
}

View File

@ -8,13 +8,19 @@ class Player
private: private:
GameRenderer *renderer; GameRenderer *renderer;
Sprite hero_sprite; Sprite hero_sprite;
public:
int x = 0; int x = 0;
int y = 0; int y = 0;
public: int x_vel = 0;
int y_vel = 0;
Player(GameRenderer *renderer); Player(GameRenderer *renderer);
void draw() const; void draw() const;
void update();
}; };
#endif #endif

10
src/Tile.hpp Normal file
View File

@ -0,0 +1,10 @@
#ifndef TILE_HPP
#define TILE_HPP
enum Tile
{
grass,
path,
};
#endif

View File

@ -2,7 +2,7 @@
int main() int main()
{ {
const Game game = Game(); Game game = Game();
game.run(); game.run();