Magic_Game/core/e2dbase.h

577 lines
8.5 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-05-19 01:30:07 +08:00
// <20><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
class Game
{
public:
// <20><>ȡ<EFBFBD><C8A1>Ϸʵ<CFB7><CAB5>
2018-07-03 01:49:20 +08:00
static Game * getInstance();
// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
static void destroyInstance();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
2018-07-03 01:49:20 +08:00
void start(
2018-07-04 15:33:09 +08:00
bool cleanup = true /* <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ */
);
2017-10-17 21:22:25 +08:00
// <20><>ͣ<EFBFBD><CDA3>Ϸ
2018-07-03 01:49:20 +08:00
void pause();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
2018-07-03 01:49:20 +08:00
void resume();
2017-12-08 19:50:59 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
2018-07-03 01:49:20 +08:00
void quit();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
void cleanup();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ʱ
2018-07-03 01:49:20 +08:00
void reset();
2018-01-30 16:45:38 +08:00
// <20><>Ϸ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ͣ
2018-07-03 01:49:20 +08:00
bool isPaused();
private:
Game();
~Game();
2018-07-03 01:49:20 +08:00
E2D_DISABLE_COPY(Game);
2018-07-03 01:49:20 +08:00
private:
bool _ended;
bool _paused;
bool _initialized;
static Game * _instance;
2018-01-30 16:45:38 +08:00
};
2018-05-19 01:30:07 +08:00
// <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD>
class Window
2018-01-30 16:45:38 +08:00
{
2018-05-24 00:58:16 +08:00
friend class Game;
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-01-30 16:45:38 +08:00
public:
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
static Window * getInstance();
// <20><><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD>ʵ<EFBFBD><CAB5>
static void destroyInstance();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>
bool createMutex(
const String& mutex = L"" /* <20><><EFBFBD>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
);
// <20>޸Ĵ<DEB8><C4B4>ڴ<EFBFBD>С
void setSize(
int width, /* <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> */
int height /* <20><><EFBFBD>ڸ߶<DAB8> */
);
// <20><><EFBFBD>ô<EFBFBD><C3B4>ڱ<EFBFBD><DAB1><EFBFBD>
void setTitle(
const String& title /* <20><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD> */
);
// <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
);
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD>
String getTitle();
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD>
double getWidth();
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڸ߶<DAB8>
double getHeight();
2017-11-03 12:51:01 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڴ<EFBFBD>С
Size getSize();
2017-11-03 12:51:01 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
HWND getHWnd();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>̨
void showConsole(
2018-05-24 20:37:34 +08:00
bool show = true
);
2018-01-30 16:45:38 +08:00
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>
void setTypewritingEnable(
bool enable
2017-10-17 21:22:25 +08:00
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
void info(
const String& text, /* <20><><EFBFBD><EFBFBD> */
2018-05-21 23:04:58 +08:00
const String& title = L"Infomation" /* <20><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD> */
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B4B0>
void warning(
const String& text, /* <20><><EFBFBD><EFBFBD> */
const String& title = L"Warning" /* <20><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD> */
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󴰿<EFBFBD>
void error(
const String& text, /* <20><><EFBFBD><EFBFBD> */
const String& title = L"Error" /* <20><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD> */
);
2018-01-30 16:45:38 +08:00
private:
Window();
2018-03-01 00:19:09 +08:00
~Window();
E2D_DISABLE_COPY(Window);
2017-12-08 19:50:59 +08:00
2018-07-03 23:39:00 +08:00
// ע<><EFBFBD><E1B4B0>
HWND __create();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
void __poll();
2017-12-08 19:50:59 +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(
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam
);
private:
HWND _hWnd;
Size _size;
String _title;
2018-07-03 23:39:00 +08:00
int _iconID;
2018-07-03 18:42:00 +08:00
static Window * _instance;
2018-01-30 16:45:38 +08:00
};
2017-12-08 19:50:59 +08:00
2018-05-19 01:30:07 +08:00
// ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class Time
2018-01-30 16:45:38 +08:00
{
2018-05-24 00:58:16 +08:00
friend class Game;
2018-01-30 16:45:38 +08:00
public:
2018-07-03 18:42:00 +08:00
// <20><>ȡ<EFBFBD><C8A1>һ֡<D2BB><D6A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-04-24 13:28:21 +08:00
static double getDeltaTime();
// <20><>ȡ<EFBFBD><C8A1>Ϸ<EFBFBD><CFB7>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>
2018-02-27 21:07:43 +08:00
static double getTotalTime();
2018-01-30 16:45:38 +08:00
private:
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
2018-02-01 22:07:44 +08:00
static bool __init();
2018-02-04 21:24:27 +08:00
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFB5BD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
static bool __isReady();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD>µ<EFBFBD>ǰʱ<C7B0><CAB1>
static void __updateNow();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ
static void __updateLast();
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ
static void __reset();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
static void __sleep();
2018-07-03 18:42:00 +08:00
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;
2018-07-04 15:33:09 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>
class Input
{
2018-05-24 00:58:16 +08:00
friend class Game;
public:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
2018-05-18 23:56:36 +08:00
enum class Mouse : int
{
2018-05-24 20:37:34 +08:00
Left, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
Right, /* <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD> */
Middle /* <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD> */
};
2018-05-18 23:56:36 +08:00
// <20><><EFBFBD>̼<EFBFBD>ֵ
2018-05-18 23:56:36 +08:00
enum class Key : int
{
2018-05-24 20:37:34 +08:00
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,
2018-05-24 20:37:34 +08:00
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
};
2017-10-13 14:34:33 +08:00
public:
2018-07-04 15:33:09 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>豸ʵ<E8B1B8><CAB5>
static Input * getInstance();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸ʵ<E8B1B8><CAB5>
static void destroyInstance();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-07-04 15:33:09 +08:00
bool isDown(
2018-05-18 23:56:36 +08:00
Key key
2018-01-30 16:45:38 +08:00
);
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD>Ƿ񱻵<C7B7><F1B1BBB5><EFBFBD>
2018-07-04 15:33:09 +08:00
bool isPress(
2018-05-18 23:56:36 +08:00
Key key
2018-01-30 16:45:38 +08:00
);
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD>
2018-07-04 15:33:09 +08:00
bool isRelease(
2018-05-18 23:56:36 +08:00
Key key
2018-01-30 16:45:38 +08:00
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB0B4><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-07-04 15:33:09 +08:00
bool isDown(
2018-05-18 23:56:36 +08:00
Mouse code
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB0B4><EFBFBD>Ƿ񱻵<C7B7><F1B1BBB5><EFBFBD>
2018-07-04 15:33:09 +08:00
bool isPress(
2018-05-18 23:56:36 +08:00
Mouse code
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB0B4><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD>
2018-07-04 15:33:09 +08:00
bool isRelease(
2018-05-18 23:56:36 +08:00
Mouse code
);
2017-10-14 18:43:32 +08:00
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
2018-07-04 15:33:09 +08:00
double getMouseX();
2017-10-14 18:43:32 +08:00
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
2018-07-04 15:33:09 +08:00
double getMouseY();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
2018-07-04 15:33:09 +08:00
Point getMousePos();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-07-04 15:33:09 +08:00
double getMouseDeltaX();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-07-04 15:33:09 +08:00
double getMouseDeltaY();
2018-01-30 16:45:38 +08:00
// <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>
2018-07-04 15:33:09 +08:00
double getMouseDeltaZ();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static Listener * addListener(
const Function& func, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ִ<EFBFBD>к<EFBFBD><D0BA><EFBFBD> */
const String& name = L"", /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
bool paused = false /* <20>Ƿ<EFBFBD><C7B7><EFBFBD>ͣ */
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD>
static void addListener(
Listener * listener /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
);
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void removeListener(
Listener * listener /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
);
2018-05-22 15:54:01 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void startListener(
const String& name
);
// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void stopListener(
const String& name
);
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void removeListener(
2018-05-22 15:54:01 +08:00
const String& name
);
2018-05-22 15:54:01 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
static void startAllListeners();
// ֹͣ<CDA3><D6B9><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
static void stopAllListeners();
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
static void removeAllListeners();
2018-05-22 15:54:01 +08:00
2018-01-30 16:45:38 +08:00
private:
2018-07-04 15:33:09 +08:00
Input();
~Input();
E2D_DISABLE_COPY(Input);
2018-01-30 16:45:38 +08:00
// ˢ<><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
2018-07-04 15:33:09 +08:00
void __update();
// ˢ<><CBA2><EFBFBD>豸״̬
2018-07-04 15:33:09 +08:00
void __updateDeviceState();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
static void __updateListeners();
// <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
static void __clearListeners();
2018-07-04 15:33:09 +08:00
private:
IDirectInput8* _directInput;
IDirectInputDevice8* _keyboardDevice;
IDirectInputDevice8* _mouseDevice;
DIMOUSESTATE _mouseState;
DIMOUSESTATE _mouseStateRecord;
POINT _mousePos;
static Input * _instance;
2018-01-30 16:45:38 +08:00
};
// <20><>Ⱦ<EFBFBD><C8BE>
class Renderer
2018-01-30 16:45:38 +08:00
{
2018-05-24 00:58:16 +08:00
friend class Game;
friend class Window;
2018-01-30 16:45:38 +08:00
public:
// <20><>ȡ<EFBFBD><C8A1>Ⱦ<EFBFBD><C8BE>ʵ<EFBFBD><CAB5>
static Renderer * getInstance();
// <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-04-17 11:41:33 +08:00
// <20><>ʾ FPS
void showFps(
2018-04-17 11:41:33 +08:00
bool show = true
);
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD><C8BE>
TextRenderer * getTextRenderer();
2018-01-30 16:45:38 +08:00
// <20><>ȡ ID2D1HwndRenderTarget <20><><EFBFBD><EFBFBD>
ID2D1HwndRenderTarget * getRenderTarget();
2018-01-30 16:45:38 +08:00
// <20><>ȡ ID2D1SolidColorBrush <20><><EFBFBD><EFBFBD>
ID2D1SolidColorBrush * getSolidColorBrush();
// <20><>ȡ ID2D1Factory <20><><EFBFBD><EFBFBD>
static ID2D1Factory * getFactory();
2018-01-30 16:45:38 +08:00
// <20><>ȡ IWICImagingFactory <20><><EFBFBD><EFBFBD>
static IWICImagingFactory * getImagingFactory();
2018-01-30 16:45:38 +08:00
// <20><>ȡ IDWriteFactory <20><><EFBFBD><EFBFBD>
static IDWriteFactory * getWriteFactory();
2018-01-30 16:45:38 +08:00
// <20><>ȡ FPS <20>ı<EFBFBD><C4B1><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static IDWriteTextFormat * getFpsTextFormat();
// <20><>ȡ Miter <20><>ʽ<EFBFBD><CABD> ID2D1StrokeStyle
static ID2D1StrokeStyle * getMiterStrokeStyle();
// <20><>ȡ Bevel <20><>ʽ<EFBFBD><CABD> ID2D1StrokeStyle
static ID2D1StrokeStyle * getBevelStrokeStyle();
// <20><>ȡ Round <20><>ʽ<EFBFBD><CABD> ID2D1StrokeStyle
static ID2D1StrokeStyle * getRoundStrokeStyle();
2018-01-30 16:45:38 +08:00
private:
Renderer();
~Renderer();
2018-01-30 16:45:38 +08:00
E2D_DISABLE_COPY(Renderer);
// <20><>Ⱦ<EFBFBD><C8BE>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
void __render();
2018-01-30 16:45:38 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
bool __createDeviceResources();
2018-01-30 16:45:38 +08:00
// ɾ<><C9BE><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
void __discardDeviceResources();
2017-10-14 01:07:34 +08:00
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;
};
2018-05-19 01:10:37 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
class GC
{
2018-05-24 00:58:16 +08:00
friend class Game;
2018-05-19 01:10:37 +08:00
public:
// <20><>ȡ GC ʵ<><CAB5>
static GC* getInstance();
2018-05-19 01:10:37 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
template <typename Type>
static inline void retain(Type*& p)
{
if (p != nullptr)
{
p->retain();
}
}
// <20>ͷŶ<CDB7><C5B6><EFBFBD>
template <typename Type>
static inline void release(Type*& p)
{
if (p != nullptr)
{
p->release();
p = nullptr;
}
}
// ֪ͨ GC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
void notify();
2018-05-19 01:10:37 +08:00
// <20>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
void flush();
2018-05-19 01:10:37 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GC
void addObject(
2018-05-19 01:10:37 +08:00
Object * pObject
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
void clear();
private:
GC() {}
~GC();
E2D_DISABLE_COPY(GC);
2018-05-19 01:10:37 +08:00
// <20><><EFBFBD><EFBFBD> GC
void __update();
2018-05-19 01:10:37 +08:00
private:
bool _notifyed;
std::set<Object*> _pool;
static GC _instance;
2018-05-19 01:10:37 +08:00
};
}