Mapa piràmide 4×5 amb muros i passadissos de 16 px + motor de colisions AABB amb snap al passadís (v0.12.0)
This commit is contained in:
1 parent
297dc85e47
commit
c921833537
7 files changed
+360
-18
No files matched your search
@@ -2,12 +2,18 @@
|
||||
|
||||
#include <SDL3/SDL.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
#include <iterator>
|
||||
#include <vector>
|
||||
|
||||
#include "core/input/global_inputs.hpp"
|
||||
#include "core/rendering/notifier.hpp"
|
||||
#include "core/rendering/render_info.hpp"
|
||||
#include "core/rendering/screen.hpp"
|
||||
#include "core/resources/resource_cache.hpp"
|
||||
#include "game/entities/player.hpp"
|
||||
#include "game/map/map.hpp"
|
||||
#include "game/ui/ui_palette.hpp"
|
||||
#include "utils/defaults.hpp"
|
||||
#include "utils/defines.hpp"
|
||||
@@ -25,9 +31,16 @@ GameScene::GameScene() {
|
||||
.left = Defaults::KeysGame::LEFT,
|
||||
.right = Defaults::KeysGame::RIGHT,
|
||||
};
|
||||
const float X = static_cast<float>(GameCanvas::CENTER_X) - (static_cast<float>(Player::SPRITE_WIDTH) / 2.0F);
|
||||
const float Y = static_cast<float>(GameCanvas::CENTER_Y) - (static_cast<float>(Player::SPRITE_HEIGHT) / 2.0F);
|
||||
players_.emplace_back(std::make_unique<Player>(X, Y, CONTROLS_P1));
|
||||
// Spawn centrat al passadís exterior superior: la caixa de col·lisió
|
||||
// queda dins del passadís vertical del mig (entre columnes 1 i 2) i
|
||||
// centrada en Y al passadís exterior superior. Així no naix dins de
|
||||
// cap sarcòfag.
|
||||
constexpr auto CORRIDOR_CENTER_X = static_cast<float>(GameCanvas::CENTER_X);
|
||||
constexpr auto CORRIDOR_CENTER_Y =
|
||||
static_cast<float>(Map::PLAYFIELD_Y) + (static_cast<float>(Map::OUTER_CORRIDOR) / 2.0F);
|
||||
constexpr auto SPAWN_X = CORRIDOR_CENTER_X - (static_cast<float>(Player::SPRITE_WIDTH) / 2.0F);
|
||||
constexpr auto SPAWN_Y = CORRIDOR_CENTER_Y - static_cast<float>(Player::COLLISION_Y_OFFSET) - (static_cast<float>(Player::COLLISION_SIZE) / 2.0F);
|
||||
players_.emplace_back(std::make_unique<Player>(SPAWN_X, SPAWN_Y, CONTROLS_P1));
|
||||
}
|
||||
|
||||
GameScene::~GameScene() = default;
|
||||
@@ -45,7 +58,40 @@ void GameScene::update(int delta_ms) {
|
||||
void GameScene::render() {
|
||||
const auto BG_ARGB = Resource::Cache::get().getPalette("ui")[UiColor::CANVAS_BG];
|
||||
Screen::get().fillRect(0, 0, GameCanvas::WIDTH, GameCanvas::HEIGHT, BG_ARGB);
|
||||
for (auto& player : players_) { player->render(); }
|
||||
|
||||
// Fons del mapa (marcador, muros, sòl). Els sarcòfags es pinten després
|
||||
// fila a fila entrellaçats amb els jugadors per al Z-order.
|
||||
Map::renderBackground();
|
||||
|
||||
// Ordenem punters a jugadors per Y dels peus (ascendent = més al fons
|
||||
// primer). Usem un vector auxiliar per no tocar l'ordre d'entrada de
|
||||
// players_, que és el d'assignació de controls.
|
||||
std::vector<Player*> sorted;
|
||||
sorted.reserve(players_.size());
|
||||
std::ranges::transform(players_, std::back_inserter(sorted), [](const auto& p) { return p.get(); });
|
||||
std::ranges::sort(sorted, [](const Player* a, const Player* b) {
|
||||
return a->getFeetY() < b->getFeetY();
|
||||
});
|
||||
|
||||
// Interleaving: per cada fila de sarcòfags, primer pintem els jugadors
|
||||
// que hi queden "darrere" (peus per sobre de la cara inferior de la fila)
|
||||
// i després la fila. Un jugador amb els peus davall d'una fila es pinta
|
||||
// sobre d'ella (el seu cap tapa la fila superior si s'hi encavalca).
|
||||
std::size_t p = 0;
|
||||
for (int row = 0; row < Map::GRID_ROWS; ++row) {
|
||||
const auto ROW_BOTTOM = static_cast<float>(Map::getSarcRowBottomY(row));
|
||||
while (p < sorted.size() && sorted[p]->getFeetY() <= ROW_BOTTOM) {
|
||||
sorted[p]->render();
|
||||
++p;
|
||||
}
|
||||
Map::renderSarcsRow(row);
|
||||
}
|
||||
// Jugadors que queden per davall de l'última fila de sarcòfags.
|
||||
while (p < sorted.size()) {
|
||||
sorted[p]->render();
|
||||
++p;
|
||||
}
|
||||
|
||||
Notifier::get().render();
|
||||
RenderInfo::get().render();
|
||||
Screen::get().present();
|
||||
|
||||
Reference in new issue
Block a user