Magic_Game/core/e2dmodule.h

329 lines
5.9 KiB
C
Raw Normal View History

2018-10-03 22:02:46 +08:00
// Copyright (c) 2016-2018 Easy2D - Nomango
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#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-10-03 18:04:04 +08:00
// ͼ<><CDBC><EFBFBD>
class Graphics
{
2018-09-05 13:38:30 +08:00
public:
2018-10-03 18:04:04 +08:00
Graphics(
HWND hwnd
2018-09-05 13:38:30 +08:00
);
2018-10-03 18:04:04 +08:00
~Graphics();
2018-09-05 13:38:30 +08:00
2018-10-03 18:04:04 +08:00
// <20><>ʼ<EFBFBD><CABC>Ⱦ
void BeginDraw();
2018-10-03 18:04:04 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ
void EndDraw();
2018-07-17 00:35:27 +08:00
2018-10-03 18:04:04 +08:00
// <20><>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
void DrawDebugInfo();
2018-09-07 17:26:21 +08:00
// <20><>ȡ ID2D1Factory <20><><EFBFBD><EFBFBD>
2018-10-03 18:04:04 +08:00
ID2D1Factory * GetFactory() const;
2018-09-07 17:26:21 +08:00
// <20><>ȡ IWICImagingFactory <20><><EFBFBD><EFBFBD>
2018-10-03 18:04:04 +08:00
IWICImagingFactory * GetImagingFactory() const;
2018-09-07 17:26:21 +08:00
// <20><>ȡ IDWriteFactory <20><><EFBFBD><EFBFBD>
2018-10-03 18:04:04 +08:00
IDWriteFactory * GetWriteFactory() const;
2018-09-07 17:26:21 +08:00
// <20><>ȡ ID2D1HwndRenderTarget <20><><EFBFBD><EFBFBD>
2018-10-03 18:04:04 +08:00
ID2D1HwndRenderTarget * GetRenderTarget() const;
2018-09-07 17:26:21 +08:00
// <20><>ȡ ID2D1SolidColorBrush <20><><EFBFBD><EFBFBD>
2018-10-03 18:04:04 +08:00
ID2D1SolidColorBrush * GetSolidBrush() const;
2018-09-07 17:26:21 +08:00
2018-10-03 18:04:04 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD>
2018-10-03 22:02:46 +08:00
E2DTextRenderer * GetTextRender() const;
2018-08-19 15:11:20 +08:00
2018-10-03 18:04:04 +08:00
// <20><>ȡ Miter <20><>ʽ<EFBFBD><CABD> ID2D1StrokeStyle
ID2D1StrokeStyle * GetMiterStrokeStyle();
2018-10-03 18:04:04 +08:00
// <20><>ȡ Bevel <20><>ʽ<EFBFBD><CABD> ID2D1StrokeStyle
ID2D1StrokeStyle * GetBevelStrokeStyle();
2018-08-15 23:30:23 +08:00
2018-10-03 18:04:04 +08:00
// <20><>ȡ Round <20><>ʽ<EFBFBD><CABD> ID2D1StrokeStyle
ID2D1StrokeStyle * GetRoundStrokeStyle();
2018-08-15 23:30:23 +08:00
2018-10-06 11:15:32 +08:00
// <20><>ȡ DPI
static float GetDpi();
2018-09-05 13:38:30 +08:00
protected:
D2D1_COLOR_F clear_color_;
2018-10-03 18:04:04 +08:00
ID2D1Factory* factory_;
IWICImagingFactory* imaging_factory_;
IDWriteFactory* write_factory_;
ID2D1StrokeStyle* miter_stroke_style_;
ID2D1StrokeStyle* bevel_stroke_style_;
ID2D1StrokeStyle* round_stroke_style_;
2018-10-03 22:02:46 +08:00
E2DTextRenderer* text_renderer_;
2018-09-05 13:38:30 +08:00
IDWriteTextFormat* fps_text_format_;
IDWriteTextLayout* fps_text_layout_;
ID2D1SolidColorBrush* solid_brush_;
ID2D1HwndRenderTarget* render_target_;
};
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>
class Input
{
public:
2018-10-03 18:04:04 +08:00
Input(
HWND hwnd
);
2018-09-02 14:30:48 +08:00
2018-10-03 18:04:04 +08:00
~Input();
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-10-03 18:04:04 +08:00
// ˢ<><CBA2><EFBFBD>豸״̬
void Flush();
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
// <20><>Ƶ<EFBFBD>
class Audio
{
public:
2018-10-03 18:04:04 +08:00
Audio();
2018-09-02 14:30:48 +08:00
2018-10-03 18:04:04 +08:00
~Audio();
2018-09-02 14:30:48 +08:00
2018-10-03 18:04:04 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>
void Open();
2018-09-02 14:30:48 +08:00
2018-10-03 18:04:04 +08:00
// <20>ر<EFBFBD><D8B1>
void Close();
2018-09-02 14:30:48 +08:00
2018-10-03 18:04:04 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
HRESULT CreateVoice(
IXAudio2SourceVoice ** voice,
WAVEFORMATEX * wfx,
VoiceCallback * callback
);
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-30 14:54:43 +08:00
};
2018-09-02 14:30:48 +08:00
2018-09-30 14:54:43 +08:00
2018-10-03 18:04:04 +08:00
// <20>
class Device
2018-09-30 14:54:43 +08:00
{
2018-10-03 18:04:04 +08:00
public:
// <20><>ȡͼ<C8A1><CDBC><EFBFBD>
static Graphics * GetGraphics();
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>
static Input * GetInput();
// <20><>ȡ<EFBFBD><C8A1>Ƶ<EFBFBD>
static Audio * GetAudio();
// <20><>ʼ<EFBFBD><CABC>
static void Init(
HWND hwnd
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
static void Destroy();
};
// <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
struct Options
{
String title; // <20><><EFBFBD><EFBFBD>
int width; // <20><><EFBFBD><EFBFBD>
int height; // <20>߶<EFBFBD>
int icon; // ͼ<><CDBC><EFBFBD><EFBFBD>Դ ID
bool debug_mode; // <20><><EFBFBD><EFBFBD>ģʽ
Options()
2018-09-30 14:54:43 +08:00
: title(L"Easy2D Game")
, width(640)
, height(480)
, icon(0)
, debug_mode(false)
{
}
2018-09-05 13:38:30 +08:00
};
2018-09-02 14:30:48 +08:00
2018-09-30 14:54:43 +08:00
// <20><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-05 13:38:30 +08:00
class Game
{
public:
2018-10-03 18:04:04 +08:00
// <20><>ʼ
virtual void Start() = 0;
2018-08-15 23:30:23 +08:00
2018-10-06 09:45:28 +08:00
// <20><><EFBFBD><EFBFBD>
virtual void Update(float dt) {}
2018-10-03 18:04:04 +08:00
// <20><><EFBFBD><EFBFBD>
void Run(
const Options& options = Options()
);
2018-08-15 00:06:03 +08:00
2018-10-03 18:04:04 +08:00
// <20><><EFBFBD><EFBFBD>
2018-09-05 13:38:30 +08:00
void Quit();
2018-08-15 00:06:03 +08:00
2018-10-03 22:43:21 +08:00
// <20>رմ<D8B1><D5B4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> false <20><><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>ڹر<DAB9>
virtual bool OnExit() { return true; }
2018-09-30 14:54:43 +08:00
// <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(
int resource_id /* ͼ<><CDBC><EFBFBD><EFBFBD>Դ ID */
);
2018-08-15 00:06:03 +08:00
2018-10-03 18:04:04 +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><DABE><EFBFBD>
HWND GetHWnd() const;
2018-09-10 15:28:19 +08:00
// <20>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
2018-09-05 13:38:30 +08:00
void EnterScene(
2018-09-10 15:28:19 +08:00
Scene * scene, /* <20><><EFBFBD><EFBFBD> */
Transition * transition = nullptr /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
2018-09-05 13:38:30 +08:00
);
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-10-03 18:04:04 +08:00
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-05 13:38:30 +08:00
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>
2018-10-06 09:45:28 +08:00
void UpdateScene(
float dt
);
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-10-03 18:04:04 +08:00
// <20><>ȡʵ<C8A1><CAB5>
static Game * GetInstance();
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-30 14:54:43 +08:00
// <20><>ʼ<EFBFBD><CABC>
void Init();
// <20><><EFBFBD>ݿͻ<DDBF><CDBB><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
Rect Locate(
int width,
int height
);
2018-10-06 11:15:32 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
void EnterNextScene();
2018-09-30 14:54:43 +08:00
// 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
);
2018-10-03 18:04:04 +08:00
protected:
2018-09-30 14:54:43 +08:00
HWND hwnd_;
String title_;
int width_;
int height_;
int icon_;
bool debug_mode_;
bool quit_;
Scene* curr_scene_;
Scene* next_scene_;
Transition* transition_;
2018-09-05 13:38:30 +08:00
};
2018-05-19 01:10:37 +08:00
2018-09-05 13:38:30 +08:00
}