Improve gameplay

This commit is contained in:
2025-07-19 21:41:47 +03:00
parent 5f3626ef91
commit f1e896671c
10 changed files with 403 additions and 134 deletions
+11 -67
View File
@@ -6,83 +6,27 @@ g888g858gg
g8g8g8g8gg g8g8g8g8gg
g858g8g8gg g858g8g8gg
Room
gggggggggg
gggggggggg
gggggggggg
gggggggggg
gggggggggg
gggggggggg
Room
0000gggggg
0000gggggg
0000gggggg
0000gggggg
0000gggggg
gggggggggg
Room
gggggg0000
gggggg0000
gggggg0000
gggggg0000
gggggg0000
gggggggggg
Room
000000000g
000000000g
000000000g
000000000g
000000000g
gggggggggg
Room
g000000000
g000000000
g000000000
g000000000
g000000000
gggggggggg
Room Room
0000l00000 0000l00000
0000l00000 0000l00000
7775557757 7775557757
5557775575 5557775575
0000000000 00t0000t00
gggggggggg GGGGGGGGGG
Room Room
g000l0000g g0g0gg0g0g
g000l0000g g00000000g
g000l0000g g00000000g
g000l0000g 00t0000t00
gDDDlDDDDg 0DDDDDDDD0
gggggggggg GGGGGGGGGG
Room Room
0000000000 0gggggggg0
0000000000 0gtggggtg0
0000000000 dgdgddgdgd
0000000000
dddddddddd
gggggggggg gggggggggg
Room
0000000000
0000000000
0000000000
0000000000
dddddddddd
gggggggggg gggggggggg
Room
0000000000
0000000000
0000000000
0000000000
dddddddddd
gggggggggg gggggggggg
+19 -3
View File
@@ -2,14 +2,30 @@ Room
5555555555 5555555555
0000000000 0000000000
0000000000 0000000000
0000000000 00t0000t00
0000000000 0D00DD0pD0
GGGGGGGGGG GGGGGGGGGG
Room Room
5555555555 5555555555
0000000000 00t00p0t00
000lGGGGl0 000lGGGGl0
000lggggl0 000lggggl0
000lggggl0 000lggggl0
GGGGggggGG GGGGggggGG
Room
0000000000
00t00p0t00
0lg00g00gl
0l000g000l
0lDDDgDDDl
GGGGGGGGGG
Room
0000000000
00t0000t00
000D0pD000
00gggggg00
0gggggggg0
GggggggggG
+12 -4
View File
@@ -3,13 +3,21 @@ Room
0000000000 0000000000
0000000000 0000000000
0000000000 0000000000
0000000000 0tp00000t0
GGGGPPPPGG GGGGPPPPGG
Room Room
0000000000 0000000000
0000000000 0000000000
0000000000 0t000p00t0
0lgggggggl 00ggggggg0
0l000000gl 00000000g0
GGGGPPPPgG GGGGPPPPgG
Room
0000000000
0000000000
0000000000
0t000000t0
000000p000
GPPGPPGPPG
+4 -4
View File
@@ -2,14 +2,14 @@ Room
0000l00000 0000l00000
0000l00000 0000l00000
0000l00000 0000l00000
0000l00000 0t00l000t0
0000l00000 0000l0p000
GGGGGGGGGG GGGGGGGGGG
Room Room
0000l00000 0000l00000
0000l00000 00t0l00t00
0lggggggl0 0lggggggl0
0l000000l0 0l000000l0
0l000000l0 0l00p000l0
GGGGGGGGGG GGGGGGGGGG
+4 -4
View File
@@ -2,14 +2,14 @@ Room
0000l00000 0000l00000
0000l00000 0000l00000
0000l00000 0000l00000
0000l00000 0t00l000t0
0000l00000 0p00l00000
GGPPlPPPGG GGPPlPPPGG
Room Room
0000l00000 0000l00000
0000l00000 0t00l000t0
ggggggglgg ggggggglgg
0000000l00 0000000l00
0000l00l00 0000l0pl00
GGPPlGGGGG GGPPlGGGGG
+28
View File
@@ -11,6 +11,15 @@ TEntityManager::TEntityManager(TRenderManager& renderManager, std::size_t timest
} }
void TEntityManager::Run() { void TEntityManager::Run() {
if (PendingReset_) {
PendingReset_ = false;
Entities_.clear();
for (const auto& name : DeferredEntities_) {
MakeEntityByName(name);
}
DeferredEntities_.clear();
}
Input(); Input();
Update(); Update();
Draw(); Draw();
@@ -85,6 +94,25 @@ std::unordered_set<TEntity::TId> TEntityManager::CollisionList(const Vec2i& posi
return query; return query;
} }
std::vector<TEntity::TId> TEntityManager::Ids() const {
std::vector<TEntity::TId> result;
result.reserve(Entities_.size());
for (const auto& entity : Entities_) {
result.push_back(entity.first);
}
return result;
}
void TEntityManager::AddToDeferred(const std::string& name) {
DeferredEntities_.push_back(name);
}
void TEntityManager::Reset() {
PendingReset_ = true;
}
void TEntityManager::Input() { void TEntityManager::Input() {
SDL_Event event; SDL_Event event;
while (RenderManager_.Input(&event)) { while (RenderManager_.Input(&event)) {
+5
View File
@@ -40,6 +40,9 @@ public:
std::shared_ptr<TEntity> MakeEntityByName(const std::string& name); std::shared_ptr<TEntity> MakeEntityByName(const std::string& name);
bool IsPlaceEmpty(const Vec2i& position, const Vec2i& size, TEntity::TCollisionGroup group, TEntity::TId ignoreId = {}); bool IsPlaceEmpty(const Vec2i& position, const Vec2i& size, TEntity::TCollisionGroup group, TEntity::TId ignoreId = {});
std::unordered_set<TEntity::TId> CollisionList(const Vec2i& position, const Vec2i& size, TEntity::TCollisionGroup group, TEntity::TId ignoreId = {}); std::unordered_set<TEntity::TId> CollisionList(const Vec2i& position, const Vec2i& size, TEntity::TCollisionGroup group, TEntity::TId ignoreId = {});
std::vector<TEntity::TId> Ids() const;
void AddToDeferred(const std::string& name);
void Reset();
private: private:
using TFactoryMethod = std::shared_ptr<TEntity>(*)(TEntity::TId); using TFactoryMethod = std::shared_ptr<TEntity>(*)(TEntity::TId);
@@ -57,10 +60,12 @@ private:
TRenderManager& RenderManager_; TRenderManager& RenderManager_;
std::unordered_map<TEntity::TId, std::shared_ptr<TEntity>> Entities_; std::unordered_map<TEntity::TId, std::shared_ptr<TEntity>> Entities_;
std::unordered_map<std::string, TFactoryMethod> EntityFactories_; std::unordered_map<std::string, TFactoryMethod> EntityFactories_;
std::vector<std::string> DeferredEntities_;
std::uint32_t LastUpdateTick_; std::uint32_t LastUpdateTick_;
TEntity::TId IdCounter_; TEntity::TId IdCounter_;
std::size_t Timestep_; std::size_t Timestep_;
TGridmap Gridmap_; TGridmap Gridmap_;
bool PendingReset_ = false;
}; };
} // namespace NGame } // namespace NGame
+8 -7
View File
@@ -15,7 +15,7 @@ static NGame::TApp *app = nullptr;
static void InitApp(void) { static void InitApp(void) {
app = NGame::TApp::Instance(); app = NGame::TApp::Instance();
app->EntityManager().RegisterEntity<THero>("Hero"); app->EntityManager().RegisterEntity<THero>("HeroEntity");
app->EntityManager().RegisterEntity<TDirtEntity>("DirtEntity"); app->EntityManager().RegisterEntity<TDirtEntity>("DirtEntity");
app->EntityManager().RegisterEntity<TGrassEntity>("GrassEntity"); app->EntityManager().RegisterEntity<TGrassEntity>("GrassEntity");
app->EntityManager().RegisterEntity<TPlankEntity>("PlankEntity"); app->EntityManager().RegisterEntity<TPlankEntity>("PlankEntity");
@@ -32,13 +32,14 @@ static void InitApp(void) {
app->EntityManager().RegisterEntity<TBackgroundTiler>("BackgroundTiler"); app->EntityManager().RegisterEntity<TBackgroundTiler>("BackgroundTiler");
app->EntityManager().RegisterEntity<TRoomEntity>("RoomEntity"); app->EntityManager().RegisterEntity<TRoomEntity>("RoomEntity");
app->EntityManager().RegisterEntity<TRubbleEntity>("RubbleEntity"); app->EntityManager().RegisterEntity<TRubbleEntity>("RubbleEntity");
app->EntityManager().RegisterEntity<TMainMenu>("MainMenu");
app->EntityManager().RegisterEntity<TIntroMenu>("IntroMenu");
app->EntityManager().RegisterEntity<TOutroMenu>("OutroMenu");
app->EntityManager().RegisterEntity<TEulaMenu>("EulaMenu");
app->EntityManager().RegisterEntity<TTorchEntity>("TorchEntity");
app->EntityManager().MakeEntityByName("RoomEntity"); app->EntityManager().AddToDeferred("RoomEntity");
app->EntityManager().MakeEntityByName("BackgroundTiler"); app->EntityManager().Reset();
auto h = app->EntityManager().MakeEntityByName("Hero");
h->SetPosition({0, -16});
app->EntityManager().UpdateCollision(h);
} }
static void MainLoop(void) { static void MainLoop(void) {
+231 -39
View File
@@ -81,11 +81,10 @@ TStoneEntity::TStoneEntity(NGame::TEntity::TId id)
, SpriteManager_(App_->SpriteManager()) { , SpriteManager_(App_->SpriteManager()) {
SetCollisionGroup(TERRAIN_GROUP); SetCollisionGroup(TERRAIN_GROUP);
SetSize({16, 16}); SetSize({16, 16});
Sprite_ = NGame::TApp::Instance()->SpriteManager().Get("Sprites/Wall.txt"); Sprite_ = NGame::TApp::Instance()->SpriteManager().Get("Sprites/PushRock.txt");
} }
void TStoneEntity::Update(std::uint32_t delta) { void TStoneEntity::Update(std::uint32_t delta) {
} }
void TStoneEntity::Draw() const { void TStoneEntity::Draw() const {
@@ -110,10 +109,6 @@ void TLadderEntity::Update(std::uint32_t delta) {
void TLadderEntity::Draw() const { void TLadderEntity::Draw() const {
NGame::TApp::Instance()->RenderManager().SetLayer(NGame::TRenderManager::Background); NGame::TApp::Instance()->RenderManager().SetLayer(NGame::TRenderManager::Background);
NGame::TApp::Instance()->SpriteManager().Draw(Sprite_, 0, Position()); NGame::TApp::Instance()->SpriteManager().Draw(Sprite_, 0, Position());
NGame::TApp::Instance()->RenderManager().SetLayer(NGame::TRenderManager::Light);
auto light = NGame::TApp::Instance()->SpriteManager().Get("Sprites/Light.txt");
NGame::TApp::Instance()->SpriteManager().Draw(light, 1, Position() - (light->Frames[1].Size * 2 / 2) + Size() / 2, {2, 2});
} }
TExplosionEntity::TExplosionEntity(NGame::TEntity::TId id) TExplosionEntity::TExplosionEntity(NGame::TEntity::TId id)
@@ -315,7 +310,7 @@ void TExitEntity::Update(std::uint32_t delta) {
void TExitEntity::Draw() const { void TExitEntity::Draw() const {
NGame::TApp::Instance()->RenderManager().SetLayer(NGame::TRenderManager::Background); NGame::TApp::Instance()->RenderManager().SetLayer(NGame::TRenderManager::Background);
NGame::TApp::Instance()->SpriteManager().Draw(Sprite_, 0, Position()); NGame::TApp::Instance()->SpriteManager().Draw(Sprite_, 1, Position());
} }
TFloatingTextEntity::TFloatingTextEntity(NGame::TEntity::TId id) TFloatingTextEntity::TFloatingTextEntity(NGame::TEntity::TId id)
@@ -418,9 +413,7 @@ void TRoomEntity::FillRow(const std::string& data, std::size_t row, TRoom& room)
case 'D': room.data[row * 10 + i] = Spike; break; case 'D': room.data[row * 10 + i] = Spike; break;
case 'p': room.data[row * 10 + i] = Passage; break; case 'p': room.data[row * 10 + i] = Passage; break;
case 'P': room.data[row * 10 + i] = Plank; break; case 'P': room.data[row * 10 + i] = Plank; break;
case 'c': room.data[row * 10 + i] = Curse; break; case 't': room.data[row * 10 + i] = Torch; break;
case 'b': room.data[row * 10 + i] = Baddy; break;
case 'u': room.data[row * 10 + i] = Utility; break;
default: break; default: break;
} }
} }
@@ -515,6 +508,40 @@ void TRoomEntity::GenerateLayout() {
GenerateRoom(maze, NGame::Vec2i(j, i)); GenerateRoom(maze, NGame::Vec2i(j, i));
} }
} }
// Add border
for (int i = -1; i <= ROOM_WIDTH * 10; i++) {
auto wall = NGame::TApp::Instance()->EntityManager().MakeEntityByName("StoneEntity");
wall->SetPosition({i * 16, -16});
NGame::TApp::Instance()->EntityManager().UpdateCollision(wall);
wall = NGame::TApp::Instance()->EntityManager().MakeEntityByName("StoneEntity");
wall->SetPosition({i * 16, 16 * (ROOM_HEIGHT * 6)});
NGame::TApp::Instance()->EntityManager().UpdateCollision(wall);
}
for (int i = -1; i <= ROOM_HEIGHT * 6; i++) {
auto wall = NGame::TApp::Instance()->EntityManager().MakeEntityByName("StoneEntity");
wall->SetPosition({-16, i * 16});
NGame::TApp::Instance()->EntityManager().UpdateCollision(wall);
wall = NGame::TApp::Instance()->EntityManager().MakeEntityByName("StoneEntity");
wall->SetPosition({16 * (ROOM_WIDTH * 10), i * 16});
NGame::TApp::Instance()->EntityManager().UpdateCollision(wall);
}
// Create background tiler and hero entity
NGame::TApp::Instance()->EntityManager().MakeEntityByName("BackgroundTiler");
auto hero = NGame::TApp::Instance()->EntityManager().MakeEntityByName("HeroEntity");
for (const auto& otherId : NGame::TApp::Instance()->EntityManager().Ids()) {
auto other = NGame::TApp::Instance()->EntityManager().Entity(otherId);
if (dynamic_cast<TEntranceEntity*>(other.get())) {
hero->SetPosition(other->Position());
NGame::TApp::Instance()->EntityManager().UpdateCollision(hero);
break;
}
}
} }
void TRoomEntity::GenerateRoom(int* maze, const NGame::Vec2i& position) { void TRoomEntity::GenerateRoom(int* maze, const NGame::Vec2i& position) {
@@ -522,6 +549,7 @@ void TRoomEntity::GenerateRoom(int* maze, const NGame::Vec2i& position) {
auto roomType = maze[ROOM_WIDTH * position.Y + position.X]; auto roomType = maze[ROOM_WIDTH * position.Y + position.X];
TRoom sourceRoom; TRoom sourceRoom;
int randomRoomChance = rand() % 100; int randomRoomChance = rand() % 100;
NGame::Vec2i startPosition = {0, 0};
SelectRoom(roomType & LeftRightUpDown, sourceRoom); SelectRoom(roomType & LeftRightUpDown, sourceRoom);
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
@@ -571,32 +599,24 @@ void TRoomEntity::GenerateRoom(int* maze, const NGame::Vec2i& position) {
break; break;
case Mine: case Mine:
if (NGame::TApp::Instance()->State().Variable("MoreMines").Bool()) { entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("MineEntity");
if (rand() % 100 < 50) {
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("MineEntity");
}
} else {
if (rand() % 100 < 25) {
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("MineEntity");
}
}
break; break;
case Passage: case Passage:
if (roomType & (Start | Exit)) { if (roomType & Start) {
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("EntranceEntity"); entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("EntranceEntity");
} } else if (roomType & Exit) {
break; entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("ExitEntity");
case Curse:
if (rand() % 100 < 25) {
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("CurseEntity");
} }
break; break;
case Spike: case Spike:
if (rand() % 100 < 75) { entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("SpikeEntity");
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("SpikeEntity"); break;
case Torch:
if (rand() % 100 < 15) {
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("TorchEntity");
} }
break; break;
} }
@@ -616,17 +636,17 @@ void TRoomEntity::SelectRoom(int type, TRoom& room) {
if (type == LeftRight) { if (type == LeftRight) {
selection.insert(selection.end(), LRRooms_.begin(), LRRooms_.end()); selection.insert(selection.end(), LRRooms_.begin(), LRRooms_.end());
selection.insert(selection.end(), LRDRooms_.begin(), LRDRooms_.end()); // selection.insert(selection.end(), LRDRooms_.begin(), LRDRooms_.end());
selection.insert(selection.end(), LRURooms_.begin(), LRURooms_.end()); // selection.insert(selection.end(), LRURooms_.begin(), LRURooms_.end());
selection.insert(selection.end(), LRUDRooms_.begin(), LRUDRooms_.end()); // selection.insert(selection.end(), LRUDRooms_.begin(), LRUDRooms_.end());
room = selection[rand() % selection.size()]; room = selection[rand() % selection.size()];
} else if (type == LeftRightUp) { } else if (type == LeftRightUp) {
selection.insert(selection.end(), LRURooms_.begin(), LRURooms_.end()); selection.insert(selection.end(), LRURooms_.begin(), LRURooms_.end());
selection.insert(selection.end(), LRUDRooms_.begin(), LRUDRooms_.end()); // selection.insert(selection.end(), LRUDRooms_.begin(), LRUDRooms_.end());
room = selection[rand() % selection.size()]; room = selection[rand() % selection.size()];
} else if (type == LeftRightDown) { } else if (type == LeftRightDown) {
selection.insert(selection.end(), LRDRooms_.begin(), LRDRooms_.end()); selection.insert(selection.end(), LRDRooms_.begin(), LRDRooms_.end());
selection.insert(selection.end(), LRUDRooms_.begin(), LRUDRooms_.end()); // selection.insert(selection.end(), LRUDRooms_.begin(), LRUDRooms_.end());
room = selection[rand() % selection.size()]; room = selection[rand() % selection.size()];
} else if (type == LeftRightUpDown) { } else if (type == LeftRightUpDown) {
room = LRUDRooms_[rand() % LRUDRooms_.size()]; room = LRUDRooms_[rand() % LRUDRooms_.size()];
@@ -649,10 +669,22 @@ THero::THero(NGame::TEntity::TId id)
SetSize(NGame::Vec2i(4, 12)); SetSize(NGame::Vec2i(4, 12));
SetPosition(NGame::Vec2i(0, 0)); SetPosition(NGame::Vec2i(0, 0));
SetCollisionGroup(HERO_GROUP); SetCollisionGroup(HERO_GROUP);
NGame::TApp::Instance()->RenderManager().EnableLight(false); NGame::TApp::Instance()->RenderManager().EnableLight(true);
NGame::TApp::Instance()->RenderManager().SetDefaultLightColor(255, 0, 0); NGame::TApp::Instance()->RenderManager().SetDefaultLightColor(0, 0, 0);
Alarm_.Set(0, 100); Alarm_.Set(0, 100);
// Find exit entity
auto otherIds = App_->EntityManager().Ids();
ExitPosition_ = {0, 0};
for (const auto& otherId : otherIds) {
auto other = App_->EntityManager().Entity(otherId);
if (dynamic_cast<TExitEntity*>(other.get())) {
ExitPosition_ = other->Position();
break;
}
}
} }
void THero::Input(SDL_Event* event) { void THero::Input(SDL_Event* event) {
@@ -1007,7 +1039,11 @@ void THero::Update(std::uint32_t delta) {
} }
// Set camera to track hero // Set camera to track hero
RenderManager_.SetCamera(Position() - App_->RenderManager().Size() / 2); auto cameraPosition = Position() + Size() / 2 - RenderManager_.Size() / 2;
cameraPosition.X = std::min(std::max(cameraPosition.X, -16), 16 * 10 * ROOM_WIDTH - RenderManager_.Size().X + 16);
cameraPosition.Y = std::min(std::max(cameraPosition.Y, -16), 16 * 6 * ROOM_HEIGHT - RenderManager_.Size().Y + 16);
RenderManager_.SetCamera(cameraPosition);
// Reset pressed keys // Reset pressed keys
IgnorePlanks_ = false; IgnorePlanks_ = false;
@@ -1042,6 +1078,48 @@ void THero::Draw() const {
RenderManager_.SetLayer(NGame::TRenderManager::Light); RenderManager_.SetLayer(NGame::TRenderManager::Light);
auto light = SpriteManager_.Get("Sprites/Light.txt"); auto light = SpriteManager_.Get("Sprites/Light.txt");
SpriteManager_.Draw(light, 0, Position() - (light->Frames[0].Size * 4 / 2), {4, 4}); SpriteManager_.Draw(light, 0, Position() - (light->Frames[0].Size * 4 / 2), {4, 4});
if (!App_->State().Variable("NoCompas").Bool()) {
auto heroCenter = RenderManager_.Camera() + RenderManager_.Size() / 2;
auto delta = ExitPosition_ - heroCenter;
auto halfScreenSize = RenderManager_.Size() / 2;
auto screenPosition = delta + halfScreenSize;
if (screenPosition.X < 0 || screenPosition.X > 304 ||
screenPosition.Y < 16 || screenPosition.Y > 224) {
int index = 0;
if (std::abs(delta.X) > std::abs(delta.Y)) {
if (screenPosition.X < halfScreenSize.X) {
index = 2;
} else {
index = 0;
}
} else {
if (screenPosition.Y < halfScreenSize.Y) {
index = 1;
} else {
index = 3;
}
}
RenderManager_.SetLayer(NGame::TRenderManager::Interface);
screenPosition.X = std::min(std::max(screenPosition.X, 0), RenderManager_.Size().X - 16);
screenPosition.Y = std::min(std::max(screenPosition.Y, 16), RenderManager_.Size().Y - 16);
auto arrow = SpriteManager_.Get("Sprites/Arrow.txt");
SpriteManager_.Draw(arrow, index, screenPosition);
}
}
if (FadeAmount_) {
RenderManager_.SetLayer(NGame::TRenderManager::Interface);
if (WhiteFade_) {
RenderManager_.SetColor(255, 255, 255, FadeAmount_);
} else {
RenderManager_.SetColor(0, 0, 0, FadeAmount_);
}
RenderManager_.DrawRect({0, 0}, {320, 240}, true);
}
} }
void THero::Alarm(NGame::TAlarm::TId id) { void THero::Alarm(NGame::TAlarm::TId id) {
@@ -1078,7 +1156,8 @@ TRubbleEntity::TRubbleEntity(NGame::TEntity::TId id)
, SpriteManager_(App_->SpriteManager()) { , SpriteManager_(App_->SpriteManager()) {
SetSize(8); SetSize(8);
Sprite_ = NGame::TApp::Instance()->SpriteManager().Get("Sprites/Stone.txt"); Sprite_ = NGame::TApp::Instance()->SpriteManager().Get("Sprites/Stone.txt");
Alarm_.Set(0, 5000); Alarm_.Set(0, 3000 + rand() % 1000);
Flip_ = (rand() % 2) == 0;
} }
void TRubbleEntity::Update(std::uint32_t delta) { void TRubbleEntity::Update(std::uint32_t delta) {
@@ -1105,7 +1184,11 @@ void TRubbleEntity::Update(std::uint32_t delta) {
void TRubbleEntity::Draw() const { void TRubbleEntity::Draw() const {
RenderManager_.SetLayer(NGame::TRenderManager::Foreground); RenderManager_.SetLayer(NGame::TRenderManager::Foreground);
SpriteManager_.Draw(Sprite_, 0, Position()); if (Flip_) {
SpriteManager_.Draw(Sprite_, 0, Position());
} else {
SpriteManager_.Draw(Sprite_, 0, Position(), {-1, 1});
}
} }
void TRubbleEntity::Alarm(NGame::TAlarm::TId id) { void TRubbleEntity::Alarm(NGame::TAlarm::TId id) {
@@ -1120,4 +1203,113 @@ const NGame::Vec2f& TRubbleEntity::Speed() const {
void TRubbleEntity::SetSpeed(const NGame::Vec2f& speed) { void TRubbleEntity::SetSpeed(const NGame::Vec2f& speed) {
Speed_ = speed; Speed_ = speed;
} }
TMainMenu::TMainMenu(NGame::TEntity::TId id)
: NGame::TEntity(id)
, App_(NGame::TApp::Instance())
, RenderManager_(App_->RenderManager())
, SpriteManager_(App_->SpriteManager()) {
}
void TMainMenu::Update(std::uint32_t delta) {
}
void TMainMenu::Draw() const {
}
void TMainMenu::Alarm(NGame::TAlarm::TId id) {
}
TEulaMenu::TEulaMenu(NGame::TEntity::TId id)
: NGame::TEntity(id)
, App_(NGame::TApp::Instance())
, RenderManager_(App_->RenderManager())
, SpriteManager_(App_->SpriteManager()) {
}
void TEulaMenu::Update(std::uint32_t delta) {
}
void TEulaMenu::Draw() const {
}
void TEulaMenu::Alarm(NGame::TAlarm::TId id) {
}
TIntroMenu::TIntroMenu(NGame::TEntity::TId id)
: NGame::TEntity(id)
, App_(NGame::TApp::Instance())
, RenderManager_(App_->RenderManager())
, SpriteManager_(App_->SpriteManager()) {
}
void TIntroMenu::Update(std::uint32_t delta) {
}
void TIntroMenu::Draw() const {
}
void TIntroMenu::Alarm(NGame::TAlarm::TId id) {
}
TOutroMenu::TOutroMenu(NGame::TEntity::TId id)
: NGame::TEntity(id)
, App_(NGame::TApp::Instance())
, RenderManager_(App_->RenderManager())
, SpriteManager_(App_->SpriteManager()) {
}
void TOutroMenu::Update(std::uint32_t delta) {
}
void TOutroMenu::Draw() const {
}
void TOutroMenu::Alarm(NGame::TAlarm::TId id) {
}
TTorchEntity::TTorchEntity(NGame::TEntity::TId id)
: NGame::TEntity(id)
, App_(NGame::TApp::Instance())
, RenderManager_(App_->RenderManager())
, SpriteManager_(App_->SpriteManager()) {
SetSize(16);
Sprite_ = SpriteManager_.Get("Sprites/Item.txt");
LightSprite_ = SpriteManager_.Get("Sprites/Light.txt");
}
void TTorchEntity::Update(std::uint32_t delta) {
}
void TTorchEntity::Draw() const {
RenderManager_.SetLayer(NGame::TRenderManager::Background);
SpriteManager_.Draw(Sprite_, 2, Position());
if (RenderManager_.IsLightEnabled()) {
RenderManager_.SetLayer(NGame::TRenderManager::Light);
SpriteManager_.Draw(LightSprite_, 1, Position() + Size() / 2 - LightSprite_->Frames[1].Size * 2, {4, 4});
}
}
void TTorchEntity::Alarm(NGame::TAlarm::TId id) {
}
+81 -6
View File
@@ -231,8 +231,6 @@ private:
enum ETile { enum ETile {
Empty, Empty,
Baddy,
Curse,
Dirt, Dirt,
Grass, Grass,
HighDirt, HighDirt,
@@ -243,7 +241,7 @@ private:
Passage, Passage,
Plank, Plank,
Spike, Spike,
Utility, Torch
}; };
struct TRoom { struct TRoom {
@@ -316,7 +314,11 @@ private:
NGame::Vec2i LastStablePosition_ = {}; NGame::Vec2i LastStablePosition_ = {};
NGame::Vec2f Speed_ = NGame::Vec2f(0.0, 0.0); NGame::Vec2f Speed_ = NGame::Vec2f(0.0, 0.0);
NGame::Vec2f Fraction_ = NGame::Vec2f(0.0, 0.0); NGame::Vec2f Fraction_ = NGame::Vec2f(0.0, 0.0);
NGame::Vec2i Want_; NGame::Vec2i ExitPosition_;
bool WhiteFade_ = false;
std::size_t FadeAmount_ = 0;
}; };
class TBackgroundTiler : public NGame::TEntity { class TBackgroundTiler : public NGame::TEntity {
@@ -347,9 +349,82 @@ private:
NGame::TApp* App_; NGame::TApp* App_;
NGame::TSpriteManager& SpriteManager_; NGame::TSpriteManager& SpriteManager_;
NGame::TRenderManager& RenderManager_; NGame::TRenderManager& RenderManager_;
const float Gravity_ = 500; const float Gravity_ = 500;
std::shared_ptr<NGame::TSpriteManager::TSprite> Sprite_; std::shared_ptr<NGame::TSpriteManager::TSprite> Sprite_;
NGame::Vec2f Speed_ = NGame::Vec2f(0.0, 0.0); NGame::Vec2f Speed_ = NGame::Vec2f(0.0, 0.0);
NGame::Vec2f Fraction_ = NGame::Vec2f(0.0, 0.0); NGame::Vec2f Fraction_ = NGame::Vec2f(0.0, 0.0);
}; bool Flip_ = false;
};
class TMainMenu : public NGame::TEntity {
public:
TMainMenu(NGame::TEntity::TId id);
virtual void Update(std::uint32_t delta) override;
virtual void Draw() const override;
virtual void Alarm(NGame::TAlarm::TId id) override;
private:
NGame::TApp* App_;
NGame::TSpriteManager& SpriteManager_;
NGame::TRenderManager& RenderManager_;
};
class TEulaMenu : public NGame::TEntity {
public:
TEulaMenu(NGame::TEntity::TId id);
virtual void Update(std::uint32_t delta) override;
virtual void Draw() const override;
virtual void Alarm(NGame::TAlarm::TId id) override;
private:
NGame::TApp* App_;
NGame::TSpriteManager& SpriteManager_;
NGame::TRenderManager& RenderManager_;
};
class TIntroMenu : public NGame::TEntity {
public:
TIntroMenu(NGame::TEntity::TId id);
virtual void Update(std::uint32_t delta) override;
virtual void Draw() const override;
virtual void Alarm(NGame::TAlarm::TId id) override;
private:
NGame::TApp* App_;
NGame::TSpriteManager& SpriteManager_;
NGame::TRenderManager& RenderManager_;
};
class TOutroMenu : public NGame::TEntity {
public:
TOutroMenu(NGame::TEntity::TId id);
virtual void Update(std::uint32_t delta) override;
virtual void Draw() const override;
virtual void Alarm(NGame::TAlarm::TId id) override;
private:
NGame::TApp* App_;
NGame::TSpriteManager& SpriteManager_;
NGame::TRenderManager& RenderManager_;
};
class TTorchEntity : public NGame::TEntity {
public:
TTorchEntity(NGame::TEntity::TId id);
virtual void Update(std::uint32_t delta) override;
virtual void Draw() const override;
virtual void Alarm(NGame::TAlarm::TId id) override;
private:
std::shared_ptr<NGame::TSpriteManager::TSprite> Sprite_;
std::shared_ptr<NGame::TSpriteManager::TSprite> LightSprite_;
NGame::TApp* App_;
NGame::TSpriteManager& SpriteManager_;
NGame::TRenderManager& RenderManager_;
};