Magic_Game/core/e2dbase.h

442 lines
6.7 KiB
C
Raw Normal View History

#pragma once
2018-04-21 21:24:46 +08:00
#include "e2dmacros.h"
#include "e2dcommon.h"
#include "e2dcustom.h"
2017-10-13 11:42:36 +08:00
// Base Classes
namespace e2d
{
2018-01-30 16:45:38 +08:00
2018-07-13 01:33:53 +08:00
// <20><><EFBFBD><EFBFBD>
class Window
2018-01-30 16:45:38 +08:00
{
public:
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʽ
enum class Cursor : int
{
2018-05-24 20:37:34 +08:00
Normal, /* Ĭ<><C4AC>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʽ */
Hand, /* <20><>״ָ<D7B4><D6B8> */
No, /* <20><>ָֹ<D6B9><D6B8> */
Wait, /* ɳ©ָ<C2A9><D6B8> */
ArrowWait /* Ĭ<><C4AC>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Сɳ© */
};
2018-07-17 00:35:27 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
enum class Popup : int
2018-07-17 00:35:27 +08:00
{
Information, /* <20><>Ϣ */
Warning, /* <20><><EFBFBD><EFBFBD> */
Error /* <20><><EFBFBD><EFBFBD> */
};
2018-01-30 16:45:38 +08:00
public:
2018-08-28 00:06:10 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
static Window * getInstance();
2018-08-28 00:06:10 +08:00
// <20><><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD>ʵ<EFBFBD><CAB5>
static void destroyInstance();
2018-07-13 01:33:53 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BBA5><EFBFBD><EFBFBD>
bool createMutex(
const String& mutex = L"" /* <20><><EFBFBD>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
);
2018-07-13 01:33:53 +08:00
// <20>޸Ĵ<DEB8><C4B4><EFBFBD><EFBFBD><EFBFBD>С
void setSize(
2018-07-13 01:33:53 +08:00
int width, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int height /* <20><><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD> */
);
2018-07-13 01:33:53 +08:00
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void setTitle(
2018-07-13 01:33:53 +08:00
const String& title /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
);
2018-07-13 01:33:53 +08:00
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>ͼ<EFBFBD><CDBC>
void setIcon(
int iconID
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʽ
void setCursor(
Cursor cursor
);
2018-07-13 01:33:53 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
String getTitle() const;
2018-07-13 01:33:53 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int getWidth() const;
2018-07-13 01:33:53 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
int getHeight() const;
2018-07-13 01:33:53 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
Size getSize() const;
2017-11-03 12:51:01 +08:00
2018-07-28 22:22:58 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> DPI
float getDpi() const;
2018-07-28 22:22:58 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
2018-08-28 00:06:10 +08:00
HWND getHWnd();
2018-07-13 01:33:53 +08:00
// <20>򿪻<EFBFBD><F2BFAABB><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>̨
void setConsoleEnabled(
2018-07-13 01:33:53 +08:00
bool enabled
);
2018-01-30 16:45:38 +08:00
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>
void setTypewritingEnabled(
2018-07-04 17:00:21 +08:00
bool enabled
2017-10-17 21:22:25 +08:00
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD><DAB0><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ťʱ<C5A5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ʾ<EFBFBD>û<EFBFBD><C3BB>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>ϰ<EFBFBD>ť
2018-07-17 00:35:27 +08:00
bool popup(
const String& text, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
const String& title, /* <20><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD> */
Popup style = Popup::Information, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ */
bool hasCancel = false /* <20><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ť */
);
2018-07-13 01:33:53 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
void poll();
2018-01-30 16:45:38 +08:00
private:
2018-08-28 00:06:10 +08:00
Window();
~Window();
E2D_DISABLE_COPY(Window);
2018-08-19 15:11:20 +08:00
// <20><><EFBFBD>ݿͻ<DDBF><CDBB><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
Rect _locate(
2018-08-02 00:27:45 +08:00
int width,
int height
);
2018-07-03 23:39:00 +08:00
2018-01-30 16:45:38 +08:00
// Win32 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
2018-07-03 18:42:00 +08:00
static LRESULT CALLBACK WndProc(
2018-08-15 00:06:03 +08:00
HWND hWnd,
UINT uMsg,
WPARAM wParam,
2018-07-03 18:42:00 +08:00
LPARAM lParam
);
private:
HWND _hWnd;
MSG _msg;
2018-08-15 00:06:03 +08:00
int _width;
int _height;
String _title;
2018-07-03 23:39:00 +08:00
int _iconID;
2018-07-28 22:22:58 +08:00
float _dpi;
2018-08-28 00:06:10 +08:00
static Window * _instance;
2018-01-30 16:45:38 +08:00
};
2017-12-08 19:50:59 +08:00
2018-08-19 15:11:20 +08:00
// <20><>Ⱦ<EFBFBD><C8BE>
class Renderer
2018-01-30 16:45:38 +08:00
{
public:
2018-08-28 00:06:10 +08:00
// <20><>ȡ<EFBFBD><C8A1>Ⱦ<EFBFBD><C8BE>ʵ<EFBFBD><CAB5>
static Renderer * getInstance();
2018-08-28 00:06:10 +08:00
// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
static void destroyInstance();
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ɫ
Color getBackgroundColor();
2018-01-30 16:45:38 +08:00
// <20>޸ı<DEB8><C4B1><EFBFBD>ɫ
void setBackgroundColor(
Color color
2017-10-29 23:48:32 +08:00
);
2018-08-19 15:11:20 +08:00
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FPS
// Ĭ<>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>
void showFps(
bool show
);
2018-08-28 00:06:10 +08:00
// <20><>ʼ<EFBFBD><CABC>Ⱦ
void beginDraw();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ
void endDraw();
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD><C8BE>
TextRenderer * getTextRenderer() const { return _textRenderer; }
2018-01-30 16:45:38 +08:00
// <20><>ȡ ID2D1HwndRenderTarget <20><><EFBFBD><EFBFBD>
ID2D1HwndRenderTarget * getRenderTarget() const { return _renderTarget; }
2018-01-30 16:45:38 +08:00
// <20><>ȡ ID2D1SolidColorBrush <20><><EFBFBD><EFBFBD>
ID2D1SolidColorBrush * getSolidColorBrush() const { return _solidBrush; }
2018-08-02 00:27:45 +08:00
// <20><>ȡ ID2D1Factory <20><><EFBFBD><EFBFBD>
2018-08-28 00:06:10 +08:00
static ID2D1Factory * getFactory();
2018-01-30 16:45:38 +08:00
// <20><>ȡ IWICImagingFactory <20><><EFBFBD><EFBFBD>
2018-08-28 00:06:10 +08:00
static IWICImagingFactory * getImagingFactory();
2018-01-30 16:45:38 +08:00
// <20><>ȡ IDWriteFactory <20><><EFBFBD><EFBFBD>
2018-08-28 00:06:10 +08:00
static IDWriteFactory * getWriteFactory();
2018-01-30 16:45:38 +08:00
// <20><>ȡ Miter <20><>ʽ<EFBFBD><CABD> ID2D1StrokeStyle
2018-08-28 00:06:10 +08:00
static ID2D1StrokeStyle * getMiterStrokeStyle();
// <20><>ȡ Bevel <20><>ʽ<EFBFBD><CABD> ID2D1StrokeStyle
2018-08-28 00:06:10 +08:00
static ID2D1StrokeStyle * getBevelStrokeStyle();
// <20><>ȡ Round <20><>ʽ<EFBFBD><CABD> ID2D1StrokeStyle
2018-08-28 00:06:10 +08:00
static ID2D1StrokeStyle * getRoundStrokeStyle();
2018-08-28 00:06:10 +08:00
protected:
Renderer();
2018-08-28 00:06:10 +08:00
~Renderer();
2018-08-15 23:30:23 +08:00
2018-08-28 00:06:10 +08:00
E2D_DISABLE_COPY(Renderer);
2018-08-15 23:30:23 +08:00
2018-08-28 00:06:10 +08:00
protected:
2018-08-19 15:11:20 +08:00
bool _showFps;
2018-07-25 00:07:52 +08:00
int _renderTimes;
Time _lastRenderTime;
D2D1_COLOR_F _clearColor;
TextRenderer* _textRenderer;
IDWriteTextFormat* _fpsFormat;
2018-07-25 00:07:52 +08:00
IDWriteTextLayout* _fpsLayout;
ID2D1SolidColorBrush* _solidBrush;
ID2D1HwndRenderTarget* _renderTarget;
2018-08-28 00:06:10 +08:00
static ID2D1Factory* _factory;
static IWICImagingFactory* _imagingFactory;
static IDWriteFactory* _writeFactory;
static ID2D1StrokeStyle* _miterStrokeStyle;
static ID2D1StrokeStyle* _bevelStrokeStyle;
static ID2D1StrokeStyle* _roundStrokeStyle;
static Renderer * _instance;
2018-08-15 00:06:03 +08:00
};
2018-08-15 00:06:03 +08:00
2018-09-02 14:30:48 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>
class Input
{
public:
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>豸ʵ<E8B1B8><CAB5>
static Input * getInstance();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸ʵ<E8B1B8><CAB5>
static void destroyInstance();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool isDown(
KeyCode key
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB0B4><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool isDown(
MouseCode code
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
float getMouseX();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
float getMouseY();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
Point getMousePos();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float getMouseDeltaX();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float getMouseDeltaY();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD><EFBFBD><E1A3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float getMouseDeltaZ();
// ˢ<><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸״̬
void update();
protected:
Input();
~Input();
E2D_DISABLE_COPY(Input);
protected:
IDirectInput8W * _directInput;
IDirectInputDevice8W* _keyboardDevice;
IDirectInputDevice8W* _mouseDevice;
DIMOUSESTATE _mouseState;
char _keyBuffer[256];
static Input * _instance;
};
// <20><>Ƶ<EFBFBD>
class Audio
{
public:
// <20><>ȡ<EFBFBD><C8A1>Ƶ<EFBFBD>豸ʵ<E8B1B8><CAB5>
static Audio * getInstance();
// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
static void destroyInstance();
// <20><>ȡ XAudio2 ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IXAudio2 * getXAudio2();
// <20><>ȡ MasteringVoice ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IXAudio2MasteringVoice* getMasteringVoice();
protected:
Audio();
virtual ~Audio();
E2D_DISABLE_COPY(Audio);
protected:
IXAudio2 * _xAudio2;
IXAudio2MasteringVoice* _masteringVoice;
static Audio * _instance;
};
2018-08-19 15:11:20 +08:00
class Timer;
class ActionManager;
2018-08-15 23:30:23 +08:00
class Scene;
class Transition;
2018-08-15 00:06:03 +08:00
// <20><>Ϸ
class Game
{
public:
// <20><>ȡ Game ʵ<><CAB5>
static Game * getInstance();
2018-08-15 00:06:03 +08:00
2018-08-28 00:06:10 +08:00
// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
static void destroyInstance();
2018-08-15 23:30:23 +08:00
2018-08-15 00:06:03 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
void start();
// <20><>ͣ<EFBFBD><CDA3>Ϸ
void pause();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
void resume();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
void quit();
// <20><>Ϸ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ͣ
bool isPaused();
2018-08-15 00:06:03 +08:00
2018-08-15 23:30:23 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ
void pushScene(
Scene * scene, /* <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8> */
bool saveCurrentScene = true /* <20>Ƿ񱣴浱ǰ<E6B5B1><C7B0><EFBFBD><EFBFBD> */
2018-08-15 00:06:03 +08:00
);
2018-08-15 23:30:23 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ
void pushScene(
Transition * transition, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
bool saveCurrentScene = true /* <20>Ƿ񱣴浱ǰ<E6B5B1><C7B0><EFBFBD><EFBFBD> */
);
2018-08-15 00:06:03 +08:00
2018-08-15 23:30:23 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ
Scene* popScene();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ
Scene* popScene(
Transition * transition /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
2018-08-15 00:06:03 +08:00
);
2018-08-15 23:30:23 +08:00
// <20><><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD>
void clearAllScenes();
2018-08-15 00:06:03 +08:00
2018-08-15 23:30:23 +08:00
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
Scene * getCurrentScene();
2018-08-15 00:06:03 +08:00
2018-08-15 23:30:23 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ջ
const std::stack<Scene*>& getSceneStack();
2018-08-15 23:30:23 +08:00
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool isTransitioning() const;
2018-08-15 23:30:23 +08:00
// <20><><EFBFBD>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void updateScene();
// <20><>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void drawScene();
2018-08-15 00:06:03 +08:00
protected:
Game();
~Game();
E2D_DISABLE_COPY(Game);
private:
bool _quit;
bool _paused;
2018-08-19 15:11:20 +08:00
Timer* _timer;
2018-08-15 23:30:23 +08:00
Scene* _currScene;
Scene* _nextScene;
Transition* _transition;
2018-08-28 00:06:10 +08:00
Window* _window;
Input* _input;
Renderer* _renderer;
ActionManager* _actionManager;
std::stack<Scene*> _scenes;
static Game * _instance;
};
2018-05-19 01:10:37 +08:00
2018-08-19 15:11:20 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD>
2018-05-19 01:10:37 +08:00
class GC
{
public:
2018-07-22 21:22:27 +08:00
// <20><>ȡ GC ʵ<><CAB5>
static GC * getInstance();
2018-07-22 21:22:27 +08:00
// <20>Զ<EFBFBD><D4B6>ͷ<EFBFBD>
void autorelease(
2018-07-07 01:43:41 +08:00
Ref* ref
);
2018-07-22 21:22:27 +08:00
// <20><>ȫ<EFBFBD><C8AB><EFBFBD>ͷŶ<CDB7><C5B6><EFBFBD>
void safeRelease(
2018-07-07 01:43:41 +08:00
Ref* ref
);
2018-07-07 11:03:03 +08:00
// ˢ<><CBA2><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2018-07-22 21:22:27 +08:00
void flush();
private:
2018-07-06 00:47:50 +08:00
GC();
~GC();
E2D_DISABLE_COPY(GC);
private:
2018-07-07 01:43:41 +08:00
bool _notifyed;
2018-07-13 01:12:22 +08:00
bool _cleanup;
2018-07-22 21:22:27 +08:00
std::set<Ref*> _pool;
2018-05-19 01:10:37 +08:00
};
}