184 lines
3.6 KiB
C
184 lines
3.6 KiB
C
|
|
#pragma once
|
|||
|
|
#include <Windows.h>
|
|||
|
|
#include <tchar.h>
|
|||
|
|
#include <atltypes.h>
|
|||
|
|
#include <vector>
|
|||
|
|
#include <stack>
|
|||
|
|
#include <functional>
|
|||
|
|
|
|||
|
|
// String macros
|
|||
|
|
|
|||
|
|
#ifdef UNICODE
|
|||
|
|
#define tstring std::wstring
|
|||
|
|
#else
|
|||
|
|
#define tstring std::string
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Safe macros
|
|||
|
|
|
|||
|
|
#define SAFE_DELETE(p) { delete (p); (p) = nullptr; }
|
|||
|
|
#define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p); (p) = nullptr; } }
|
|||
|
|
#define SAFE_RELEASE(p) { if (p) p->release(); }
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Type Declare
|
|||
|
|
|
|||
|
|
typedef CPoint CVector;
|
|||
|
|
typedef unsigned int VK_KEY;
|
|||
|
|
typedef std::function<void()> CLICK_CALLBACK;
|
|||
|
|
typedef std::function<void()> TIMER_CALLBACK;
|
|||
|
|
typedef std::function<void(VK_KEY)> KEY_CALLBACK;
|
|||
|
|
typedef std::function<void()> MOUSE_CALLBACK;
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Classes Declare
|
|||
|
|
|
|||
|
|
namespace easy2d
|
|||
|
|
{
|
|||
|
|
class Scene;
|
|||
|
|
class Node;
|
|||
|
|
|
|||
|
|
class App
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
App();
|
|||
|
|
~App();
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ڿ<EFBFBD>ѡģʽ
|
|||
|
|
enum MODE { SHOW_CONSOLE = 1, NO_CLOSE = 2, NO_MINI_MIZE = 4 };
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
|||
|
|
void createWindow(int width, int height, int mode = 0);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
|||
|
|
void createWindow(CSize size, int mode = 0);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
|||
|
|
void createWindow(tstring title, int width, int height, int mode = 0);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
|||
|
|
void createWindow(tstring title, CSize size, int mode = 0);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int run();
|
|||
|
|
// <20>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>Դ
|
|||
|
|
void free();
|
|||
|
|
// <20><><EFBFBD>ٸö<D9B8><C3B6><EFBFBD>
|
|||
|
|
void destory();
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
|||
|
|
static App * get();
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>
|
|||
|
|
static void setOrigin(int originX, int originY);
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
static int getOriginX();
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
static int getOriginY();
|
|||
|
|
// <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
|
|||
|
|
static void quit();
|
|||
|
|
// <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
|
|||
|
|
static void end();
|
|||
|
|
// <20>Ĵ<DEB8><C4B4>ڴ<EFBFBD>С
|
|||
|
|
static void setWindowSize(int width, int height);
|
|||
|
|
// <20>Ĵ<DEB8><C4B4>ڴ<EFBFBD>С
|
|||
|
|
static void setWindowSize(CSize size);
|
|||
|
|
// <20>رմ<D8B1><D5B4><EFBFBD>
|
|||
|
|
static void close();
|
|||
|
|
// <20><><EFBFBD>ô<EFBFBD><C3B4>ڱ<EFBFBD><DAB1><EFBFBD>
|
|||
|
|
static void setWindowTitle(tstring title);
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD>
|
|||
|
|
static tstring getWindowTitle();
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD>
|
|||
|
|
static int getWidth();
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڸ߶<DAB8>
|
|||
|
|
static int getHeight();
|
|||
|
|
// <20>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
static void enterScene(Scene *scene, bool save = true);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
|||
|
|
static void backScene();
|
|||
|
|
// <20><><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD>
|
|||
|
|
static void clearScene();
|
|||
|
|
// <20><><EFBFBD><EFBFBD> AppName
|
|||
|
|
static void setAppName(tstring appname);
|
|||
|
|
// <20><>ȡ AppName
|
|||
|
|
static tstring getAppName();
|
|||
|
|
// <20>Ĵ<DEB8><C4B4>ڱ<EFBFBD><DAB1><EFBFBD>ɫ
|
|||
|
|
static void setBkColor(COLORREF color);
|
|||
|
|
// <20><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>
|
|||
|
|
static void setFPS(DWORD fps);
|
|||
|
|
// <20><><EFBFBD>û<EFBFBD>ͼ<EFBFBD><CDBC>ʽΪĬ<CEAA><C4AC>ֵ
|
|||
|
|
static void reset();
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
|
|||
|
|
static Scene * getCurrentScene();
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
tstring m_sTitle;
|
|||
|
|
tstring m_sAppName;
|
|||
|
|
Scene* m_CurrentScene;
|
|||
|
|
Scene* m_NextScene;
|
|||
|
|
std::stack<Scene*> m_SceneStack;
|
|||
|
|
LARGE_INTEGER m_nAnimationInterval;
|
|||
|
|
CSize m_Size;
|
|||
|
|
int m_nWindowMode;
|
|||
|
|
bool m_bRunning;
|
|||
|
|
bool m_bSaveScene;
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
void _initGraph();
|
|||
|
|
void _mainLoop();
|
|||
|
|
void _enterNextScene();
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
class FreePool
|
|||
|
|
{
|
|||
|
|
friend class App;
|
|||
|
|
friend class Object;
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
// ˢ<><CBA2><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
|
|||
|
|
static void __flush();
|
|||
|
|
// <20><>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷų<CDB7>
|
|||
|
|
static void __add(Object * nptr);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
class Scene
|
|||
|
|
{
|
|||
|
|
friend class App;
|
|||
|
|
friend class MouseMsg;
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
Scene();
|
|||
|
|
~Scene();
|
|||
|
|
|
|||
|
|
// <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Զ<EFBFBD>ִ<EFBFBD><D6B4>
|
|||
|
|
virtual void onEnter();
|
|||
|
|
// <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뿪<EFBFBD><EBBFAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Զ<EFBFBD>ִ<EFBFBD><D6B4>
|
|||
|
|
virtual void onExit();
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void add(Node * child, int zOrder = 0);
|
|||
|
|
// ɾ<><C9BE><EFBFBD>ӳ<EFBFBD>Ա
|
|||
|
|
bool del(Node * child);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>Ա
|
|||
|
|
void clearAllChildren();
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
std::vector<Node*> m_vChildren;
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
void _exec();
|
|||
|
|
void _onDraw();
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
class Object
|
|||
|
|
{
|
|||
|
|
friend class FreePool;
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
Object();
|
|||
|
|
virtual ~Object();
|
|||
|
|
|
|||
|
|
void retain();
|
|||
|
|
void release();
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
int m_nRef;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
} // End of easy2d namespace
|