fixed refresh spaceship bug; add mini map
This commit is contained in:
parent
61fd49bb7d
commit
a9f94b0df3
|
@ -1,11 +1,16 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "tinyengine/libmath.hpp"
|
||||||
|
|
||||||
constexpr float FreightShipMaxSpeed = 100;
|
constexpr float FreightShipMaxSpeed = 100;
|
||||||
constexpr float FightShipMaxSpeed = 300;
|
constexpr float FightShipMaxSpeed = 250;
|
||||||
constexpr int FreightLife = 10;
|
constexpr int FreightLife = 10;
|
||||||
constexpr float LazerDamage = 2;
|
constexpr float LazerDamage = 2;
|
||||||
constexpr float LazerShooterSpeed = 500;
|
constexpr float LazerShooterSpeed = 500;
|
||||||
constexpr float LazerShooterMaxSpeed = 1000;
|
constexpr float LazerShooterMaxSpeed = 1000;
|
||||||
constexpr float LazerShooterCooldown = 0.3;
|
constexpr float LazerShooterCooldown = 0.3;
|
||||||
constexpr int GameWindowWidth = 1024;
|
|
||||||
constexpr int GameWindowHeight = 720;
|
constexpr Size GameWindowSize = {1024, 720};
|
||||||
|
|
||||||
|
constexpr Rect BulletRefreshArea{-100, -100, 1124, 820};
|
||||||
|
constexpr Rect SpaceshipRefreshArea{-1024 * 3, -720 * 3, 1024 * 4, 720 * 4};
|
||||||
|
|
|
@ -9,7 +9,9 @@ extern Unique<TileSheet> GameTileSheet;
|
||||||
extern std::unordered_map<std::string, Unique<Sound>> Sounds;
|
extern std::unordered_map<std::string, Unique<Sound>> Sounds;
|
||||||
|
|
||||||
extern QuickList<Entity*> Bullets;
|
extern QuickList<Entity*> Bullets;
|
||||||
|
|
||||||
extern QuickList<Entity*> Entities;
|
extern QuickList<Entity*> Entities;
|
||||||
|
|
||||||
|
extern Entity* PlayerSpaceship;
|
||||||
|
|
||||||
void LoadResources();
|
void LoadResources();
|
||||||
|
Point MapGlobal2PlayerCoord(const Point& pos);
|
||||||
|
|
|
@ -7,7 +7,7 @@ public:
|
||||||
void OnRender() override;
|
void OnRender() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Camera camera;
|
Camera camera_;
|
||||||
float initTime_;
|
float initTime_;
|
||||||
Unique<Sound> sound_;
|
Unique<Sound> sound_;
|
||||||
bool soundPlayed_;
|
bool soundPlayed_;
|
||||||
|
|
|
@ -15,11 +15,11 @@ public:
|
||||||
void OnQuit() override;
|
void OnQuit() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Entity* spaceship_;
|
|
||||||
Unique<FreightShipController> freightController_;
|
Unique<FreightShipController> freightController_;
|
||||||
Unique<FightShipController> fightController_;
|
Unique<FightShipController> fightController_;
|
||||||
|
|
||||||
void renderGUI();
|
void renderGUI();
|
||||||
|
void renderMiniMap();
|
||||||
|
|
||||||
Camera guiCamera_;
|
Camera guiCamera_;
|
||||||
Camera gameCamera_;
|
Camera gameCamera_;
|
||||||
|
|
|
@ -9,11 +9,13 @@ public:
|
||||||
void MoveTo(const Point& pos);
|
void MoveTo(const Point& pos);
|
||||||
/* scale screen in [1.0, 2.0] */
|
/* scale screen in [1.0, 2.0] */
|
||||||
void Scale(const Point& scale);
|
void Scale(const Point& scale);
|
||||||
|
void SetAnchor(const Point& anchor);
|
||||||
bool TryCalcView();
|
bool TryCalcView();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Mat44 viewMat_;
|
Mat44 viewMat_;
|
||||||
Point position_ = {0, 0};
|
Point position_ = {0, 0};
|
||||||
Point scale_ = {1, 1};
|
Point scale_ = {1, 1};
|
||||||
bool dirty_ = false;
|
Point anchor_ = {0, 0};
|
||||||
|
bool dirty_ = true;
|
||||||
};
|
};
|
||||||
|
|
|
@ -47,7 +47,6 @@ public:
|
||||||
static void SetViewport(int x, int y, int w, int h);
|
static void SetViewport(int x, int y, int w, int h);
|
||||||
static const Color& GetDrawColor();
|
static const Color& GetDrawColor();
|
||||||
static void SetCamera(Camera& camera);
|
static void SetCamera(Camera& camera);
|
||||||
static void Update();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static Color color_;
|
static Color color_;
|
||||||
|
|
|
@ -5,7 +5,8 @@ void Shoot(SpaceshipWeaponCmpt& weapon, const Point& dir) {
|
||||||
|
|
||||||
Point playerCenterPos = weapon.owner->Get<MoveCmpt>()->position;
|
Point playerCenterPos = weapon.owner->Get<MoveCmpt>()->position;
|
||||||
|
|
||||||
auto bullet = weapon.ShootBullet(dir);
|
Entity* bullet;
|
||||||
|
bullet = weapon.ShootBullet(dir);
|
||||||
Bullets.Add(bullet);
|
Bullets.Add(bullet);
|
||||||
|
|
||||||
weapon.coolDown = weapon.shootDuration;
|
weapon.coolDown = weapon.shootDuration;
|
||||||
|
|
|
@ -26,8 +26,14 @@ void FightShipController::Update(float dt) {
|
||||||
|
|
||||||
if (IsLeftPressing()) {
|
if (IsLeftPressing()) {
|
||||||
if (entity_->Has<SpaceshipWeaponCmpt>()) {
|
if (entity_->Has<SpaceshipWeaponCmpt>()) {
|
||||||
Shoot(*entity_->Use<SpaceshipWeaponCmpt>(),
|
auto weapon = entity_->Use<SpaceshipWeaponCmpt>();
|
||||||
|
if (weapon->type == SpaceshipWeaponCmpt::Orientation) {
|
||||||
|
Shoot(*weapon,
|
||||||
|
Rotate(Point{0, -1}, -entity_->Get<FightShipCmpt>()->degree));
|
||||||
|
} else {
|
||||||
|
Shoot(*weapon,
|
||||||
GetMousePosition() - entity_->Get<MoveCmpt>()->position);
|
GetMousePosition() - entity_->Get<MoveCmpt>()->position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -30,8 +30,15 @@ void FreightShipController::Update(float dt) {
|
||||||
|
|
||||||
if (IsLeftPressing()) {
|
if (IsLeftPressing()) {
|
||||||
if (entity_->Has<SpaceshipWeaponCmpt>()) {
|
if (entity_->Has<SpaceshipWeaponCmpt>()) {
|
||||||
Shoot(*entity_->Use<SpaceshipWeaponCmpt>(),
|
// FIXME duplicated codes in here and fightship_controller.cpp
|
||||||
|
auto weapon = entity_->Use<SpaceshipWeaponCmpt>();
|
||||||
|
if (weapon->type == SpaceshipWeaponCmpt::Orientation) {
|
||||||
|
Shoot(*weapon,
|
||||||
|
Rotate(Point{0, -1}, entity_->Get<FightShipCmpt>()->degree));
|
||||||
|
} else {
|
||||||
|
Shoot(*weapon,
|
||||||
GetMousePosition() - entity_->Get<MoveCmpt>()->position);
|
GetMousePosition() - entity_->Get<MoveCmpt>()->position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ Entity* CreateFreightShip() {
|
||||||
entity->Add<MoveCmpt>(Point{0, 0});
|
entity->Add<MoveCmpt>(Point{0, 0});
|
||||||
entity->Add<MotionCmpt>(Point{0, 0}, FreightShipMaxSpeed);
|
entity->Add<MotionCmpt>(Point{0, 0}, FreightShipMaxSpeed);
|
||||||
entity->Add<RenderCmpt>(GameTileSheet->GetTile(0, 0));
|
entity->Add<RenderCmpt>(GameTileSheet->GetTile(0, 0));
|
||||||
entity->Add<SpaceshipWeaponCmpt>(SpaceshipWeaponCmpt::Orientation,
|
entity->Add<SpaceshipWeaponCmpt>(SpaceshipWeaponCmpt::FreeRotation,
|
||||||
entity,
|
entity,
|
||||||
LazerDamage,
|
LazerDamage,
|
||||||
LazerShooterSpeed,
|
LazerShooterSpeed,
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
#include "game/global.hpp"
|
#include "game/global.hpp"
|
||||||
|
#include "game/component.hpp"
|
||||||
|
|
||||||
Context ECSContext;
|
Context ECSContext;
|
||||||
SystemManager SystemMgr;
|
SystemManager SystemMgr;
|
||||||
Unique<TileSheet> GameTileSheet;
|
Unique<TileSheet> GameTileSheet;
|
||||||
std::unordered_map<std::string, Unique<Sound>> Sounds;
|
std::unordered_map<std::string, Unique<Sound>> Sounds;
|
||||||
|
|
||||||
QuickList<Entity*> Bullets;
|
QuickList<Entity*> Bullets;
|
||||||
QuickList<Entity*> Entities;
|
QuickList<Entity*> Entities;
|
||||||
|
|
||||||
|
Entity* PlayerSpaceship;
|
||||||
|
|
||||||
void loadImages() {
|
void loadImages() {
|
||||||
GameTileSheet.reset(new TileSheet("assets/tilesheet.png", 8, 8));
|
GameTileSheet.reset(new TileSheet("assets/tilesheet.png", 8, 8));
|
||||||
}
|
}
|
||||||
|
@ -19,3 +23,11 @@ void LoadResources() {
|
||||||
loadImages();
|
loadImages();
|
||||||
loadSounds();
|
loadSounds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Point MapGlobal2PlayerCoord(const Point& pos) {
|
||||||
|
if (PlayerSpaceship && PlayerSpaceship->Has<MoveCmpt>()) {
|
||||||
|
return pos - PlayerSpaceship->Get<MoveCmpt>()->position + GameWindowSize / 2;
|
||||||
|
} else {
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -2,4 +2,4 @@
|
||||||
#include "game/stages/space.hpp"
|
#include "game/stages/space.hpp"
|
||||||
#include "game/constants.hpp"
|
#include "game/constants.hpp"
|
||||||
|
|
||||||
RUN_WINDOW("Space Sector", GameWindowWidth, GameWindowHeight, SpaceScence)
|
RUN_WINDOW("Space Sector", GameWindowSize.w, GameWindowSize.h, SpaceScence)
|
||||||
|
|
|
@ -10,6 +10,8 @@ void GameLogoScence::OnInit() {
|
||||||
initTime_ = GetTime();
|
initTime_ = GetTime();
|
||||||
sound_.reset(new Sound("assets/1mgame_sound.wav"));
|
sound_.reset(new Sound("assets/1mgame_sound.wav"));
|
||||||
soundPlayed_ = false;
|
soundPlayed_ = false;
|
||||||
|
|
||||||
|
Renderer::SetCamera(camera_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameLogoScence::OnRender() {
|
void GameLogoScence::OnRender() {
|
||||||
|
|
|
@ -4,9 +4,12 @@ void SpaceScence::OnInit() {
|
||||||
Renderer::SetClearColor(Color{0, 0, 0, 255});
|
Renderer::SetClearColor(Color{0, 0, 0, 255});
|
||||||
LoadResources();
|
LoadResources();
|
||||||
|
|
||||||
spaceship_ = CreateFightShip();
|
Entities.Clear();
|
||||||
Entities.Add(spaceship_);
|
Bullets.Clear();
|
||||||
spaceship_->Use<MoveCmpt>()->position = Point{400, 400};
|
|
||||||
|
PlayerSpaceship = CreateFightShip();
|
||||||
|
Entities.Add(PlayerSpaceship);
|
||||||
|
PlayerSpaceship->Use<MoveCmpt>()->position = Point{400, 400};
|
||||||
|
|
||||||
Entity* enemy = CreateFreightShip();
|
Entity* enemy = CreateFreightShip();
|
||||||
enemy->Use<MoveCmpt>()->position = Point{100, 100};
|
enemy->Use<MoveCmpt>()->position = Point{100, 100};
|
||||||
|
@ -21,7 +24,9 @@ void SpaceScence::OnInit() {
|
||||||
Entities.Add(enemy);
|
Entities.Add(enemy);
|
||||||
|
|
||||||
// freightController_.reset(new FreightShipController(spaceship_));
|
// freightController_.reset(new FreightShipController(spaceship_));
|
||||||
fightController_.reset(new FightShipController(spaceship_));
|
fightController_.reset(new FightShipController(PlayerSpaceship));
|
||||||
|
|
||||||
|
gameCamera_.SetAnchor(GameWindowSize / 2);
|
||||||
|
|
||||||
SystemMgr.Clear();
|
SystemMgr.Clear();
|
||||||
SystemMgr.AddUpdateSystem(new BulletCooldownSystem);
|
SystemMgr.AddUpdateSystem(new BulletCooldownSystem);
|
||||||
|
@ -35,22 +40,53 @@ void SpaceScence::OnInit() {
|
||||||
void SpaceScence::OnUpdate(float dt) {
|
void SpaceScence::OnUpdate(float dt) {
|
||||||
fightController_->Update(dt);
|
fightController_->Update(dt);
|
||||||
SystemMgr.Update(dt);
|
SystemMgr.Update(dt);
|
||||||
|
gameCamera_.MoveTo(PlayerSpaceship->Get<MoveCmpt>()->position);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpaceScence::OnRender() {
|
void SpaceScence::OnRender() {
|
||||||
Renderer::SetCamera(gameCamera_);
|
Renderer::SetCamera(gameCamera_);
|
||||||
SystemMgr.Render();
|
SystemMgr.Render();
|
||||||
|
|
||||||
|
Renderer::SetCamera(guiCamera_);
|
||||||
renderGUI();
|
renderGUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpaceScence::renderGUI() {
|
void SpaceScence::renderGUI() {
|
||||||
Renderer::SetCamera(guiCamera_);
|
Renderer::SetCamera(guiCamera_);
|
||||||
|
|
||||||
auto life = spaceship_->Get<LifeCmpt>()->hp;
|
auto life = PlayerSpaceship->Get<LifeCmpt>()->hp;
|
||||||
float xOffset = 16 * life;
|
float xOffset = 16 * life;
|
||||||
for (int i = 0; i < life; i++) {
|
for (int i = 0; i < life; i++) {
|
||||||
Renderer::DrawTile(GameTileSheet->GetTile(1, 1),
|
Renderer::DrawTile(GameTileSheet->GetTile(1, 1),
|
||||||
Point{GameWindowWidth - xOffset + i * 16, 8});
|
Point{GameWindowSize.w - xOffset + i * 16, 8});
|
||||||
|
}
|
||||||
|
|
||||||
|
renderMiniMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpaceScence::renderMiniMap() {
|
||||||
|
Rect mapRect = {1, 0, 100, 100};
|
||||||
|
mapRect.y = GameWindowSize.h - mapRect.h;
|
||||||
|
|
||||||
|
Renderer::SetDrawColor(Color{0, 0, 0, 255});
|
||||||
|
Renderer::FillRect(mapRect);
|
||||||
|
Renderer::SetDrawColor(Color{255, 255, 255, 255});
|
||||||
|
Renderer::DrawRect(mapRect);
|
||||||
|
|
||||||
|
for (auto& entity: Entities) {
|
||||||
|
if (entity != PlayerSpaceship) {
|
||||||
|
const auto& pos = entity->Get<MoveCmpt>()->position;
|
||||||
|
Point entityOnMapPos = (pos - PlayerSpaceship->Get<MoveCmpt>()->position) * Size{mapRect.w, mapRect.h} / GameWindowSize +
|
||||||
|
Point{mapRect.x, mapRect.y} + Size{mapRect.w, mapRect.h} / 2;
|
||||||
|
if (IsPointInRect(entityOnMapPos, mapRect)) {
|
||||||
|
if (entity->Has<FreightShipCmpt>()) {
|
||||||
|
Renderer::SetDrawColor(Color{255, 255, 255, 255});
|
||||||
|
} else {
|
||||||
|
Renderer::SetDrawColor(Color{0, 0, 255, 255});
|
||||||
|
}
|
||||||
|
Renderer::FillRect(Rect{entityOnMapPos.x - 1, entityOnMapPos.y - 1, 2, 2});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,21 +75,26 @@ void CollideSystem::Update(float dt) {
|
||||||
|
|
||||||
void CleanupSystem::Update(float dt) {
|
void CleanupSystem::Update(float dt) {
|
||||||
using EntityPtr = Entity*;
|
using EntityPtr = Entity*;
|
||||||
|
auto destroyFunc = [&](const EntityPtr& entity){
|
||||||
|
ECSContext.DestroyEntity(entity);
|
||||||
|
};
|
||||||
|
|
||||||
Bullets.RemoveAll([](const EntityPtr& entity){
|
Bullets.RemoveAll([](const EntityPtr& entity){
|
||||||
return !entity->Get<BulletCmpt>()->alive || !IsPointInRect(entity->Get<MoveCmpt>()->position,
|
return !entity->Get<BulletCmpt>()->alive ||
|
||||||
Rect{0, 0, GameWindowWidth, GameWindowHeight});
|
!IsPointInRect(MapGlobal2PlayerCoord(entity->Get<MoveCmpt>()->position),
|
||||||
});
|
BulletRefreshArea);
|
||||||
|
}, destroyFunc);
|
||||||
|
|
||||||
Entities.RemoveAll([](const EntityPtr& entity){
|
Entities.RemoveAll([](const EntityPtr& entity){
|
||||||
if (entity->Has<LifeCmpt>() &&
|
if (entity->Has<LifeCmpt>() &&
|
||||||
entity->Get<LifeCmpt>()->hp <= 0) {
|
entity->Get<LifeCmpt>()->hp <= 0 ||
|
||||||
|
entity->Has<MoveCmpt>() &&
|
||||||
|
!IsPointInRect(MapGlobal2PlayerCoord(entity->Get<MoveCmpt>()->position), SpaceshipRefreshArea)) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
},
|
}, destroyFunc);
|
||||||
[&](const EntityPtr& entity){
|
|
||||||
ECSContext.DestroyEntity(entity);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BulletCooldownSystem::Update(float dt) {
|
void BulletCooldownSystem::Update(float dt) {
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
bool Camera::TryCalcView() {
|
bool Camera::TryCalcView() {
|
||||||
if (dirty_) {
|
if (dirty_) {
|
||||||
viewMat_ = Mat44({
|
viewMat_ = Mat44({
|
||||||
scale_.x, 0, 0, -position_.x,
|
scale_.x, 0, 0, -position_.x + anchor_.x,
|
||||||
0, scale_.y, 0, -position_.y,
|
0, scale_.y, 0, -position_.y + anchor_.y,
|
||||||
0, 0, 1, 0,
|
0, 0, 1, 0,
|
||||||
0, 0, 0, 1,
|
0, 0, 0, 1,
|
||||||
});
|
});
|
||||||
|
@ -30,3 +30,8 @@ void Camera::Scale(const Point& scale) {
|
||||||
scale_.y = Clamp(1.0f, 2.0f, scale.y);
|
scale_.y = Clamp(1.0f, 2.0f, scale.y);
|
||||||
dirty_ = true;
|
dirty_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Camera::SetAnchor(const Point& anchor) {
|
||||||
|
anchor_ = anchor;
|
||||||
|
dirty_ = true;
|
||||||
|
}
|
||||||
|
|
|
@ -89,7 +89,6 @@ void Engine::Shutdown() {
|
||||||
void Engine::Update(float deltaTime) {
|
void Engine::Update(float deltaTime) {
|
||||||
if (scence_)
|
if (scence_)
|
||||||
scence_->OnUpdate(deltaTime);
|
scence_->OnUpdate(deltaTime);
|
||||||
Renderer::Update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::Render() {
|
void Engine::Render() {
|
||||||
|
|
|
@ -229,14 +229,8 @@ void Renderer::SetViewport(int x, int y, int w, int h) {
|
||||||
|
|
||||||
void Renderer::SetCamera(Camera& camera) {
|
void Renderer::SetCamera(Camera& camera) {
|
||||||
Context.camera = &camera;
|
Context.camera = &camera;
|
||||||
}
|
Context.camera->TryCalcView();
|
||||||
|
|
||||||
void Renderer::Update() {
|
|
||||||
if (Context.camera && Context.camera->TryCalcView()) {
|
|
||||||
Context.shader->SetMat4("view", Context.camera->GetView());
|
Context.shader->SetMat4("view", Context.camera->GetView());
|
||||||
} else {
|
|
||||||
Context.shader->SetMat4("view", Mat44::Eye);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::Shutdown() {
|
void Renderer::Shutdown() {
|
||||||
|
|
Reference in New Issue