文件结构重构
This commit is contained in:
+33
-25
@@ -20,32 +20,40 @@ include(CTest)
|
|||||||
enable_testing()
|
enable_testing()
|
||||||
|
|
||||||
add_executable(${PROJECT_NAME}
|
add_executable(${PROJECT_NAME}
|
||||||
main.cpp
|
src/main.cpp
|
||||||
def.cpp
|
src/def.h
|
||||||
def.h
|
src/def.cpp
|
||||||
InteractManager.cpp
|
src/interact/InteractManager.h
|
||||||
InteractManager.h
|
src/interact/InteractManager.cpp
|
||||||
Renderer.cpp
|
src/render/Renderer.h
|
||||||
Renderer.h
|
src/render/Renderer.cpp
|
||||||
Game.cpp
|
src/game/Game.h
|
||||||
Game.h
|
src/game/Game.cpp
|
||||||
Window.cpp
|
src/ui/Window.h
|
||||||
Window.h
|
src/ui/Window.cpp
|
||||||
Hud.cpp
|
src/ui/Hud.h
|
||||||
Hud.h
|
src/ui/Hud.cpp
|
||||||
IText.cpp
|
src/utils/IText.h
|
||||||
IText.h
|
src/utils/IText.cpp
|
||||||
exception.cpp
|
src/utils/exception.h
|
||||||
exception.h
|
src/utils/exception.cpp
|
||||||
File.h
|
src/utils/File.h
|
||||||
File.cpp
|
src/utils/File.cpp
|
||||||
TextureManager.cpp
|
src/render/TextureManager.h
|
||||||
TextureManager.h
|
src/render/TextureManager.cpp
|
||||||
|
|
||||||
includes.h
|
src/includes.h
|
||||||
Chars.h
|
src/utils/Chars.h
|
||||||
xWindows.h
|
src/ui/xWindows.h
|
||||||
TestCode.h
|
src/utils/TestCode.h
|
||||||
|
src/game/entity/Entity.h
|
||||||
|
src/game/entity/Player.h
|
||||||
|
src/game/entity/Player.cpp
|
||||||
|
src/game/entity/Damage.h
|
||||||
|
src/utils/math.h
|
||||||
|
src/game/world/World.h
|
||||||
|
src/game/world/Location.h
|
||||||
|
src/game/world/Block.h
|
||||||
)
|
)
|
||||||
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
||||||
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
Module:
|
||||||
|
File(30%), including Log, Save, Config, Language
|
||||||
|
Translator(30%), with File
|
||||||
|
KeyBinding(20%)
|
||||||
-28
@@ -1,28 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by EmsiaetKadosh on 25-1-14.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "warnings.h"
|
|
||||||
|
|
||||||
#include "def.h"
|
|
||||||
#include "File.h"
|
|
||||||
#include "exception.h"
|
|
||||||
#include "gc.h"
|
|
||||||
#include "utils.h"
|
|
||||||
#include "hbp.h"
|
|
||||||
#include "Chars.h"
|
|
||||||
#include "Task.h"
|
|
||||||
|
|
||||||
#include "Renderer.h"
|
|
||||||
#include "Animation.h"
|
|
||||||
#include "InteractManager.h"
|
|
||||||
#include "TextureManager.h"
|
|
||||||
#include "IText.h"
|
|
||||||
#include "Hud.h"
|
|
||||||
#include "Window.h"
|
|
||||||
|
|
||||||
#include "Game.h"
|
|
||||||
|
|
||||||
#include "xWindows.h"
|
|
||||||
@@ -4,9 +4,8 @@
|
|||||||
|
|
||||||
#include "def.h"
|
#include "def.h"
|
||||||
|
|
||||||
#include "Chars.h"
|
#include "utils\Chars.h"
|
||||||
#include "exception.h"
|
#include "utils\exception.h"
|
||||||
#include "Game.h"
|
|
||||||
|
|
||||||
template<TypeName Base> template<NewCopyable T> requires std::is_base_of_v<Base, T> && TypeName<T>
|
template<TypeName Base> template<NewCopyable T> requires std::is_base_of_v<Base, T> && TypeName<T>
|
||||||
void ObjectHolder<Base>::set(const T& value) {
|
void ObjectHolder<Base>::set(const T& value) {
|
||||||
@@ -134,7 +134,6 @@ template<typename T> T* deallocating$(T* value) {
|
|||||||
#define deallocating(val) val
|
#define deallocating(val) val
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
template<TypeName Base> class ObjectHolder {
|
template<TypeName Base> class ObjectHolder {
|
||||||
Base* value;
|
Base* value;
|
||||||
bool hasValue;
|
bool hasValue;
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "def.h"
|
#include "..\def.h"
|
||||||
|
|
||||||
class Animation {
|
class Animation {
|
||||||
public:
|
public:
|
||||||
@@ -4,6 +4,13 @@
|
|||||||
|
|
||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
|
|
||||||
|
#include "world\World.h"
|
||||||
|
#include "..\ui\xWindows.h"
|
||||||
|
|
||||||
|
void Game::initialize() {
|
||||||
|
worldManager = allocatedFor(new WorldManager);
|
||||||
|
game.setWindow(StartWindow::create());
|
||||||
|
}
|
||||||
|
|
||||||
Game::Game() : caption{ allocatedFor(new CaptionWindow()) }, floatWindow{ allocatedFor(new FloatWindow()) } {
|
Game::Game() : caption{ allocatedFor(new CaptionWindow()) }, floatWindow{ allocatedFor(new FloatWindow()) } {
|
||||||
Logger.put(L"Game created");
|
Logger.put(L"Game created");
|
||||||
@@ -14,6 +21,7 @@ Game::~Game() {
|
|||||||
setWindow(nullptr);
|
setWindow(nullptr);
|
||||||
delete deallocating(floatWindow);
|
delete deallocating(floatWindow);
|
||||||
delete deallocating(caption);
|
delete deallocating(caption);
|
||||||
|
delete deallocating(worldManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Game game = Game();
|
inline Game game = Game();
|
||||||
@@ -4,10 +4,12 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "gc.h"
|
#include "../utils/gc.h"
|
||||||
#include "Hud.h"
|
#include "../ui/Hud.h"
|
||||||
#include "Task.h"
|
#include "../utils/Task.h"
|
||||||
#include "Window.h"
|
#include "../ui/Window.h"
|
||||||
|
|
||||||
|
class [[carlbeks::predecl, carlbeks::defineat("World.h")]] WorldManager;
|
||||||
|
|
||||||
class Game final /* : public IRenderable, public ITickable */ {
|
class Game final /* : public IRenderable, public ITickable */ {
|
||||||
friend void gameThread();
|
friend void gameThread();
|
||||||
@@ -20,7 +22,9 @@ class Game final /* : public IRenderable, public ITickable */ {
|
|||||||
public:
|
public:
|
||||||
TaskScheduler tasks; // 8
|
TaskScheduler tasks; // 8
|
||||||
std::minstd_rand random;
|
std::minstd_rand random;
|
||||||
|
WorldManager* worldManager = nullptr;
|
||||||
|
|
||||||
|
void initialize();
|
||||||
Game();
|
Game();
|
||||||
~Game();
|
~Game();
|
||||||
|
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
//
|
||||||
|
// Created by EmsiaetKadosh on 25-3-21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "..\..\def.h"
|
||||||
|
|
||||||
|
class [[carlbeks::predecl, carlbeks::defineat("Entity.h")]] Entity;
|
||||||
|
|
||||||
|
struct DamageTypeEnum {
|
||||||
|
enum : unsigned char {
|
||||||
|
NONE, // 无伤害
|
||||||
|
SYSTEMATIC_DAMAGE, // 系统伤害
|
||||||
|
PHYSICAL_DAMAGE, // 物理伤害
|
||||||
|
MAGICAL_DAMAGE, // 魔法伤害
|
||||||
|
TRUE_DAMAGE, // 真实伤害
|
||||||
|
DENY_DAMAGE, // 否定伤害
|
||||||
|
RETURN_DAMAGE, // 回敬伤害
|
||||||
|
BLOOD_PRESSURE_DAMAGE, // 降压伤害
|
||||||
|
} value;
|
||||||
|
|
||||||
|
static constexpr QWORD elementCount() { return BLOOD_PRESSURE_DAMAGE + 1; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DamageFormEnum {
|
||||||
|
enum : unsigned char {
|
||||||
|
NONE,
|
||||||
|
MELEE_DAMAGE, // 近战伤害
|
||||||
|
REMOTE_DAMAGE, // 远程伤害
|
||||||
|
PROJECTILE_DAMAGE, // 弹射物伤害
|
||||||
|
EXECUTE_DAMAGE, // 处决伤害
|
||||||
|
FINAL_DAMAGE,
|
||||||
|
} value;
|
||||||
|
|
||||||
|
static constexpr QWORD elementCount() { return FINAL_DAMAGE + 1; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Damage {
|
||||||
|
double damages[DamageTypeEnum::elementCount()];
|
||||||
|
DamageFormEnum form;
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
//
|
||||||
|
// Created by EmsiaetKadosh on 25-3-21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "..\..\utils\math.h"
|
||||||
|
#include "..\world\Location.h"
|
||||||
|
#include "Damage.h"
|
||||||
|
|
||||||
|
class Entity;
|
||||||
|
class World;
|
||||||
|
|
||||||
|
interface IDamageable {
|
||||||
|
protected:
|
||||||
|
double maxHealth = 0;
|
||||||
|
double health = 0;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual ~IDamageable() = default;
|
||||||
|
virtual void Damage(Damage&) = 0;
|
||||||
|
virtual void onDeath() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
interface IMoveable {
|
||||||
|
protected:
|
||||||
|
double maxSpeed = 1.0;
|
||||||
|
Vector2D velocity;
|
||||||
|
|
||||||
|
virtual ~IMoveable() = default;
|
||||||
|
public:
|
||||||
|
void setVelocity(const Vector2D& velocity) { this->velocity = velocity; }
|
||||||
|
[[nodiscard]] Vector2D getVelocity() const { return this->velocity; }
|
||||||
|
};
|
||||||
|
|
||||||
|
interface IArtificialIntelligent {
|
||||||
|
protected:
|
||||||
|
virtual ~IArtificialIntelligent() = default;
|
||||||
|
virtual void aiProcess() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Entity {
|
||||||
|
friend class World;
|
||||||
|
Location location;
|
||||||
|
QWORD id = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Entity(const Location& location) : location(location) {}
|
||||||
|
Entity(Location&& location) : location(std::move(location)) {}
|
||||||
|
virtual ~Entity() = default;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void tick() {}
|
||||||
|
virtual void onRemove() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Enemy : public Entity, public IDamageable, public IMoveable, public IArtificialIntelligent {
|
||||||
|
protected:
|
||||||
|
Enemy(const Location& location) : Entity(location) {}
|
||||||
|
Enemy(Location&& location) : Entity(std::move(location)) {}
|
||||||
|
};
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
//
|
||||||
|
// Created by EmsiaetKadosh on 25-3-21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "Player.h"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
//
|
||||||
|
// Created by EmsiaetKadosh on 25-3-21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Entity.h"
|
||||||
|
|
||||||
|
class Player : public Entity, public IMoveable, public IDamageable {
|
||||||
|
public:
|
||||||
|
Player(const Location& location) : Entity(location) {}
|
||||||
|
Player(Location&& location) : Entity(std::move(location)) {}
|
||||||
|
};
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
//
|
||||||
|
// Created by EmsiaetKadosh on 25-3-21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Location.h"
|
||||||
|
|
||||||
|
class Block {
|
||||||
|
public:
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
//
|
||||||
|
// Created by EmsiaetKadosh on 25-3-21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "..\..\utils\math.h"
|
||||||
|
|
||||||
|
using WorldID = QWORD;
|
||||||
|
class Location;
|
||||||
|
class BlockLocation;
|
||||||
|
|
||||||
|
class Location {
|
||||||
|
Vector2D position;
|
||||||
|
WorldID idWorld;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Location(const Vector2D& position, const WorldID idWorld) : position(position), idWorld(idWorld) {}
|
||||||
|
Location(Vector2D&& position, const WorldID idWorld) : position(position), idWorld(idWorld) {}
|
||||||
|
[[nodiscard]] Vector2D getPosition() const { return position; }
|
||||||
|
[[nodiscard]] WorldID getWorld() const { return idWorld; }
|
||||||
|
[[nodiscard]] double getX() const { return position.getX(); }
|
||||||
|
[[nodiscard]] double getY() const { return position.getY(); }
|
||||||
|
[[nodiscard]] BlockLocation getBlockLocation() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BlockLocation {
|
||||||
|
long long x, y;
|
||||||
|
WorldID idWorld;
|
||||||
|
|
||||||
|
public:
|
||||||
|
BlockLocation(const long long x, const long long y, const WorldID idWorld) : x(x), y(y), idWorld(idWorld) {}
|
||||||
|
BlockLocation(const Vector2D& position, const WorldID idWorld) : x(static_cast<long long>(std::floor(position.getX()))), y(static_cast<long long>(std::floor(position.getY()))), idWorld(idWorld) {}
|
||||||
|
[[nodiscard]] Vector2D getPosition() const { return Vector2D(static_cast<double>(x), static_cast<double>(y)); }
|
||||||
|
[[nodiscard]] WorldID getWorld() const { return idWorld; }
|
||||||
|
[[nodiscard]] long long getX() const { return x; }
|
||||||
|
[[nodiscard]] long long getY() const { return y; }
|
||||||
|
[[nodiscard]] Location toLocation() const { return Location({ static_cast<double>(x), static_cast<double>(y) }, idWorld); }
|
||||||
|
};
|
||||||
|
|
||||||
|
inline BlockLocation Location::getBlockLocation() const { return BlockLocation(position, idWorld); }
|
||||||
|
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
//
|
||||||
|
// Created by EmsiaetKadosh on 25-3-21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "..\..\def.h"
|
||||||
|
#include "..\entity\Entity.h"
|
||||||
|
|
||||||
|
class World {
|
||||||
|
QWORD idEntity = 0;
|
||||||
|
Map<QWORD, Entity*> entities;
|
||||||
|
using IterEntity = Map<QWORD, Entity*>::const_iterator;
|
||||||
|
|
||||||
|
public:
|
||||||
|
World() = default;
|
||||||
|
|
||||||
|
int addEntity(Entity* entity) {
|
||||||
|
if (!entity) Failed();
|
||||||
|
if (entity->id) Failed();
|
||||||
|
entities.emplace(++idEntity, entity);
|
||||||
|
Success();
|
||||||
|
}
|
||||||
|
|
||||||
|
int removeEntity(Entity* entity) {
|
||||||
|
if (!entity) Failed();
|
||||||
|
if (!entity->id) Failed();
|
||||||
|
const IterEntity iter = entities.find(entity->id);
|
||||||
|
if (iter != entities.end()) Failed();
|
||||||
|
entities.erase(iter);
|
||||||
|
entity->onRemove();
|
||||||
|
entity->id = 0;
|
||||||
|
Success();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class WorldManager {
|
||||||
|
public:
|
||||||
|
};
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
//
|
||||||
|
// Created by EmsiaetKadosh on 25-1-14.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "warnings.h"
|
||||||
|
|
||||||
|
// Any include
|
||||||
|
#include "def.h"
|
||||||
|
#include "utils\math.h"
|
||||||
|
#include "utils\File.h"
|
||||||
|
#include "utils\exception.h"
|
||||||
|
|
||||||
|
// utils serialized
|
||||||
|
#include "utils\gc.h"
|
||||||
|
#include "utils\utils.h"
|
||||||
|
#include "hbp.h"
|
||||||
|
#include "utils\Chars.h"
|
||||||
|
#include "utils\Task.h"
|
||||||
|
|
||||||
|
// game basic
|
||||||
|
#include "interact\InteractManager.h"
|
||||||
|
#include "utils\IText.h"
|
||||||
|
#include "render\Renderer.h"
|
||||||
|
#include "game\Animation.h"
|
||||||
|
#include "render\TextureManager.h"
|
||||||
|
#include "ui\Hud.h"
|
||||||
|
#include "ui\Window.h"
|
||||||
|
|
||||||
|
// game
|
||||||
|
#include "game\Game.h"
|
||||||
|
|
||||||
|
// game extension
|
||||||
|
#include "ui\xWindows.h"
|
||||||
|
#include "game\world\Location.h"
|
||||||
|
#include "game\entity\Entity.h"
|
||||||
|
#include "game\world\World.h"
|
||||||
|
#include "game\entity\Player.h"
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#include "InteractManager.h"
|
#include "InteractManager.h"
|
||||||
|
|
||||||
#include "Window.h"
|
#include "..\ui\Window.h"
|
||||||
|
|
||||||
InteractManager::InteractManager() {
|
InteractManager::InteractManager() {
|
||||||
keyStatus[0x00].name = L"NONE";
|
keyStatus[0x00].name = L"NONE";
|
||||||
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "def.h"
|
#include "..\hbp.h"
|
||||||
#include "hbp.h"
|
#include "..\def.h"
|
||||||
|
|
||||||
struct KeyStatus {
|
struct KeyStatus {
|
||||||
String name;
|
String name;
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
#include "IText.h"
|
#include "utils/TestCode.h"
|
||||||
#include "TestCode.h"
|
|
||||||
|
|
||||||
LRESULT __stdcall WndProc(const HWND hwnd, const UINT uMsg, const WPARAM wParam, const LPARAM lParam) {
|
LRESULT __stdcall WndProc(const HWND hwnd, const UINT uMsg, const WPARAM wParam, const LPARAM lParam) {
|
||||||
switch (uMsg) {
|
switch (uMsg) {
|
||||||
@@ -248,7 +247,6 @@ int __stdcall wWinMain(const HINSTANCE hInstance, const HINSTANCE, [[maybe_unuse
|
|||||||
Logger.info(L"wWinMain started");
|
Logger.info(L"wWinMain started");
|
||||||
SetConsoleOutputCP(65001);
|
SetConsoleOutputCP(65001);
|
||||||
translator.initialize();
|
translator.initialize();
|
||||||
game.setWindow(StartWindow::create()); // 次序提前至最先
|
|
||||||
Logger.info(L"--------Program Start--------");
|
Logger.info(L"--------Program Start--------");
|
||||||
for (const auto& [addr, info] : memoryManager.allocated) { Logger.print(L" using", addr, info.size, L"B", info.msg); }
|
for (const auto& [addr, info] : memoryManager.allocated) { Logger.print(L" using", addr, info.size, L"B", info.msg); }
|
||||||
WNDCLASSEX wc = {};
|
WNDCLASSEX wc = {};
|
||||||
@@ -295,6 +293,7 @@ int __stdcall wWinMain(const HINSTANCE hInstance, const HINSTANCE, [[maybe_unuse
|
|||||||
if (!hook) Logger.error(Logger.of(L"SetWindowsHookW failed. LastError:", GetLastError()));
|
if (!hook) Logger.error(Logger.of(L"SetWindowsHookW failed. LastError:", GetLastError()));
|
||||||
test();
|
test();
|
||||||
{
|
{
|
||||||
|
game.initialize();
|
||||||
interactManager.initialize();
|
interactManager.initialize();
|
||||||
GameThread = Thread(gameThread);
|
GameThread = Thread(gameThread);
|
||||||
RenderThread = Thread(renderThread);
|
RenderThread = Thread(renderThread);
|
||||||
@@ -4,9 +4,9 @@
|
|||||||
|
|
||||||
#include "Renderer.h"
|
#include "Renderer.h"
|
||||||
|
|
||||||
#include "Game.h"
|
#include "..\game\Game.h"
|
||||||
#include "hbp.h"
|
#include "..\hbp.h"
|
||||||
#include "InteractManager.h"
|
#include "..\interact\InteractManager.h"
|
||||||
|
|
||||||
void Renderer::gameStartRender() noexcept {
|
void Renderer::gameStartRender() noexcept {
|
||||||
isRendering = true;
|
isRendering = true;
|
||||||
@@ -4,16 +4,16 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "def.h"
|
#include "..\def.h"
|
||||||
#include "exception.h"
|
#include "..\utils\exception.h"
|
||||||
#include "Task.h"
|
#include "..\utils\Task.h"
|
||||||
|
|
||||||
class Game;
|
class Game;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用于标记相对位置。
|
* 用于标记相对位置。
|
||||||
*/
|
*/
|
||||||
enum class Location : char { LEFT_TOP, LEFT, LEFT_BOTTOM, TOP, CENTER, BOTTOM, RIGHT_TOP, RIGHT, RIGHT_BOTTOM };
|
enum class UILocation : char { LEFT_TOP, LEFT, LEFT_BOTTOM, TOP, CENTER, BOTTOM, RIGHT_TOP, RIGHT, RIGHT_BOTTOM };
|
||||||
|
|
||||||
interface IRenderable {
|
interface IRenderable {
|
||||||
virtual ~IRenderable() = default;
|
virtual ~IRenderable() = default;
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "def.h"
|
#include "..\def.h"
|
||||||
|
|
||||||
class ITexture {};
|
class ITexture {};
|
||||||
|
|
||||||
@@ -3,7 +3,8 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "Renderer.h"
|
|
||||||
|
#include "..\render\Renderer.h"
|
||||||
|
|
||||||
class Hud final : public IRenderable, public ITickable {
|
class Hud final : public IRenderable, public ITickable {
|
||||||
public:
|
public:
|
||||||
@@ -4,9 +4,9 @@
|
|||||||
|
|
||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
|
|
||||||
#include "Animation.h"
|
#include "..\game\Animation.h"
|
||||||
#include "Game.h"
|
#include "..\game\Game.h"
|
||||||
#include "InteractManager.h"
|
#include "..\interact\InteractManager.h"
|
||||||
|
|
||||||
int Window::pop() noexcept {
|
int Window::pop() noexcept {
|
||||||
gc.submit(this);
|
gc.submit(this);
|
||||||
@@ -45,7 +45,7 @@ void WindowManager::clear() noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CaptionWindow::CaptionWindow() {
|
CaptionWindow::CaptionWindow() {
|
||||||
Widget* close = widgets.emplace_back(Button(0, 0, interactSettings.actual.captionHeight, interactSettings.actual.captionHeight, Location::RIGHT_TOP, L"\\f\1\u2716"_literal));
|
Widget* close = widgets.emplace_back(Button(0, 0, interactSettings.actual.captionHeight, interactSettings.actual.captionHeight, UILocation::RIGHT_TOP, L"\\f\1\u2716"_literal));
|
||||||
close->mouseClick = [](Widget&, MouseButtonCode) { DestroyWindow(MainWindowHandle); };
|
close->mouseClick = [](Widget&, MouseButtonCode) { DestroyWindow(MainWindowHandle); };
|
||||||
close->onTick = [](const Widget& self, MouseButtonCode) { if (self.containsMouse()) game.getFloatWindow().push(TranslatableText(L"hbp.caption.close").getRenderableString()); };
|
close->onTick = [](const Widget& self, MouseButtonCode) { if (self.containsMouse()) game.getFloatWindow().push(TranslatableText(L"hbp.caption.close").getRenderableString()); };
|
||||||
close->absolute();
|
close->absolute();
|
||||||
@@ -58,7 +58,7 @@ CaptionWindow::CaptionWindow() {
|
|||||||
close->foregroundColor.inactive = 0xff000000;
|
close->foregroundColor.inactive = 0xff000000;
|
||||||
close->foregroundColor.clicked = 0xff000000;
|
close->foregroundColor.clicked = 0xff000000;
|
||||||
|
|
||||||
Widget* maxRestore = widgets.emplace_back(Button(-interactSettings.actual.captionHeight, 0, interactSettings.actual.captionHeight, interactSettings.actual.captionHeight, Location::RIGHT_TOP, IsZoomed(MainWindowHandle) ? L"\\f\1🗗"_literal : L"\\f\1🗖"_literal ));
|
Widget* maxRestore = widgets.emplace_back(Button(-interactSettings.actual.captionHeight, 0, interactSettings.actual.captionHeight, interactSettings.actual.captionHeight, UILocation::RIGHT_TOP, IsZoomed(MainWindowHandle) ? L"\\f\1🗗"_literal : L"\\f\1🗖"_literal ));
|
||||||
maxRestore->mouseClick = [](Widget&, MouseButtonCode) {};
|
maxRestore->mouseClick = [](Widget&, MouseButtonCode) {};
|
||||||
maxRestore->mouseClick = [](Widget& self, MouseButtonCode) {
|
maxRestore->mouseClick = [](Widget& self, MouseButtonCode) {
|
||||||
if ((self.unused[1] = static_cast<char>(IsZoomed(MainWindowHandle)))) ShowWindow(MainWindowHandle, SW_RESTORE);
|
if ((self.unused[1] = static_cast<char>(IsZoomed(MainWindowHandle)))) ShowWindow(MainWindowHandle, SW_RESTORE);
|
||||||
@@ -76,7 +76,7 @@ CaptionWindow::CaptionWindow() {
|
|||||||
maxRestore->foregroundColor.inactive = 0xff000000;
|
maxRestore->foregroundColor.inactive = 0xff000000;
|
||||||
maxRestore->foregroundColor.clicked = 0xff000000;
|
maxRestore->foregroundColor.clicked = 0xff000000;
|
||||||
|
|
||||||
Widget* hide = widgets.emplace_back(Button(-2 * interactSettings.actual.captionHeight, 0, interactSettings.actual.captionHeight, interactSettings.actual.captionHeight, Location::RIGHT_TOP, L"\\f\1🗕"_literal));
|
Widget* hide = widgets.emplace_back(Button(-2 * interactSettings.actual.captionHeight, 0, interactSettings.actual.captionHeight, interactSettings.actual.captionHeight, UILocation::RIGHT_TOP, L"\\f\1🗕"_literal));
|
||||||
hide->onTick = [](const Widget& self, MouseButtonCode) { if (self.containsMouse()) game.getFloatWindow().push(TranslatableText(L"hbp.caption.minimize").getRenderableString()); };
|
hide->onTick = [](const Widget& self, MouseButtonCode) { if (self.containsMouse()) game.getFloatWindow().push(TranslatableText(L"hbp.caption.minimize").getRenderableString()); };
|
||||||
hide->mouseClick = [](Widget&, MouseButtonCode) { ShowWindow(MainWindowHandle, SW_MINIMIZE); };
|
hide->mouseClick = [](Widget&, MouseButtonCode) { ShowWindow(MainWindowHandle, SW_MINIMIZE); };
|
||||||
hide->absolute();
|
hide->absolute();
|
||||||
@@ -89,7 +89,7 @@ CaptionWindow::CaptionWindow() {
|
|||||||
hide->foregroundColor.inactive = 0xff000000;
|
hide->foregroundColor.inactive = 0xff000000;
|
||||||
hide->foregroundColor.clicked = 0xff000000;
|
hide->foregroundColor.clicked = 0xff000000;
|
||||||
|
|
||||||
Widget* options = widgets.emplace_back(Button(0, 0, interactSettings.actual.captionHeight, interactSettings.actual.captionHeight, Location::LEFT_TOP, L"\\f\1⛭"_literal));
|
Widget* options = widgets.emplace_back(Button(0, 0, interactSettings.actual.captionHeight, interactSettings.actual.captionHeight, UILocation::LEFT_TOP, L"\\f\1⛭"_literal));
|
||||||
options->onTick = [](const Widget& self, MouseButtonCode) {
|
options->onTick = [](const Widget& self, MouseButtonCode) {
|
||||||
if (self.containsMouse()) {
|
if (self.containsMouse()) {
|
||||||
game.getFloatWindow().push(TranslatableText(L"hbp.float.settings").getRenderableString());
|
game.getFloatWindow().push(TranslatableText(L"hbp.float.settings").getRenderableString());
|
||||||
@@ -122,11 +122,11 @@ void CaptionWindow::onResize() {
|
|||||||
widget->w = interactSettings.actual.captionHeight;
|
widget->w = interactSettings.actual.captionHeight;
|
||||||
widget->h = interactSettings.actual.captionHeight;
|
widget->h = interactSettings.actual.captionHeight;
|
||||||
switch (widget->location) {
|
switch (widget->location) {
|
||||||
case Location::LEFT_TOP:
|
case UILocation::LEFT_TOP:
|
||||||
widget->x = left;
|
widget->x = left;
|
||||||
left += interactSettings.actual.captionHeight;
|
left += interactSettings.actual.captionHeight;
|
||||||
break;
|
break;
|
||||||
case Location::RIGHT_TOP:
|
case UILocation::RIGHT_TOP:
|
||||||
widget->x = right;
|
widget->x = right;
|
||||||
right -= interactSettings.actual.captionHeight;
|
right -= interactSettings.actual.captionHeight;
|
||||||
break;
|
break;
|
||||||
@@ -187,39 +187,39 @@ void Widget::onResize() {
|
|||||||
width = static_cast<int>(w);
|
width = static_cast<int>(w);
|
||||||
height = static_cast<int>(h);
|
height = static_cast<int>(h);
|
||||||
switch (location) {
|
switch (location) {
|
||||||
case Location::LEFT_TOP:
|
case UILocation::LEFT_TOP:
|
||||||
left = static_cast<int>(x);
|
left = static_cast<int>(x);
|
||||||
top = static_cast<int>(y);
|
top = static_cast<int>(y);
|
||||||
break;
|
break;
|
||||||
case Location::LEFT:
|
case UILocation::LEFT:
|
||||||
left = static_cast<int>(x);
|
left = static_cast<int>(x);
|
||||||
top = static_cast<int>(y) + (renderer.getHeight() - height >> 1);
|
top = static_cast<int>(y) + (renderer.getHeight() - height >> 1);
|
||||||
break;
|
break;
|
||||||
case Location::LEFT_BOTTOM:
|
case UILocation::LEFT_BOTTOM:
|
||||||
left = static_cast<int>(x);
|
left = static_cast<int>(x);
|
||||||
top = static_cast<int>(y) + renderer.getHeight() - height;
|
top = static_cast<int>(y) + renderer.getHeight() - height;
|
||||||
break;
|
break;
|
||||||
case Location::TOP:
|
case UILocation::TOP:
|
||||||
left = static_cast<int>(x) + (renderer.getWidth() - width >> 1);
|
left = static_cast<int>(x) + (renderer.getWidth() - width >> 1);
|
||||||
top = static_cast<int>(y);
|
top = static_cast<int>(y);
|
||||||
break;
|
break;
|
||||||
case Location::CENTER:
|
case UILocation::CENTER:
|
||||||
left = static_cast<int>(x) + (renderer.getWidth() - width >> 1);
|
left = static_cast<int>(x) + (renderer.getWidth() - width >> 1);
|
||||||
top = static_cast<int>(y) + (renderer.getHeight() - height >> 1);
|
top = static_cast<int>(y) + (renderer.getHeight() - height >> 1);
|
||||||
break;
|
break;
|
||||||
case Location::BOTTOM:
|
case UILocation::BOTTOM:
|
||||||
left = static_cast<int>(x) + (renderer.getWidth() - width >> 1);
|
left = static_cast<int>(x) + (renderer.getWidth() - width >> 1);
|
||||||
top = static_cast<int>(y) + renderer.getHeight() - height;
|
top = static_cast<int>(y) + renderer.getHeight() - height;
|
||||||
break;
|
break;
|
||||||
case Location::RIGHT_TOP:
|
case UILocation::RIGHT_TOP:
|
||||||
left = static_cast<int>(x) + renderer.getWidth() - width;
|
left = static_cast<int>(x) + renderer.getWidth() - width;
|
||||||
top = static_cast<int>(y);
|
top = static_cast<int>(y);
|
||||||
break;
|
break;
|
||||||
case Location::RIGHT:
|
case UILocation::RIGHT:
|
||||||
left = static_cast<int>(x) + renderer.getWidth() - width;
|
left = static_cast<int>(x) + renderer.getWidth() - width;
|
||||||
top = static_cast<int>(y) + (renderer.getHeight() - height >> 1);
|
top = static_cast<int>(y) + (renderer.getHeight() - height >> 1);
|
||||||
break;
|
break;
|
||||||
case Location::RIGHT_BOTTOM:
|
case UILocation::RIGHT_BOTTOM:
|
||||||
left = static_cast<int>(x) + renderer.getWidth() - width;
|
left = static_cast<int>(x) + renderer.getWidth() - width;
|
||||||
top = static_cast<int>(y) + renderer.getHeight() - height;
|
top = static_cast<int>(y) + renderer.getHeight() - height;
|
||||||
break;
|
break;
|
||||||
@@ -228,39 +228,39 @@ void Widget::onResize() {
|
|||||||
width = static_cast<int>(renderer.getWidth() * w);
|
width = static_cast<int>(renderer.getWidth() * w);
|
||||||
height = static_cast<int>(renderer.getHeight() * h);
|
height = static_cast<int>(renderer.getHeight() * h);
|
||||||
switch (location) {
|
switch (location) {
|
||||||
case Location::LEFT_TOP:
|
case UILocation::LEFT_TOP:
|
||||||
left = static_cast<int>(renderer.getWidth() * x);
|
left = static_cast<int>(renderer.getWidth() * x);
|
||||||
top = static_cast<int>(renderer.getHeight() * y);
|
top = static_cast<int>(renderer.getHeight() * y);
|
||||||
break;
|
break;
|
||||||
case Location::LEFT:
|
case UILocation::LEFT:
|
||||||
left = static_cast<int>(renderer.getWidth() * x);
|
left = static_cast<int>(renderer.getWidth() * x);
|
||||||
top = static_cast<int>(renderer.getHeight() * y) + (renderer.getHeight() - height >> 1);
|
top = static_cast<int>(renderer.getHeight() * y) + (renderer.getHeight() - height >> 1);
|
||||||
break;
|
break;
|
||||||
case Location::LEFT_BOTTOM:
|
case UILocation::LEFT_BOTTOM:
|
||||||
left = static_cast<int>(renderer.getWidth() * x);
|
left = static_cast<int>(renderer.getWidth() * x);
|
||||||
top = static_cast<int>(renderer.getHeight() * y) + renderer.getHeight() - height;
|
top = static_cast<int>(renderer.getHeight() * y) + renderer.getHeight() - height;
|
||||||
break;
|
break;
|
||||||
case Location::TOP:
|
case UILocation::TOP:
|
||||||
left = static_cast<int>(renderer.getWidth() * x) + (renderer.getWidth() - width >> 1);
|
left = static_cast<int>(renderer.getWidth() * x) + (renderer.getWidth() - width >> 1);
|
||||||
top = static_cast<int>(renderer.getHeight() * y);
|
top = static_cast<int>(renderer.getHeight() * y);
|
||||||
break;
|
break;
|
||||||
case Location::CENTER:
|
case UILocation::CENTER:
|
||||||
left = static_cast<int>(renderer.getWidth() * x) + (renderer.getWidth() - width >> 1);
|
left = static_cast<int>(renderer.getWidth() * x) + (renderer.getWidth() - width >> 1);
|
||||||
top = static_cast<int>(renderer.getHeight() * y) + (renderer.getHeight() - height >> 1);
|
top = static_cast<int>(renderer.getHeight() * y) + (renderer.getHeight() - height >> 1);
|
||||||
break;
|
break;
|
||||||
case Location::BOTTOM:
|
case UILocation::BOTTOM:
|
||||||
left = static_cast<int>(renderer.getWidth() * x) + (renderer.getWidth() - width >> 1);
|
left = static_cast<int>(renderer.getWidth() * x) + (renderer.getWidth() - width >> 1);
|
||||||
top = static_cast<int>(renderer.getHeight() * y) + renderer.getHeight() - height;
|
top = static_cast<int>(renderer.getHeight() * y) + renderer.getHeight() - height;
|
||||||
break;
|
break;
|
||||||
case Location::RIGHT_TOP:
|
case UILocation::RIGHT_TOP:
|
||||||
left = static_cast<int>(renderer.getWidth() * x) + renderer.getWidth() - width;
|
left = static_cast<int>(renderer.getWidth() * x) + renderer.getWidth() - width;
|
||||||
top = static_cast<int>(renderer.getHeight() * y);
|
top = static_cast<int>(renderer.getHeight() * y);
|
||||||
break;
|
break;
|
||||||
case Location::RIGHT:
|
case UILocation::RIGHT:
|
||||||
left = static_cast<int>(renderer.getWidth() * x) + renderer.getWidth() - width;
|
left = static_cast<int>(renderer.getWidth() * x) + renderer.getWidth() - width;
|
||||||
top = static_cast<int>(renderer.getHeight() * y) + (renderer.getHeight() - height >> 1);
|
top = static_cast<int>(renderer.getHeight() * y) + (renderer.getHeight() - height >> 1);
|
||||||
break;
|
break;
|
||||||
case Location::RIGHT_BOTTOM:
|
case UILocation::RIGHT_BOTTOM:
|
||||||
left = static_cast<int>(renderer.getWidth() * x) + renderer.getWidth() - width;
|
left = static_cast<int>(renderer.getWidth() * x) + renderer.getWidth() - width;
|
||||||
top = static_cast<int>(renderer.getHeight() * y) + renderer.getHeight() - height;
|
top = static_cast<int>(renderer.getHeight() * y) + renderer.getHeight() - height;
|
||||||
break;
|
break;
|
||||||
@@ -274,8 +274,8 @@ void Button::render() const noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ConfirmWindow& ConfirmWindow::requireConfirm(const Function<void(Button&)>& func) {
|
ConfirmWindow& ConfirmWindow::requireConfirm(const Function<void(Button&)>& func) {
|
||||||
confirm = dynamic_cast<Button*>(widgets.emplace_back(std::move(Button(0, 0, 0.4, 0.08, Location::CENTER, TranslatableText(L"hbp.confirm.confirm")))).ptr());
|
confirm = dynamic_cast<Button*>(widgets.emplace_back(std::move(Button(0, 0, 0.4, 0.08, UILocation::CENTER, TranslatableText(L"hbp.confirm.confirm")))).ptr());
|
||||||
confirm->location = Location::CENTER;
|
confirm->location = UILocation::CENTER;
|
||||||
confirm->backgroundColor.active = 0x99000000;
|
confirm->backgroundColor.active = 0x99000000;
|
||||||
confirm->backgroundColor.hover = 0x9900ff00;
|
confirm->backgroundColor.hover = 0x9900ff00;
|
||||||
confirm->backgroundColor.clicked = 0xff00ee00;
|
confirm->backgroundColor.clicked = 0xff00ee00;
|
||||||
@@ -302,14 +302,14 @@ ConfirmWindow& ConfirmWindow::requireConfirm(const Function<void(Button&)>& func
|
|||||||
}
|
}
|
||||||
|
|
||||||
ConfirmWindow& ConfirmWindow::requireCancel(const Function<void(Button&)>& func) {
|
ConfirmWindow& ConfirmWindow::requireCancel(const Function<void(Button&)>& func) {
|
||||||
cancel = dynamic_cast<Button*>(widgets.emplace_back(std::move(Button(0, 0.1, 0.4, 0.08, Location::CENTER, TranslatableText(L"hbp.confirm.cancel")))).ptr());
|
cancel = dynamic_cast<Button*>(widgets.emplace_back(std::move(Button(0, 0.1, 0.4, 0.08, UILocation::CENTER, TranslatableText(L"hbp.confirm.cancel")))).ptr());
|
||||||
cancel->mouseClick = [this](Widget&, MouseButtonCode) {
|
cancel->mouseClick = [this](Widget&, MouseButtonCode) {
|
||||||
game.tasks.pushNewed(allocatedFor(new Task([this](Task& self) {
|
game.tasks.pushNewed(allocatedFor(new Task([this](Task& self) {
|
||||||
if (game.closeWindow(this)) this->onClose();
|
if (game.closeWindow(this)) this->onClose();
|
||||||
self.pop();
|
self.pop();
|
||||||
})));
|
})));
|
||||||
};
|
};
|
||||||
cancel->location = Location::CENTER;
|
cancel->location = UILocation::CENTER;
|
||||||
cancel->backgroundColor.active = 0x99000000;
|
cancel->backgroundColor.active = 0x99000000;
|
||||||
cancel->backgroundColor.hover = 0x99ff0000;
|
cancel->backgroundColor.hover = 0x99ff0000;
|
||||||
cancel->backgroundColor.clicked = 0xffee0000;
|
cancel->backgroundColor.clicked = 0xffee0000;
|
||||||
+12
-12
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Animation.h"
|
#include "..\def.h"
|
||||||
#include "def.h"
|
#include "..\utils\gc.h"
|
||||||
#include "gc.h"
|
#include "..\render\Renderer.h"
|
||||||
#include "Renderer.h"
|
#include "..\game\Animation.h"
|
||||||
#include "IText.h"
|
#include "..\utils\IText.h"
|
||||||
|
|
||||||
class WindowManager;
|
class WindowManager;
|
||||||
|
|
||||||
@@ -58,21 +58,21 @@ protected:
|
|||||||
bool isAbsoluteLocation = false;
|
bool isAbsoluteLocation = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Location location;
|
UILocation location;
|
||||||
Location textLocation = Location::CENTER; // 多余字节预声明备用
|
UILocation textLocation = UILocation::CENTER; // 多余字节预声明备用
|
||||||
char unused[2]{}; // [0]: [1]: maxRestore_flag_IsZoomed
|
char unused[2]{}; // [0]: [1]: maxRestore_flag_IsZoomed
|
||||||
|
|
||||||
Widget(const double x, const double y, const double w, const double h, const Location location) : x(x), y(y), w(w), h(h), location(location) {}
|
Widget(const double x, const double y, const double w, const double h, const UILocation location) : x(x), y(y), w(w), h(h), location(location) {}
|
||||||
|
|
||||||
unsigned int colorSelector(const Color& clr) const;
|
unsigned int colorSelector(const Color& clr) const;
|
||||||
void render() const noexcept override;
|
void render() const noexcept override;
|
||||||
|
|
||||||
Widget& alignLocation(const Location loc) noexcept {
|
Widget& alignLocation(const UILocation loc) noexcept {
|
||||||
location = loc;
|
location = loc;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget& alignTextLocation(const Location loc) noexcept {
|
Widget& alignTextLocation(const UILocation loc) noexcept {
|
||||||
textLocation = loc;
|
textLocation = loc;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -220,8 +220,8 @@ class Button : public Widget {
|
|||||||
public:
|
public:
|
||||||
ObjectHolder<IText> name;
|
ObjectHolder<IText> name;
|
||||||
Animation animation = Animation().features(Animation::AS_CUBIC).setDuration(20);
|
Animation animation = Animation().features(Animation::AS_CUBIC).setDuration(20);
|
||||||
Button(const double x, const double y, const double w, const double h, const Location location, const ObjectHolder<IText>& text) : Widget(x, y, w, h, location), name(text) {}
|
Button(const double x, const double y, const double w, const double h, const UILocation location, const ObjectHolder<IText>& text) : Widget(x, y, w, h, location), name(text) {}
|
||||||
Button(const double x, const double y, const double w, const double h, const Location location, ObjectHolder<IText>&& text) : Widget(x, y, w, h, location), name(std::move(text)) {}
|
Button(const double x, const double y, const double w, const double h, const UILocation location, ObjectHolder<IText>&& text) : Widget(x, y, w, h, location), name(std::move(text)) {}
|
||||||
void render() const noexcept override;
|
void render() const noexcept override;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@ class StartWindow final : public Window {
|
|||||||
TranslatableText title = TranslatableText(L"hbp.title");
|
TranslatableText title = TranslatableText(L"hbp.title");
|
||||||
|
|
||||||
StartWindow() {
|
StartWindow() {
|
||||||
Button* start = dynamic_cast<Button*>(widgets.emplace_back(std::move(Button(0, 0.1, 0.4, 0.08, Location::CENTER, L"hbp.button.exit"_translates))).ptr());
|
Button* start = dynamic_cast<Button*>(widgets.emplace_back(std::move(Button(0, 0.1, 0.4, 0.08, UILocation::CENTER, L"hbp.button.exit"_translates))).ptr());
|
||||||
start->onTick = [](const Widget& self, MouseButtonCode) { if (self.containsMouse()) game.getFloatWindow().push(L"hbp.float.exit"_translates.getRenderableString()); };
|
start->onTick = [](const Widget& self, MouseButtonCode) { if (self.containsMouse()) game.getFloatWindow().push(L"hbp.float.exit"_translates.getRenderableString()); };
|
||||||
start->mouseClick = [](Widget&, MouseButtonCode) {
|
start->mouseClick = [](Widget&, MouseButtonCode) {
|
||||||
game.setWindow(&ConfirmWindow::of(L"hbp.confirming.exit"_translates)->requireCancel().requireConfirm([](Button& confirm) {
|
game.setWindow(&ConfirmWindow::of(L"hbp.confirming.exit"_translates)->requireCancel().requireConfirm([](Button& confirm) {
|
||||||
@@ -18,9 +18,9 @@ class StartWindow final : public Window {
|
|||||||
confirm.onTick = [](Widget& self, MouseButtonCode) { if (self.containsMouse()) self.backgroundColor.hover = static_cast<Button&>(self).animation.adaptsColor(0x99008800, 0x9900ff00); };
|
confirm.onTick = [](Widget& self, MouseButtonCode) { if (self.containsMouse()) self.backgroundColor.hover = static_cast<Button&>(self).animation.adaptsColor(0x99008800, 0x9900ff00); };
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
Button* optn = dynamic_cast<Button*>(widgets.emplace_back(std::move(Button(0, 0.2, 0.4, 0.08, Location::CENTER, L"hbp.button.settings"_translates))).ptr());
|
Button* optn = dynamic_cast<Button*>(widgets.emplace_back(std::move(Button(0, 0.2, 0.4, 0.08, UILocation::CENTER, L"hbp.button.settings"_translates))).ptr());
|
||||||
optn->onTick = [](const Widget& self, MouseButtonCode) { if (self.containsMouse()) game.getFloatWindow().push(L"hbp.float.settings"_translates.getRenderableString()); };
|
optn->onTick = [](const Widget& self, MouseButtonCode) { if (self.containsMouse()) game.getFloatWindow().push(L"hbp.float.settings"_translates.getRenderableString()); };
|
||||||
Button* exit = dynamic_cast<Button*>(widgets.emplace_back(std::move(Button(0, 0.3, 0.4, 0.08, Location::CENTER, L"hbp.button.start"_translates))).ptr());
|
Button* exit = dynamic_cast<Button*>(widgets.emplace_back(std::move(Button(0, 0.3, 0.4, 0.08, UILocation::CENTER, L"hbp.button.start"_translates))).ptr());
|
||||||
exit->onTick = [](const Widget& self, MouseButtonCode) { if (self.containsMouse()) game.getFloatWindow().push(L"hbp.float.start"_translates.getRenderableString()); };
|
exit->onTick = [](const Widget& self, MouseButtonCode) { if (self.containsMouse()) game.getFloatWindow().push(L"hbp.float.start"_translates.getRenderableString()); };
|
||||||
exit->mouseClick = [](Widget&, MouseButtonCode) {
|
exit->mouseClick = [](Widget&, MouseButtonCode) {
|
||||||
game.setWindow(&ConfirmWindow::of(L"hbp.confirming.start"_translates)->requireCancel().requireConfirm([](Button& confirm) {
|
game.setWindow(&ConfirmWindow::of(L"hbp.confirming.start"_translates)->requireCancel().requireConfirm([](Button& confirm) {
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "def.h"
|
#include "..\def.h"
|
||||||
|
|
||||||
[[nodiscard]] inline unsigned int wtouib16(const wchar* string) noexcept {
|
[[nodiscard]] inline unsigned int wtouib16(const wchar* string) noexcept {
|
||||||
unsigned int ret = 0;
|
unsigned int ret = 0;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
#include "def.h"
|
#include "..\def.h"
|
||||||
|
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
#include "File.h"
|
#include "File.h"
|
||||||
@@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "..\def.h"
|
||||||
|
|
||||||
class File final {
|
class File final {
|
||||||
public:
|
public:
|
||||||
String path{};
|
String path{};
|
||||||
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
#include "IText.h"
|
#include "IText.h"
|
||||||
|
|
||||||
#include "def.h"
|
#include "..\def.h"
|
||||||
#include "Renderer.h"
|
#include "..\render\Renderer.h"
|
||||||
|
|
||||||
int RenderableString::getHeight() const noexcept {
|
int RenderableString::getHeight() const noexcept {
|
||||||
int height = 0;
|
int height = 0;
|
||||||
@@ -5,10 +5,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
#include "def.h"
|
#include "..\def.h"
|
||||||
#include "Chars.h"
|
#include "Chars.h"
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
#include "InteractManager.h"
|
#include "..\interact\InteractManager.h"
|
||||||
|
|
||||||
class LiteralText;
|
class LiteralText;
|
||||||
class Translator;
|
class Translator;
|
||||||
@@ -4,9 +4,9 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "def.h"
|
#include "..\def.h"
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
#include "Game.h"
|
#include "..\game\Game.h"
|
||||||
|
|
||||||
String PublicLogger::build(const String& msg, const String& type) const {
|
String PublicLogger::build(const String& msg, const String& type) const {
|
||||||
return L"T-" + qwtowb10(game.getTick(), 8) + name + type + msg + L"\n";
|
return L"T-" + qwtowb10(game.getTick(), 8) + name + type + msg + L"\n";
|
||||||
@@ -4,7 +4,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "warnings.h"
|
#include "..\warnings.h"
|
||||||
|
#include "..\def.h"
|
||||||
#include "File.h"
|
#include "File.h"
|
||||||
|
|
||||||
class Exception : public std::exception {
|
class Exception : public std::exception {
|
||||||
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "warnings.h"
|
#include "..\warnings.h"
|
||||||
#include "def.h"
|
#include "..\def.h"
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
|
|
||||||
struct IGarbage;
|
struct IGarbage;
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
//
|
||||||
|
// Created by EmsiaetKadosh on 25-3-21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "..\warnings.h"
|
||||||
|
|
||||||
|
class Vector3D;
|
||||||
|
class Vector2D;
|
||||||
|
|
||||||
|
class Vector3D {
|
||||||
|
double x, y, z;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Vector3D(const double x, const double y, const double z) noexcept : x(x), y(y), z(z) {}
|
||||||
|
Vector3D() noexcept : x(0), y(0), z(0) {}
|
||||||
|
Vector3D(const Vector3D& other) noexcept = default;
|
||||||
|
Vector3D(Vector3D&& other) noexcept = default;
|
||||||
|
Vector3D& operator=(const Vector3D& other) noexcept = default;
|
||||||
|
Vector3D& operator=(Vector3D&& other) noexcept = default;
|
||||||
|
~Vector3D() noexcept = default;
|
||||||
|
|
||||||
|
[[nodiscard]] double getX() const noexcept { return x; }
|
||||||
|
[[nodiscard]] double getY() const noexcept { return y; }
|
||||||
|
[[nodiscard]] double getZ() const noexcept { return z; }
|
||||||
|
|
||||||
|
[[nodiscard]] Vector3D operator+(const Vector3D& other) const noexcept { return Vector3D(x + other.x, y + other.y, z + other.z); }
|
||||||
|
[[nodiscard]] Vector3D operator-(const Vector3D& other) const noexcept { return Vector3D(x - other.x, y - other.y, z - other.z); }
|
||||||
|
[[nodiscard]] Vector3D operator*(const double scalar) const noexcept { return Vector3D(x * scalar, y * scalar, z * scalar); }
|
||||||
|
[[nodiscard]] Vector3D operator/(const double scalar) const noexcept { return Vector3D(x / scalar, y / scalar, z / scalar); }
|
||||||
|
[[nodiscard]] double operator*(const Vector3D& other) const noexcept { return x * other.x + y * other.y + z * other.z; }
|
||||||
|
|
||||||
|
Vector3D& operator+=(const Vector3D& other) noexcept {
|
||||||
|
x += other.x;
|
||||||
|
y += other.y;
|
||||||
|
z += other.z;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3D& operator-=(const Vector3D& other) noexcept {
|
||||||
|
x -= other.x;
|
||||||
|
y -= other.y;
|
||||||
|
z -= other.z;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3D& operator*=(const double scalar) noexcept {
|
||||||
|
x *= scalar;
|
||||||
|
y *= scalar;
|
||||||
|
z *= scalar;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3D& operator/=(const double scalar) noexcept {
|
||||||
|
x /= scalar;
|
||||||
|
y /= scalar;
|
||||||
|
z /= scalar;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] Vector3D operator-() const noexcept { return Vector3D(-x, -y, -z); }
|
||||||
|
bool operator==(const Vector3D& other) const noexcept { return x == other.x && y == other.y && z == other.z; }
|
||||||
|
bool operator!=(const Vector3D& other) const noexcept { return x != other.x || y != other.y || z != other.z; }
|
||||||
|
|
||||||
|
[[nodiscard]] double length() const noexcept { return std::sqrt(x * x + y * y + z * z); }
|
||||||
|
|
||||||
|
[[nodiscard]] Vector3D getNormalized() const noexcept {
|
||||||
|
if (x == 0.0 && y == 0.0 && z == 0) return Vector3D(0.0, 0.0, 0.0);
|
||||||
|
const double length = this->length();
|
||||||
|
return Vector3D(x / length, y / length, z / length);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3D& normalize() noexcept {
|
||||||
|
if (x == 0 && y == 0 && z == 0) return *this;
|
||||||
|
const double length = this->length();
|
||||||
|
x /= length;
|
||||||
|
y /= length;
|
||||||
|
z /= length;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] double dot(const Vector3D& other) const noexcept { return x * other.x + y * other.y + z * other.z; }
|
||||||
|
[[nodiscard]] Vector3D cross(const Vector3D& other) const noexcept { return Vector3D(y * other.z - z * other.y, z * other.x - x * other.z, x * other.y - y * other.x); }
|
||||||
|
};
|
||||||
|
|
||||||
|
class Vector2D {
|
||||||
|
double x, y;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Vector2D(const double x, const double y) noexcept : x(x), y(y) {}
|
||||||
|
Vector2D() noexcept : x(0), y(0) {}
|
||||||
|
Vector2D(const Vector2D& other) noexcept = default;
|
||||||
|
Vector2D(Vector2D&& other) noexcept = default;
|
||||||
|
Vector2D& operator=(const Vector2D& other) noexcept = default;
|
||||||
|
Vector2D& operator=(Vector2D&& other) noexcept = default;
|
||||||
|
~Vector2D() noexcept = default;
|
||||||
|
|
||||||
|
[[nodiscard]] double getX() const noexcept { return x; }
|
||||||
|
[[nodiscard]] double getY() const noexcept { return y; }
|
||||||
|
|
||||||
|
[[nodiscard]] Vector2D operator+(const Vector2D& other) const noexcept { return Vector2D(x + other.x, y + other.y); }
|
||||||
|
[[nodiscard]] Vector2D operator-(const Vector2D& other) const noexcept { return Vector2D(x - other.x, y - other.y); }
|
||||||
|
[[nodiscard]] Vector2D operator*(const double scalar) const noexcept { return Vector2D(x * scalar, y * scalar); }
|
||||||
|
[[nodiscard]] Vector2D operator/(const double scalar) const noexcept { return Vector2D(x / scalar, y / scalar); }
|
||||||
|
[[nodiscard]] double operator*(const Vector2D& other) const noexcept { return x * other.x + y * other.y; }
|
||||||
|
|
||||||
|
Vector2D& operator+=(const Vector2D& other) noexcept {
|
||||||
|
x += other.x;
|
||||||
|
y += other.y;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2D& operator-=(const Vector2D& other) noexcept {
|
||||||
|
x -= other.x;
|
||||||
|
y -= other.y;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2D& operator*=(const double scalar) noexcept {
|
||||||
|
x *= scalar;
|
||||||
|
y *= scalar;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2D& operator/=(const double scalar) noexcept {
|
||||||
|
x /= scalar;
|
||||||
|
y /= scalar;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] Vector2D operator-() const noexcept { return Vector2D(-x, -y); }
|
||||||
|
bool operator==(const Vector2D& other) const noexcept { return x == other.x && y == other.y; }
|
||||||
|
bool operator!=(const Vector2D& other) const noexcept { return x != other.x || y != other.y; }
|
||||||
|
|
||||||
|
[[nodiscard]] double length() const noexcept { return std::sqrt(x * x + y * y); }
|
||||||
|
|
||||||
|
[[nodiscard]] Vector2D getNormalized() const noexcept {
|
||||||
|
if (x == 0.0 && y == 0.0) return Vector2D(0.0, 0.0);
|
||||||
|
const double length = this->length();
|
||||||
|
return Vector2D(x / length, y / length);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2D& normalize() noexcept {
|
||||||
|
if (x == 0 && y == 0) return *this;
|
||||||
|
const double length = this->length();
|
||||||
|
x /= length;
|
||||||
|
y /= length;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] double dot(const Vector2D& other) const noexcept { return x * other.x + y * other.y; }
|
||||||
|
[[nodiscard]] Vector3D cross(const Vector2D& other) const noexcept { return Vector3D(0, 0, x * other.y - y * other.x); }
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user