577 lines
8.5 KiB
C++
577 lines
8.5 KiB
C++
#pragma once
|
||
#include "e2dmacros.h"
|
||
#include "e2dcommon.h"
|
||
#include "e2dcustom.h"
|
||
|
||
|
||
// Base Classes
|
||
|
||
namespace e2d
|
||
{
|
||
|
||
|
||
// 游戏控制
|
||
class Game
|
||
{
|
||
public:
|
||
// 获取游戏实例
|
||
static Game * getInstance();
|
||
|
||
// 销毁实例
|
||
static void destroyInstance();
|
||
|
||
// 启动游戏
|
||
void start(
|
||
bool cleanup = true /* 自动清理资源 */
|
||
);
|
||
|
||
// 暂停游戏
|
||
void pause();
|
||
|
||
// 继续游戏
|
||
void resume();
|
||
|
||
// 结束游戏
|
||
void quit();
|
||
|
||
// 清理资源
|
||
void cleanup();
|
||
|
||
// 重置游戏内部计时
|
||
void reset();
|
||
|
||
// 游戏是否暂停
|
||
bool isPaused();
|
||
|
||
private:
|
||
Game();
|
||
|
||
~Game();
|
||
|
||
E2D_DISABLE_COPY(Game);
|
||
|
||
private:
|
||
bool _ended;
|
||
bool _paused;
|
||
bool _initialized;
|
||
static Game * _instance;
|
||
};
|
||
|
||
|
||
// 窗口控制
|
||
class Window
|
||
{
|
||
friend class Game;
|
||
|
||
public:
|
||
// 鼠标指针样式
|
||
enum class Cursor : int
|
||
{
|
||
Normal, /* 默认指针样式 */
|
||
Hand, /* 手状指针 */
|
||
No, /* 禁止指针 */
|
||
Wait, /* 沙漏指针 */
|
||
ArrowWait /* 默认指针和小沙漏 */
|
||
};
|
||
|
||
public:
|
||
// 获取窗口实例
|
||
static Window * getInstance();
|
||
|
||
// 销毁窗口实例
|
||
static void destroyInstance();
|
||
|
||
// 创建窗口互斥体
|
||
bool createMutex(
|
||
const String& mutex = L"" /* 进程互斥体名称 */
|
||
);
|
||
|
||
// 修改窗口大小
|
||
void setSize(
|
||
int width, /* 窗口宽度 */
|
||
int height /* 窗口高度 */
|
||
);
|
||
|
||
// 设置窗口标题
|
||
void setTitle(
|
||
const String& title /* 窗口标题 */
|
||
);
|
||
|
||
// 设置窗口图标
|
||
void setIcon(
|
||
int iconID
|
||
);
|
||
|
||
// 设置鼠标指针样式
|
||
void setCursor(
|
||
Cursor cursor
|
||
);
|
||
|
||
// 获取窗口标题
|
||
String getTitle();
|
||
|
||
// 获取窗口宽度
|
||
double getWidth();
|
||
|
||
// 获取窗口高度
|
||
double getHeight();
|
||
|
||
// 获取窗口大小
|
||
Size getSize();
|
||
|
||
// 获取窗口句柄
|
||
HWND getHWnd();
|
||
|
||
// 打开/隐藏控制台
|
||
void showConsole(
|
||
bool show = true
|
||
);
|
||
|
||
// 是否允许响应输入法
|
||
void setTypewritingEnable(
|
||
bool enable
|
||
);
|
||
|
||
// 弹出提示窗口
|
||
void info(
|
||
const String& text, /* 内容 */
|
||
const String& title = L"Infomation" /* 窗口标题 */
|
||
);
|
||
|
||
// 弹出警告窗口
|
||
void warning(
|
||
const String& text, /* 内容 */
|
||
const String& title = L"Warning" /* 窗口标题 */
|
||
);
|
||
|
||
// 弹出错误窗口
|
||
void error(
|
||
const String& text, /* 内容 */
|
||
const String& title = L"Error" /* 窗口标题 */
|
||
);
|
||
|
||
private:
|
||
Window();
|
||
|
||
~Window();
|
||
|
||
E2D_DISABLE_COPY(Window);
|
||
|
||
// 注册窗口
|
||
HWND __create();
|
||
|
||
// 处理窗口消息
|
||
void __poll();
|
||
|
||
// Win32 窗口消息回调程序
|
||
static LRESULT CALLBACK WndProc(
|
||
HWND hWnd,
|
||
UINT message,
|
||
WPARAM wParam,
|
||
LPARAM lParam
|
||
);
|
||
|
||
private:
|
||
HWND _hWnd;
|
||
Size _size;
|
||
String _title;
|
||
int _iconID;
|
||
|
||
static Window * _instance;
|
||
};
|
||
|
||
|
||
// 时间控制
|
||
class Time
|
||
{
|
||
friend class Game;
|
||
|
||
public:
|
||
// 获取上一帧的时间间隔(秒)
|
||
static double getDeltaTime();
|
||
|
||
// 获取游戏总时长(秒)
|
||
static double getTotalTime();
|
||
|
||
private:
|
||
// 初始化计时操作
|
||
static bool __init();
|
||
|
||
// 是否达到更新时间
|
||
static bool __isReady();
|
||
|
||
// 更新当前时间
|
||
static void __updateNow();
|
||
|
||
// 更新时间信息
|
||
static void __updateLast();
|
||
|
||
// 重置时间信息
|
||
static void __reset();
|
||
|
||
// 挂起线程
|
||
static void __sleep();
|
||
|
||
private:
|
||
static std::chrono::steady_clock::time_point _start;
|
||
static std::chrono::steady_clock::time_point _now;
|
||
static std::chrono::steady_clock::time_point _last;
|
||
static std::chrono::steady_clock::time_point _fixedLast;
|
||
static std::chrono::milliseconds _interval;
|
||
};
|
||
|
||
|
||
class Listener;
|
||
|
||
// 输入设备
|
||
class Input
|
||
{
|
||
friend class Game;
|
||
|
||
public:
|
||
// 鼠标键值
|
||
enum class Mouse : int
|
||
{
|
||
Left, /* 鼠标左键 */
|
||
Right, /* 鼠标右键 */
|
||
Middle /* 鼠标中键 */
|
||
};
|
||
|
||
|
||
// 键盘键值
|
||
enum class Key : int
|
||
{
|
||
Up = 0xC8,
|
||
Left = 0xCB,
|
||
Right = 0xCD,
|
||
Down = 0xD0,
|
||
Enter = 0x1C,
|
||
Space = 0x39,
|
||
Esc = 0x01,
|
||
Q = 0x10,
|
||
W = 0x11,
|
||
E = 0x12,
|
||
R = 0x13,
|
||
T = 0x14,
|
||
Y = 0x15,
|
||
U = 0x16,
|
||
I = 0x17,
|
||
O = 0x18,
|
||
P = 0x19,
|
||
A = 0x1E,
|
||
S = 0x1F,
|
||
D = 0x20,
|
||
F = 0x21,
|
||
G = 0x22,
|
||
H = 0x23,
|
||
J = 0x24,
|
||
K = 0x25,
|
||
L = 0x26,
|
||
Z = 0x2C,
|
||
X = 0x2D,
|
||
C = 0x2E,
|
||
V = 0x2F,
|
||
B = 0x30,
|
||
N = 0x31,
|
||
M = 0x32,
|
||
Num1 = 0x02,
|
||
Num2 = 0x03,
|
||
Num3 = 0x04,
|
||
Num4 = 0x05,
|
||
Num5 = 0x06,
|
||
Num6 = 0x07,
|
||
Num7 = 0x08,
|
||
Num8 = 0x09,
|
||
Num9 = 0x0A,
|
||
Num0 = 0x0B,
|
||
Numpad7 = 0x47,
|
||
Numpad8 = 0x48,
|
||
Numpad9 = 0x49,
|
||
Numpad4 = 0x4B,
|
||
Numpad5 = 0x4C,
|
||
Numpad6 = 0x4D,
|
||
Numpad1 = 0x4F,
|
||
Numpad2 = 0x50,
|
||
Numpad3 = 0x51,
|
||
Numpad0 = 0x52
|
||
};
|
||
|
||
public:
|
||
// 获取输入设备实例
|
||
static Input * getInstance();
|
||
|
||
// 销毁输入设备实例
|
||
static void destroyInstance();
|
||
|
||
// 检测键盘某按键是否正被按下
|
||
bool isDown(
|
||
Key key
|
||
);
|
||
|
||
// 检测键盘某按键是否被点击
|
||
bool isPress(
|
||
Key key
|
||
);
|
||
|
||
// 检测键盘某按键是否正在松开
|
||
bool isRelease(
|
||
Key key
|
||
);
|
||
|
||
// 检测鼠标按键是否正被按下
|
||
bool isDown(
|
||
Mouse code
|
||
);
|
||
|
||
// 检测鼠标按键是否被点击
|
||
bool isPress(
|
||
Mouse code
|
||
);
|
||
|
||
// 检测鼠标按键是否正在松开
|
||
bool isRelease(
|
||
Mouse code
|
||
);
|
||
|
||
// 获得鼠标X轴坐标值
|
||
double getMouseX();
|
||
|
||
// 获得鼠标Y轴坐标值
|
||
double getMouseY();
|
||
|
||
// 获得鼠标坐标值
|
||
Point getMousePos();
|
||
|
||
// 获得鼠标X轴坐标增量
|
||
double getMouseDeltaX();
|
||
|
||
// 获得鼠标Y轴坐标增量
|
||
double getMouseDeltaY();
|
||
|
||
// 获得鼠标Z轴(鼠标滚轮)坐标增量
|
||
double getMouseDeltaZ();
|
||
|
||
// 添加输入监听
|
||
static Listener * addListener(
|
||
const Function& func, /* 监听到用户输入时的执行函数 */
|
||
const String& name = L"", /* 监听器名称 */
|
||
bool paused = false /* 是否暂停 */
|
||
);
|
||
|
||
// 添加碰撞监听
|
||
static void addListener(
|
||
Listener * listener /* 监听器 */
|
||
);
|
||
|
||
// 移除监听器
|
||
static void removeListener(
|
||
Listener * listener /* 监听器 */
|
||
);
|
||
|
||
// 启动输入监听
|
||
static void startListener(
|
||
const String& name
|
||
);
|
||
|
||
// 停止输入监听
|
||
static void stopListener(
|
||
const String& name
|
||
);
|
||
|
||
// 移除输入监听
|
||
static void removeListener(
|
||
const String& name
|
||
);
|
||
|
||
// 启动所有监听器
|
||
static void startAllListeners();
|
||
|
||
// 停止所有监听器
|
||
static void stopAllListeners();
|
||
|
||
// 移除所有监听器
|
||
static void removeAllListeners();
|
||
|
||
private:
|
||
Input();
|
||
|
||
~Input();
|
||
|
||
E2D_DISABLE_COPY(Input);
|
||
|
||
// 刷新输入信息
|
||
void __update();
|
||
|
||
// 刷新设备状态
|
||
void __updateDeviceState();
|
||
|
||
// 更新监听器
|
||
static void __updateListeners();
|
||
|
||
// 清空监听器
|
||
static void __clearListeners();
|
||
|
||
private:
|
||
IDirectInput8* _directInput;
|
||
IDirectInputDevice8* _keyboardDevice;
|
||
IDirectInputDevice8* _mouseDevice;
|
||
DIMOUSESTATE _mouseState;
|
||
DIMOUSESTATE _mouseStateRecord;
|
||
POINT _mousePos;
|
||
|
||
static Input * _instance;
|
||
};
|
||
|
||
|
||
// 渲染器
|
||
class Renderer
|
||
{
|
||
friend class Game;
|
||
friend class Window;
|
||
|
||
public:
|
||
// 获取渲染器实例
|
||
static Renderer * getInstance();
|
||
|
||
// 销毁实例
|
||
static void destroyInstance();
|
||
|
||
// 获取背景色
|
||
Color getBackgroundColor();
|
||
|
||
// 修改背景色
|
||
void setBackgroundColor(
|
||
Color color
|
||
);
|
||
|
||
// 显示 FPS
|
||
void showFps(
|
||
bool show = true
|
||
);
|
||
|
||
// 获取文字渲染器
|
||
TextRenderer * getTextRenderer();
|
||
|
||
// 获取 ID2D1HwndRenderTarget 对象
|
||
ID2D1HwndRenderTarget * getRenderTarget();
|
||
|
||
// 获取 ID2D1SolidColorBrush 对象
|
||
ID2D1SolidColorBrush * getSolidColorBrush();
|
||
|
||
// 获取 ID2D1Factory 对象
|
||
static ID2D1Factory * getFactory();
|
||
|
||
// 获取 IWICImagingFactory 对象
|
||
static IWICImagingFactory * getImagingFactory();
|
||
|
||
// 获取 IDWriteFactory 对象
|
||
static IDWriteFactory * getWriteFactory();
|
||
|
||
// 获取 FPS 文本格式化对象
|
||
static IDWriteTextFormat * getFpsTextFormat();
|
||
|
||
// 获取 Miter 样式的 ID2D1StrokeStyle
|
||
static ID2D1StrokeStyle * getMiterStrokeStyle();
|
||
|
||
// 获取 Bevel 样式的 ID2D1StrokeStyle
|
||
static ID2D1StrokeStyle * getBevelStrokeStyle();
|
||
|
||
// 获取 Round 样式的 ID2D1StrokeStyle
|
||
static ID2D1StrokeStyle * getRoundStrokeStyle();
|
||
|
||
private:
|
||
Renderer();
|
||
|
||
~Renderer();
|
||
|
||
E2D_DISABLE_COPY(Renderer);
|
||
|
||
// 渲染游戏画面
|
||
void __render();
|
||
|
||
// 创建设备相关资源
|
||
bool __createDeviceResources();
|
||
|
||
// 删除设备相关资源
|
||
void __discardDeviceResources();
|
||
|
||
private:
|
||
bool _showFps;
|
||
D2D1_COLOR_F _clearColor;
|
||
ID2D1HwndRenderTarget* _renderTarget;
|
||
ID2D1SolidColorBrush* _solidBrush;
|
||
TextRenderer* _textRenderer;
|
||
|
||
static ID2D1Factory* _d2dFactory;
|
||
static IWICImagingFactory* _imagingFactory;
|
||
static IDWriteFactory* _writeFactory;
|
||
static IDWriteTextFormat* _textFormat;
|
||
static ID2D1StrokeStyle* _miterStrokeStyle;
|
||
static ID2D1StrokeStyle* _bevelStrokeStyle;
|
||
static ID2D1StrokeStyle* _roundStrokeStyle;
|
||
static Renderer * _instance;
|
||
};
|
||
|
||
|
||
// 垃圾回收装置
|
||
class GC
|
||
{
|
||
friend class Game;
|
||
|
||
public:
|
||
// 获取 GC 实例
|
||
static GC* getInstance();
|
||
|
||
// 保留对象
|
||
template <typename Type>
|
||
static inline void retain(Type*& p)
|
||
{
|
||
if (p != nullptr)
|
||
{
|
||
p->retain();
|
||
}
|
||
}
|
||
|
||
// 释放对象
|
||
template <typename Type>
|
||
static inline void release(Type*& p)
|
||
{
|
||
if (p != nullptr)
|
||
{
|
||
p->release();
|
||
p = nullptr;
|
||
}
|
||
}
|
||
|
||
// 通知 GC 回收垃圾内存
|
||
void notify();
|
||
|
||
// 手动回收垃圾内存
|
||
void flush();
|
||
|
||
// 将对象放入 GC
|
||
void addObject(
|
||
Object * pObject
|
||
);
|
||
|
||
// 清空所有对象
|
||
void clear();
|
||
|
||
private:
|
||
GC() {}
|
||
|
||
~GC();
|
||
|
||
E2D_DISABLE_COPY(GC);
|
||
|
||
// 更新 GC
|
||
void __update();
|
||
|
||
private:
|
||
bool _notifyed;
|
||
std::set<Object*> _pool;
|
||
|
||
static GC _instance;
|
||
};
|
||
|
||
} |