Magic_Game/core/e2dmodule.h

396 lines
6.2 KiB
C
Raw Normal View History

#pragma once
2018-09-05 13:17:07 +08:00
#include "e2dimpl.h"
2018-09-06 23:26:32 +08:00
#include "e2dobject.h"
2018-09-05 13:17:07 +08:00
#include "e2dtransition.h"
2017-10-13 11:42:36 +08:00
namespace e2d
{
2018-01-30 16:45:38 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD>
class Window
{
2018-09-05 13:38:30 +08:00
public:
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʽ
enum class Cursor : int
{
Normal, /* Ĭ<><C4AC>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʽ */
Hand, /* <20><>״ָ<D7B4><D6B8> */
No, /* <20><>ָֹ<D6B9><D6B8> */
Wait, /* ɳ©ָ<C2A9><D6B8> */
ArrowWait /* Ĭ<><C4AC>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Сɳ© */
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
enum class PopupStyle : int
{
Info, /* <20><>ʾ */
Warning, /* <20><><EFBFBD><EFBFBD> */
Error /* <20><><EFBFBD><EFBFBD> */
};
public:
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
static Window * GetInstance();
// <20><><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD>ʵ<EFBFBD><CAB5>
static void DestroyInstance();
2018-09-07 17:26:21 +08:00
// <20><>ȡ<EFBFBD><C8A1>Ļ<EFBFBD><C4BB>С
static Size GetScreenSize();
2018-09-05 13:38:30 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const String& GetTitle() const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int GetWidth() const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
int GetHeight() const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
Size GetSize() const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> DPI
float GetDpi() const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
HWND GetHWnd();
// <20>޸Ĵ<DEB8><C4B4><EFBFBD><EFBFBD><EFBFBD>С
void SetSize(
int width, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int height /* <20><><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD> */
);
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void SetTitle(
const String& title /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
);
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>ͼ<EFBFBD><CDBC>
void SetIcon(
2018-09-07 18:00:56 +08:00
int resource_id /* ͼ<><CDBC><EFBFBD><EFBFBD>Դ ID */
2018-09-05 13:38:30 +08:00
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʽ
void SetCursor(
Cursor cursor
);
// <20>򿪻<EFBFBD><F2BFAABB><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>̨
void SetConsoleEnabled(
bool enabled
);
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>
void SetTypewritingEnabled(
bool enabled
);
// <20><><EFBFBD><EFBFBD><E2B4B0><EFBFBD>Ƿ<EFBFBD>Ψһ
// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> false ˵<><CBB5><EFBFBD><EFBFBD>Ϸ<EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>Է<EFBFBD>ֹ<EFBFBD>û<EFBFBD>ͬʱ<CDAC>򿪶<EFBFBD><F2BFAAB6><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
bool CheckUnique();
2018-09-05 13:38:30 +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>ť
bool Popup(
const String& text, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
const String& title, /* <20><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD> */
PopupStyle style = PopupStyle::Info,/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ */
bool has_cancel = false /* <20><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ť */
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
void Poll();
private:
Window();
~Window();
E2D_DISABLE_COPY(Window);
// <20><><EFBFBD>ݿͻ<DDBF><CDBB><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
Rect Locate(
int width,
int height
);
// Win32 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
static LRESULT CALLBACK WndProc(
HWND hWnd,
UINT msg,
WPARAM w_param,
LPARAM l_param
);
private:
HWND hWnd_;
MSG msg_;
int width_;
int height_;
int icon_id_;
float dpi_;
String title_;
2018-09-05 13:38:30 +08:00
static Window * instance_;
};
2018-07-17 00:35:27 +08:00
2018-09-05 13:38:30 +08:00
// <20><>Ⱦ<EFBFBD><C8BE>
class Renderer
{
public:
// <20><>ȡ<EFBFBD><C8A1>Ⱦ<EFBFBD><C8BE>ʵ<EFBFBD><CAB5>
static Renderer * GetInstance();
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
static void DestroyInstance();
2018-09-07 17:26:21 +08:00
// <20><>ȡ ID2D1Factory <20><><EFBFBD><EFBFBD>
static ID2D1Factory * GetFactory();
// <20><>ȡ IWICImagingFactory <20><><EFBFBD><EFBFBD>
static IWICImagingFactory * GetImagingFactory();
// <20><>ȡ IDWriteFactory <20><><EFBFBD><EFBFBD>
static IDWriteFactory * GetWriteFactory();
// <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();
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD><C8BE>
E2DTextRenderer * GetTextRenderer();
// <20><>ȡ ID2D1HwndRenderTarget <20><><EFBFBD><EFBFBD>
ID2D1HwndRenderTarget * GetRenderTarget();
// <20><>ȡ ID2D1SolidColorBrush <20><><EFBFBD><EFBFBD>
ID2D1SolidColorBrush * GetSolidBrush();
2018-09-05 13:38:30 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ɫ
Color GetBackgroundColor();
2018-09-05 13:38:30 +08:00
// <20>޸ı<DEB8><C4B1><EFBFBD>ɫ
void SetBackgroundColor(
const Color& color
);
2017-10-29 23:48:32 +08:00
2018-09-05 13:38:30 +08:00
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FPS
// Ĭ<>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>
void ShowFps(
bool show
);
2018-08-19 15:11:20 +08:00
2018-09-05 13:38:30 +08:00
// <20><>ʼ<EFBFBD><CABC>Ⱦ
void BeginDraw();
2018-08-28 00:06:10 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ
void EndDraw();
2018-08-28 00:06:10 +08:00
2018-09-05 13:38:30 +08:00
protected:
Renderer();
2018-09-05 13:38:30 +08:00
~Renderer();
2018-08-15 23:30:23 +08:00
2018-09-05 13:38:30 +08:00
E2D_DISABLE_COPY(Renderer);
2018-08-15 23:30:23 +08:00
2018-09-05 13:38:30 +08:00
protected:
bool show_fps_;
int render_times_;
Time last_render_time_;
D2D1_COLOR_F clear_color_;
E2DTextRenderer* text_renderer_;
IDWriteTextFormat* fps_text_format_;
IDWriteTextLayout* fps_text_layout_;
ID2D1SolidColorBrush* solid_brush_;
ID2D1HwndRenderTarget* render_target_;
2018-09-04 22:42:34 +08:00
2018-09-05 13:38:30 +08:00
static ID2D1Factory* factory_;
static IWICImagingFactory* imaging_factory_;
static IDWriteFactory* write_factory_;
static ID2D1StrokeStyle* miter_stroke_style_;
static ID2D1StrokeStyle* bevel_stroke_style_;
static ID2D1StrokeStyle* round_stroke_style_;
static Renderer * instance_;
};
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>
class Input
{
public:
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>豸ʵ<E8B1B8><CAB5>
static Input * GetInstance();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸ʵ<E8B1B8><CAB5>
static void DestroyInstance();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <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
);
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB0B4><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool IsDown(
MouseCode code
);
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
float GetMouseX();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
float GetMouseY();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
Point GetMousePos();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float GetMouseDeltaX();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float GetMouseDeltaY();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +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>
float GetMouseDeltaZ();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// ˢ<><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸״̬
void Update();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
protected:
Input();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
~Input();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
E2D_DISABLE_COPY(Input);
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
protected:
IDirectInput8W * direct_input_;
2018-09-05 13:38:30 +08:00
IDirectInputDevice8W* keyboard_device_;
IDirectInputDevice8W* mouse_device_;
DIMOUSESTATE mouse_state_;
char key_buffer_[256];
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
static Input * instance_;
};
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <20><>Ƶ<EFBFBD>
class Audio
{
public:
// <20><>ȡ<EFBFBD><C8A1>Ƶ<EFBFBD>豸ʵ<E8B1B8><CAB5>
static Audio * GetInstance();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
static void DestroyInstance();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <20><>ȡ XAudio2 ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IXAudio2 * GetXAudio2();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <20><>ȡ MasteringVoice ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IXAudio2MasteringVoice* GetMasteringVoice();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
protected:
Audio();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
virtual ~Audio();
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
E2D_DISABLE_COPY(Audio);
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
protected:
IXAudio2 * x_audio2_;
IXAudio2MasteringVoice* mastering_voice_;
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
static Audio * instance_;
};
2018-09-02 14:30:48 +08:00
2018-09-05 13:38:30 +08:00
// <20><>Ϸ
class Game
{
public:
// <20><>ȡ Game ʵ<><CAB5>
static Game * GetInstance();
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
static void DestroyInstance();
2018-08-15 23:30:23 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
void Start();
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
// <20><>ͣ<EFBFBD><CDA3>Ϸ
void Pause();
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
void Resume();
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
void Quit();
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
// <20><>Ϸ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ͣ
bool IsPaused();
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ
void EnterScene(
Scene * scene /* <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8> */
);
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ
void EnterScene(
Transition * transition /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
);
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
Scene * GetCurrentScene();
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +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
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD>³<EFBFBD><C2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void UpdateScene();
2018-08-15 23:30:23 +08:00
2018-09-05 13:38:30 +08:00
// <20><>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void DrawScene();
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
protected:
Game();
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
~Game();
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
E2D_DISABLE_COPY(Game);
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
private:
bool quit_;
bool paused_;
Scene* curr_scene_;
Scene* next_scene_;
Transition* transition_;
2018-09-04 22:42:34 +08:00
2018-09-05 13:38:30 +08:00
static Game * instance_;
};
2018-05-19 01:10:37 +08:00
2018-09-07 00:28:54 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-05 13:38:30 +08:00
class GC
{
private:
GC();
2018-09-05 13:38:30 +08:00
~GC();
2018-09-05 13:38:30 +08:00
E2D_DISABLE_COPY(GC);
2018-09-07 00:28:54 +08:00
static GC instance_;
2018-09-05 13:38:30 +08:00
};
2018-05-19 01:10:37 +08:00
2018-09-05 13:38:30 +08:00
}