1655 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			1655 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			C++
		
	
	
	
| /******************************************************
 | ||
| * Easy2D Game Engine
 | ||
| * 
 | ||
| * Website: http://www.easy2d.cn
 | ||
| * Github:  https://github.com/Nomango/Easy2D
 | ||
| * Gitee:   https://gitee.com/werelone/Easy2D
 | ||
| ******************************************************/
 | ||
| 
 | ||
| #pragma once
 | ||
| 
 | ||
| #ifndef __cplusplus
 | ||
| 	#error Easy2D is only for C++
 | ||
| #endif
 | ||
| 
 | ||
| #if _MSC_VER < 1900
 | ||
| 	#error Do Visual Studio 2015/2017 specific stuff
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| #include <Windows.h>
 | ||
| #include <tchar.h>
 | ||
| #include <atltypes.h>
 | ||
| #include <atlimage.h>
 | ||
| #include <chrono>
 | ||
| #include <vector>
 | ||
| #include <functional>
 | ||
| #include <random>
 | ||
| 
 | ||
| 
 | ||
| #if defined(UNICODE) && (_DEBUG)
 | ||
| 	#pragma comment(lib,"Easy2Ddw.lib")
 | ||
| #elif !defined(UNICODE) && (_DEBUG)
 | ||
| 	#pragma comment(lib,"Easy2Dd.lib")
 | ||
| #elif defined(UNICODE)
 | ||
| 	#pragma comment(lib,"Easy2Dw.lib")
 | ||
| #elif !defined(UNICODE)
 | ||
| 	#pragma comment(lib,"Easy2D.lib")
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| // 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;
 | ||
| 
 | ||
| #ifdef UNICODE
 | ||
| 	typedef std::wstring TString;
 | ||
| #else
 | ||
| 	typedef std::string TString;
 | ||
| #endif
 | ||
| 
 | ||
| // Classes Declare
 | ||
| 
 | ||
| namespace easy2d
 | ||
| {
 | ||
| 	class App;
 | ||
| 	class Scene;
 | ||
| 
 | ||
| 	class Object;
 | ||
| 	class Node;
 | ||
| 	class FontStyle;
 | ||
| 	class Color;
 | ||
| 	class RectNode;
 | ||
| 	class Text;
 | ||
| 	class Image;
 | ||
| 	class BatchNode;
 | ||
| 	class MouseNode;
 | ||
| 	class Button;
 | ||
| 	class TextButton;
 | ||
| 	class ImageButton;
 | ||
| 	class Layer;
 | ||
| 	class Sprite;
 | ||
| 	class BatchSprite;
 | ||
| 	class Shape;
 | ||
| 	class Circle;
 | ||
| 	class Rectangle;
 | ||
| 
 | ||
| 	class Action;
 | ||
| 	class Animation;
 | ||
| 	class ActionMoveTo;
 | ||
| 	class ActionMoveBy;
 | ||
| 	class ActionScaleTo;
 | ||
| 	class ActionScaleBy;
 | ||
| 	class ActionOpacityTo;
 | ||
| 	class ActionOpacityBy;
 | ||
| 	class ActionFadeIn;
 | ||
| 	class ActionFadeOut;
 | ||
| 	class ActionFrames;
 | ||
| 	class ActionDelay;
 | ||
| 	class ActionCallback;
 | ||
| 	class ActionTwo;
 | ||
| 	class ActionSequence;
 | ||
| 	class ActionNeverStop;
 | ||
| 
 | ||
| 	class MouseMsg;
 | ||
| 	class KeyMsg;
 | ||
| 
 | ||
| 	class FreePool;
 | ||
| 	class FileUtils;
 | ||
| 	class MusicUtils;
 | ||
| 	class ActionManager;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| // Classes
 | ||
| 
 | ||
| namespace easy2d
 | ||
| {
 | ||
| 
 | ||
| class App
 | ||
| {
 | ||
| 	friend Scene;
 | ||
| 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><C8A1><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
 | ||
| 	static App * get();
 | ||
| 	// <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><CDBC>ʽΪĬ<CEAA><C4AC>ֵ
 | ||
| 	static void reset();
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
 | ||
| 	static Scene * getCurrentScene();
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD>еij<D0B5><C4B3><EFBFBD>
 | ||
| 	static Scene * getLoadingScene();
 | ||
| 
 | ||
| protected:
 | ||
| 	TString	m_sTitle;
 | ||
| 	TString	m_sAppName;
 | ||
| 	Scene*	m_pCurrentScene;
 | ||
| 	Scene*	m_pNextScene;
 | ||
| 	Scene*	m_pLoadingScene;
 | ||
| 	CSize	m_Size;
 | ||
| 	int		m_nWindowMode;
 | ||
| 	bool	m_bRunning;
 | ||
| 	bool	m_bSaveScene;
 | ||
| 
 | ||
| protected:
 | ||
| 	void _initGraph();
 | ||
| 	void _draw();
 | ||
| 	void _mainLoop();
 | ||
| 	void _enterNextScene();
 | ||
| };
 | ||
| 
 | ||
| class FreePool
 | ||
| {
 | ||
| 	friend App;
 | ||
| 	friend 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);
 | ||
| 	// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>нڵ<D0BD>
 | ||
| 	static void __clearAllObjects();
 | ||
| };
 | ||
| 
 | ||
| class Scene
 | ||
| {
 | ||
| 	friend App;
 | ||
| 	friend MouseMsg;
 | ||
| public:
 | ||
| 	Scene();
 | ||
| 	~Scene();
 | ||
| 
 | ||
| 	// <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void init();
 | ||
| 	// <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 FreePool;
 | ||
| public:
 | ||
| 	Object();
 | ||
| 	virtual ~Object();
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void retain();
 | ||
| 	// <20>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void release();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void autoRelease();
 | ||
| 
 | ||
| protected:
 | ||
| 	int m_nRefCount;
 | ||
| 	bool m_bAutoRelease;
 | ||
| };
 | ||
| 
 | ||
| class MouseMsg
 | ||
| {
 | ||
| 	friend App;
 | ||
| public:
 | ||
| 	MouseMsg();
 | ||
| 	MouseMsg(TString name, const MOUSE_CALLBACK& callback);
 | ||
| 	~MouseMsg();
 | ||
| 
 | ||
| 	enum MESSAGE 
 | ||
| 	{
 | ||
| 		MOVE = 0x0200,	// <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
 | ||
| 		LBUTTON_DOWN,	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 		LBUTTON_UP,		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̧<EFBFBD><CCA7>
 | ||
| 		LBUTTON_DBLCLK,	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˫<EFBFBD><CBAB>
 | ||
| 		RBUTTON_DOWN,	// <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD><D2BC><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 		RBUTTON_UP,		// <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD>̧<EFBFBD><CCA7>
 | ||
| 		RBUTTON_DBLCLK,	// <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD>˫<EFBFBD><CBAB>
 | ||
| 		MBUTTON_DOWN,	// <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 		MBUTTON_UP,		// <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD>̧<EFBFBD><CCA7>
 | ||
| 		MBUTTON_DBLCLK,	// <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD>˫<EFBFBD><CBAB>
 | ||
| 		WHEEL			// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	};
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void start();
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
 | ||
| 	void stop();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>״̬
 | ||
| 	void wait();
 | ||
| 	// <20><><EFBFBD><EFBFBD>
 | ||
| 	void notify();
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static bool isLButtonDown();
 | ||
| 	// <20>Ҽ<EFBFBD><D2BC>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static bool isRButtonDown();
 | ||
| 	// <20>м<EFBFBD><D0BC>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static bool isMButtonDown();
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD>
 | ||
| 	static int getX();
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Y<EFBFBD><59><EFBFBD><EFBFBD>
 | ||
| 	static int getY();
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static CPoint getPos();
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
 | ||
| 	static int getWheel();
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
 | ||
| 	static MESSAGE getMsg();
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
 | ||
| 	static void addListener(TString name, const MOUSE_CALLBACK& callback);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
 | ||
| 	static void startListener(TString name);
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
 | ||
| 	static void stopListener(TString name);
 | ||
| 	// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
 | ||
| 	static void delListener(TString name);
 | ||
| 	// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
 | ||
| 	static void clearAllListeners();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void notifyAllSceneListeners(Scene* scene);
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void waitAllSceneListeners(Scene* scene);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void clearAllSceneListeners(Scene* scene);
 | ||
| 
 | ||
| private:
 | ||
| 	static void __exec();
 | ||
| 
 | ||
| protected:
 | ||
| 	bool			m_bRunning;
 | ||
| 	bool			m_bWaiting;
 | ||
| 	TString			m_sName;
 | ||
| 	MOUSE_CALLBACK	m_callback;
 | ||
| 	Scene *			m_pParentScene;
 | ||
| 
 | ||
| protected:
 | ||
| 	// ִ<>лص<D0BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void onMouseMsg();
 | ||
| };
 | ||
| 
 | ||
| class KeyMsg
 | ||
| {
 | ||
| 	friend App;
 | ||
| public:
 | ||
| 	KeyMsg(TString name, const KEY_CALLBACK& callback);
 | ||
| 	~KeyMsg();
 | ||
| 
 | ||
| 	// ִ<>лص<D0BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void onKbHit(VK_KEY key);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void start();
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
 | ||
| 	void stop();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>״̬
 | ||
| 	void wait();
 | ||
| 	// <20><><EFBFBD><EFBFBD>
 | ||
| 	void notify();
 | ||
| 
 | ||
| 	// <20>жϼ<D0B6><CFBC>Ƿ<C7B7><F1B1BBB0>£<EFBFBD><C2A3><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD>true
 | ||
| 	static bool isKeyDown(VK_KEY key);
 | ||
| 	// <20><><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void addListener(TString name, const KEY_CALLBACK& callback);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void startListener(TString name);
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void stopListener(TString name);
 | ||
| 	// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void KeyMsg::delListener(TString name);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void notifyAllSceneListeners(Scene* scene);
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void waitAllSceneListeners(Scene* scene);
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	static void clearAllSceneListeners(Scene* scene);
 | ||
| 	// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void clearAllListeners();
 | ||
| 
 | ||
| public:
 | ||
| 	// <20><>ĸ<EFBFBD><C4B8>ֵ
 | ||
| 	static const VK_KEY A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z;
 | ||
| 	// <20><><EFBFBD>ּ<EFBFBD>ֵ
 | ||
| 	static const VK_KEY NUM_1, NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7, NUM_8, NUM_9, NUM_0;
 | ||
| 	// С<><D0A1><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>ֵ
 | ||
| 	static const VK_KEY NUMPAD_1, NUMPAD_2, NUMPAD_3, NUMPAD_4, NUMPAD_5, NUMPAD_6, NUMPAD_7, NUMPAD_8, NUMPAD_9, NUMPAD_0;
 | ||
| 	// <20><><EFBFBD>Ƽ<EFBFBD>ֵ
 | ||
| 	static const VK_KEY Enter, Space, Up, Down, Left, Right, Esc, Shift, LShift, RShift, Ctrl, LCtrl, RCtrl;
 | ||
| 	// F <20><>ֵ
 | ||
| 	static const VK_KEY F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12;
 | ||
| 
 | ||
| private:
 | ||
| 	static void __exec();
 | ||
| 
 | ||
| protected:
 | ||
| 	bool			m_bRunning;
 | ||
| 	bool			m_bWaiting;
 | ||
| 	TString			m_sName;
 | ||
| 	KEY_CALLBACK	m_callback;
 | ||
| 	Scene *			m_pParentScene;
 | ||
| };
 | ||
| 
 | ||
| class FontStyle :
 | ||
| 	public Object
 | ||
| {
 | ||
| 	friend Text;
 | ||
| public:
 | ||
| 	FontStyle();
 | ||
| 	/**
 | ||
| 	*  ʹ<><CAB9> [<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD><C6A1>ֺš<D6BA><C5A1><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD>б<EFBFBD>塢<EFBFBD>»<EFBFBD><C2BB>ߡ<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>ߡ<EFBFBD><DFA1>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>Ƕȡ<C7B6>
 | ||
| 	*  ÿ<><C3BF><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>д<EFBFBD>Ƕȡ<C7B6><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>] <20><><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
 | ||
| 	*/
 | ||
| 	FontStyle(LPCTSTR fontfamily, LONG height = 18, LONG weight = 0, LONG width = 0,
 | ||
| 		bool italic = 0, bool underline = 0, bool strikeout = 0, LONG escapement = 0,
 | ||
| 		LONG orientation = 0, bool quality = true);
 | ||
| 	virtual ~FontStyle();
 | ||
| 
 | ||
| 	// <20><>ȡĬ<C8A1><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static FontStyle * getDefault();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>߶<EFBFBD>
 | ||
| 	void setHeight(LONG value);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
 | ||
| 	void setWidth(LONG value);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void setFontFamily(LPCTSTR value);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʻ<EFBFBD><CABB><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD>Χ0~1000<30><30>Ĭ<EFBFBD><C4AC>Ϊ0
 | ||
| 	void setWeight(LONG value);
 | ||
| 	// <20><><EFBFBD><EFBFBD>б<EFBFBD><D0B1>
 | ||
| 	void setItalic(bool value);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD><C2BB><EFBFBD>
 | ||
| 	void setUnderline(bool value);
 | ||
| 	// <20><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>
 | ||
| 	void setStrikeOut(bool value);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>Ƕȣ<C7B6><C8A3><EFBFBD>λ0.1<EFBFBD>ȣ<EFBFBD>Ĭ<EFBFBD><EFBFBD>Ϊ0
 | ||
| 	void setEscapement(LONG value);
 | ||
| 	// <20><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>Ƕȣ<C7B6><C8A3><EFBFBD>λ0.1<EFBFBD>ȣ<EFBFBD>Ĭ<EFBFBD><EFBFBD>Ϊ0
 | ||
| 	void setOrientation(LONG value);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>忹<EFBFBD><E5BFB9><EFBFBD>ݣ<EFBFBD>Ĭ<EFBFBD><C4AC>Ϊtrue
 | ||
| 	void setQuality(bool value);
 | ||
| 
 | ||
| protected:
 | ||
| 	LOGFONT m_font;
 | ||
| };
 | ||
| 
 | ||
| class FontWeight
 | ||
| {
 | ||
| public:
 | ||
| 	static const LONG dontcare;		// <20><>ϸֵ 0
 | ||
| 	static const LONG thin;			// <20><>ϸֵ 100
 | ||
| 	static const LONG extraLight;	// <20><>ϸֵ 200
 | ||
| 	static const LONG light;		// <20><>ϸֵ 300
 | ||
| 	static const LONG normal;		// <20><>ϸֵ 400
 | ||
| 	static const LONG regular;		// <20><>ϸֵ 400
 | ||
| 	static const LONG medium;		// <20><>ϸֵ 500
 | ||
| 	static const LONG demiBlod;		// <20><>ϸֵ 600
 | ||
| 	static const LONG blod;			// <20><>ϸֵ 700
 | ||
| 	static const LONG extraBold;	// <20><>ϸֵ 800
 | ||
| 	static const LONG black;		// <20><>ϸֵ 900
 | ||
| 	static const LONG heavy;		// <20><>ϸֵ 900
 | ||
| };
 | ||
| 
 | ||
| class Color
 | ||
| {
 | ||
| public:
 | ||
| 	static const COLORREF black;		// <20><>ɫ
 | ||
| 	static const COLORREF blue;			// <20><>ɫ
 | ||
| 	static const COLORREF green;		// <20><>ɫ
 | ||
| 	static const COLORREF cyan;			// <20><>ɫ
 | ||
| 	static const COLORREF red;			// <20><>ɫ
 | ||
| 	static const COLORREF magenta;		// <20><>ɫ
 | ||
| 	static const COLORREF brown;		// <20><>ɫ
 | ||
| 	static const COLORREF lightgray;	// <20><><EFBFBD><EFBFBD>ɫ
 | ||
| 	static const COLORREF darkgray;		// <20><><EFBFBD><EFBFBD>ɫ
 | ||
| 	static const COLORREF lightblue;	// <20><><EFBFBD><EFBFBD>ɫ
 | ||
| 	static const COLORREF lightgreen;	// <20><><EFBFBD><EFBFBD>ɫ
 | ||
| 	static const COLORREF lightcyan;	// <20><><EFBFBD><EFBFBD>ɫ
 | ||
| 	static const COLORREF lightred;		// <20><><EFBFBD><EFBFBD>ɫ
 | ||
| 	static const COLORREF lightmagenta;	// <20><><EFBFBD><EFBFBD>ɫ
 | ||
| 	static const COLORREF yellow;		// <20><><EFBFBD><EFBFBD>ɫ
 | ||
| 	static const COLORREF white;		// <20><>ɫ
 | ||
| 
 | ||
| 	// ͨ<><CDA8><EFBFBD>졢<EFBFBD>̡<EFBFBD><CCA1><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD>ϳ<EFBFBD><CFB3><EFBFBD>ɫ
 | ||
| 	static COLORREF getFromRGB(BYTE r, BYTE g, BYTE b);
 | ||
| 	// ͨ<><CDA8>ɫ<EFBFBD>ࡢ<EFBFBD><E0A1A2><EFBFBD>Ͷȡ<CDB6><C8A1><EFBFBD><EFBFBD>Ⱥϳ<C8BA><CFB3><EFBFBD>ɫ
 | ||
| 	static COLORREF getFromHSL(float H, float S, float L);
 | ||
| 	// ͨ<><CDA8>ɫ<EFBFBD>ࡢ<EFBFBD><E0A1A2><EFBFBD>Ͷȡ<CDB6><C8A1><EFBFBD><EFBFBD>Ⱥϳ<C8BA><CFB3><EFBFBD>ɫ
 | ||
| 	static COLORREF getFromHSV(float H, float S, float V);
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ɫ<EFBFBD>еĺ<D0B5>ɫֵ
 | ||
| 	static BYTE getRValue(COLORREF color);
 | ||
| 	// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ɫ<EFBFBD>е<EFBFBD><D0B5><EFBFBD>ɫֵ
 | ||
| 	static BYTE getGValue(COLORREF color);
 | ||
| 	// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ɫ<EFBFBD>е<EFBFBD><D0B5><EFBFBD>ɫֵ
 | ||
| 	static BYTE getBValue(COLORREF color);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB>Ӧ<EFBFBD>ĻҶ<C4BB>ֵ<EFBFBD><D6B5>ɫ
 | ||
| 	static COLORREF getGray(COLORREF color);
 | ||
| };
 | ||
| 
 | ||
| class Node :
 | ||
| 	public Object
 | ||
| {
 | ||
| 	friend Scene;
 | ||
| 	friend BatchNode;
 | ||
| public:
 | ||
| 	Node();
 | ||
| 	Node(CPoint p);
 | ||
| 	Node(int x, int y);
 | ||
| 	virtual ~Node();
 | ||
| 
 | ||
| 	// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual int getX() const;
 | ||
| 	// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual int getY() const;
 | ||
| 	// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual CPoint getPos() const;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setX(int x);
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setY(int y);
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setPos(int x, int y);
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setPos(CPoint p);
 | ||
| 	// <20>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
 | ||
| 	virtual void move(int x, int y);
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void move(CVector v);
 | ||
| 	// <20>ڵ<EFBFBD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ
 | ||
| 	virtual bool display() const;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ
 | ||
| 	virtual void setDisplay(bool value);
 | ||
| 	// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ͼ˳<CDBC><CBB3>
 | ||
| 	virtual int getZOrder() const;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD>ͼ˳<CDBC><CBB3><EFBFBD><EFBFBD>0Ϊ<30><CEAA><EFBFBD>Ȼ<EFBFBD><C8BB>ƣ<EFBFBD><C6A3><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ײ㣩
 | ||
| 	virtual void setZOrder(int z);
 | ||
| 	// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD>
 | ||
| 	Scene * getParentScene();
 | ||
| 
 | ||
| protected:
 | ||
| 	int		m_nZOrder;
 | ||
| 	bool	m_bDisplay;
 | ||
| 	Scene*	m_pScene;
 | ||
| 	CPoint	m_Pos;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual bool _exec(bool active);
 | ||
| 	virtual void _onDraw() = 0;
 | ||
| 	void setParentScene(Scene * scene);
 | ||
| };
 | ||
| 
 | ||
| class BatchNode :
 | ||
| 	public Node
 | ||
| {
 | ||
| public:
 | ||
| 	BatchNode();
 | ||
| 	virtual ~BatchNode();
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
 | ||
| 	void add(Node *child, int z_Order = 0);
 | ||
| 	// ɾ<><C9BE><EFBFBD>ӽڵ<D3BD>
 | ||
| 	bool del(Node * child);
 | ||
| 	// <20><>ȡ<EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	int getCount();
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
 | ||
| 	std::vector<Node*> &getChildren();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
 | ||
| 	void clearAllChildren();
 | ||
| 
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setX(int x) override;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setY(int y) override;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setPos(int x, int y) override;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setPos(CPoint p) override;
 | ||
| 	// <20>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
 | ||
| 	virtual void move(int x, int y) override;
 | ||
| 	// <20>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
 | ||
| 	virtual void move(CVector v) override;
 | ||
| 
 | ||
| protected:
 | ||
| 	std::vector<Node*> m_vChildren;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual bool _exec(bool active) override;
 | ||
| 	virtual void _onDraw() override;
 | ||
| };
 | ||
| 
 | ||
| class Layer :
 | ||
| 	public BatchNode
 | ||
| {
 | ||
| public:
 | ||
| 	Layer();
 | ||
| 	virtual ~Layer();
 | ||
| 
 | ||
| 	// ͼ<><CDBC><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
 | ||
| 	int getBlock() const;
 | ||
| 	// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
 | ||
| 	void setBlock(bool block);
 | ||
| 
 | ||
| protected:
 | ||
| 	bool m_bBlock;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual bool _exec(bool active) override;
 | ||
| };
 | ||
| 
 | ||
| class RectNode :
 | ||
| 	public Node
 | ||
| {
 | ||
| public:
 | ||
| 	RectNode();
 | ||
| 	~RectNode();
 | ||
| 
 | ||
| 	// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD>ײ
 | ||
| 	virtual bool isCollisionWith(RectNode * rectNode) const;
 | ||
| 	// <20>жϵ<D0B6><CFB5>Ƿ<EFBFBD><C7B7>ڽڵ<DABD><DAB5><EFBFBD>
 | ||
| 	virtual bool isPointIn(CPoint p) const;
 | ||
| 
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5>ڴ<EFBFBD><DAB4>ھ<EFBFBD><DABE><EFBFBD>
 | ||
| 	virtual void setWindowCenter();
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5>ڴ<EFBFBD><DAB4>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setWindowCenterX();
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setWindowCenterY();
 | ||
| 
 | ||
| 	// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual int getX() const override;
 | ||
| 	// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual int getY() const override;
 | ||
| 	// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual CPoint getPos() const override;
 | ||
| 	// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual int getWidth() const;
 | ||
| 	// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5>߶<EFBFBD>
 | ||
| 	virtual int getHeight() const;
 | ||
| 	// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>С
 | ||
| 	virtual CSize getSize() const;
 | ||
| 	// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ڵľ<DAB5><C4BE><EFBFBD>
 | ||
| 	virtual CRect getRect() const;
 | ||
| 
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setX(int x) override;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setY(int y) override;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setPos(int x, int y) override;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setPos(CPoint p) override;
 | ||
| 	// <20>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
 | ||
| 	virtual void move(int x, int y) override;
 | ||
| 	// <20>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
 | ||
| 	virtual void move(CVector v) override;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setWidth(int width);
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5>߶<EFBFBD>
 | ||
| 	virtual void setHeight(int height);
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD>С
 | ||
| 	virtual void setSize(int width, int height);
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD>С
 | ||
| 	virtual void setSize(CSize size);
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD>ڵľ<DAB5><C4BE><EFBFBD>
 | ||
| 	virtual void setRect(int x1, int y1, int x2, int y2);
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD>ڵľ<DAB5><C4BE><EFBFBD>
 | ||
| 	virtual void setRect(CPoint leftTop, CPoint rightBottom);
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD>ڵľ<DAB5><C4BE><EFBFBD>
 | ||
| 	virtual void setRect(CRect rect);
 | ||
| 
 | ||
| protected:
 | ||
| 	CRect m_Rect;
 | ||
| };
 | ||
| 
 | ||
| class Text :
 | ||
| 	public RectNode
 | ||
| {
 | ||
| 	friend TextButton;
 | ||
| public:
 | ||
| 	Text();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD>崴<EFBFBD><E5B4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	Text(TString text, COLORREF color = Color::white, FontStyle * font = FontStyle::getDefault());
 | ||
| 	// <20><><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꡢ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD>崴<EFBFBD><E5B4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	Text(int x, int y, TString text, COLORREF color = Color::white, FontStyle * font = FontStyle::getDefault());
 | ||
| 	virtual ~Text();
 | ||
| 
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0>ɫ
 | ||
| 	COLORREF getColor() const;
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
 | ||
| 	TString getText() const;
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
 | ||
| 	FontStyle * getFontStyle();
 | ||
| 	// <20>ı<EFBFBD><C4B1>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
 | ||
| 	bool isEmpty() const;
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void setText(TString text);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
 | ||
| 	void setColor(COLORREF color);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void setFontStyle(FontStyle * style);
 | ||
| 
 | ||
| protected:
 | ||
| 	TString		m_sText;
 | ||
| 	COLORREF	m_color;
 | ||
| 	FontStyle *	m_pFontStyle;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _onDraw() override;
 | ||
| };
 | ||
| 
 | ||
| class Image :
 | ||
| 	public RectNode
 | ||
| {
 | ||
| 	friend Sprite;
 | ||
| 	friend ImageButton;
 | ||
| public:
 | ||
| 	Image();
 | ||
| 	// <20><>ͼƬ<CDBC>ļ<EFBFBD><C4BC><EFBFBD>ȡͼ<C8A1><CDBC>
 | ||
| 	Image(LPCTSTR ImageFile);
 | ||
| 	/**
 | ||
| 	*  <20><>ͼƬ<CDBC>ļ<EFBFBD><C4BC><EFBFBD>ȡͼ<C8A1><CDBC>
 | ||
| 	*  <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>꣬ͼƬ<CDBC>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>Ⱥ߶<CDB8>
 | ||
| 	*/
 | ||
| 	Image(LPCTSTR ImageFile, int x, int y, int width, int height);
 | ||
| 	virtual ~Image();
 | ||
| 
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	float getScaleX() const;
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	float getScaleY() const;
 | ||
| 	// <20><>ȡ<C8A1><CDB8><EFBFBD><EFBFBD>
 | ||
| 	float getOpacity() const;
 | ||
| 
 | ||
| 	/**
 | ||
| 	*  <20><>ͼƬ<CDBC>ļ<EFBFBD><C4BC><EFBFBD>ȡͼ<C8A1><CDBC>
 | ||
| 	*  <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD>
 | ||
| 	*/
 | ||
| 	bool setImage(LPCTSTR ImageFile);
 | ||
| 	/**
 | ||
| 	*  <20><>ͼƬ<CDBC>ļ<EFBFBD><C4BC><EFBFBD>ȡͼ<C8A1><CDBC>
 | ||
| 	*  <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC>ü<EFBFBD><C3BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>꣬ͼƬ<CDBC>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>Ⱥ߶<CDB8>
 | ||
| 	*  <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD>
 | ||
| 	*/
 | ||
| 	bool setImage(LPCTSTR ImageFile, int x, int y, int width, int height);
 | ||
| 	/**
 | ||
| 	*  <20><><EFBFBD><EFBFBD>Դ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ȡͼ<C8A1><EFBFBD>֧<EFBFBD><D6A7> png
 | ||
| 	*  <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD>
 | ||
| 	*/
 | ||
| 	bool setImageFromRes(LPCTSTR pResName);
 | ||
| 	/**
 | ||
| 	*  <20><><EFBFBD><EFBFBD>Դ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ȡͼ<C8A1><EFBFBD>֧<EFBFBD><D6A7> png
 | ||
| 	*  <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ƣ<EFBFBD>ͼƬ<CDBC>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>꣬ͼƬ<CDBC>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>Ⱥ߶<CDB8>
 | ||
| 	*  <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD>
 | ||
| 	*/
 | ||
| 	bool setImageFromRes(LPCTSTR pResName, int x, int y, int width, int height);
 | ||
| 	// <20>ü<EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD> stretch <20><><EFBFBD>죩
 | ||
| 	void crop(int x, int y, int width, int height);
 | ||
| 	// <20><>ͼƬ<CDBC><C6AC><EFBFBD>쵽<EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void stretch(int width, int height);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ
 | ||
| 	void setScale(float scaleX, float scaleY);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><CDB8><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>Χ 0~1.0f<EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD> png ͼƬ<CDBC><C6AC>Ч<EFBFBD><D0A7>
 | ||
| 	void setOpacity(float value);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><CDB8>ɫ
 | ||
| 	void setTransparentColor(COLORREF value);
 | ||
| 	// <20><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
 | ||
| 	void reset();
 | ||
| 
 | ||
| 	// Ԥ<><D4A4><EFBFBD><EFBFBD>ͼƬ
 | ||
| 	static bool preload(LPCTSTR fileName, bool fromRes = false);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7>ͼ
 | ||
| 	static void saveScreenshot();
 | ||
| 
 | ||
| protected:
 | ||
| 	CImage*	m_pCImage;
 | ||
| 	CRect	m_SrcRect;
 | ||
| 	BYTE	m_nAlpha;
 | ||
| 	float	m_fScaleX;
 | ||
| 	float	m_fScaleY;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _onDraw() override;
 | ||
| };
 | ||
| 
 | ||
| class Sprite :
 | ||
| 	public RectNode
 | ||
| {
 | ||
| 	friend BatchSprite;
 | ||
| public:
 | ||
| 	Sprite();
 | ||
| 	Sprite(Image * image);
 | ||
| 	Sprite(LPCTSTR imageFileName);
 | ||
| 	virtual ~Sprite();
 | ||
| 
 | ||
| 	// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ
 | ||
| 	bool isCollisionWith(Sprite * sprite);
 | ||
| 	// <20>ľ<DEB8><C4BE><EFBFBD>ͼƬ
 | ||
| 	virtual void setImage(Image * image);
 | ||
| 	// ִ<>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	virtual void addAction(Action * action);
 | ||
| 	// ִ<>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	virtual void runAction(Action * action);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void resumeAction(Action * action);
 | ||
| 	// <20><>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>
 | ||
| 	virtual void pauseAction(Action * action);
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
 | ||
| 	virtual void stopAction(Action * action);
 | ||
| 	// <20><>ͣ<EFBFBD><CDA3><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	virtual void pauseAllActions();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	virtual void resumeAllActions();
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	virtual void stopAllActions();
 | ||
| 
 | ||
| 	virtual float getScaleX() const;
 | ||
| 	virtual float getScaleY() const;
 | ||
| 	virtual float getOpacity() const;
 | ||
| 
 | ||
| 	virtual void setScale(float scaleX, float scaleY);
 | ||
| 	virtual void setOpacity(float opacity);
 | ||
| 
 | ||
| protected:
 | ||
| 	float	m_fScaleX;
 | ||
| 	float	m_fScaleY;
 | ||
| 	BYTE	m_nAlpha;
 | ||
| 	Image *	m_pImage;
 | ||
| 
 | ||
| protected:
 | ||
| 	bool _exec(bool active) override;
 | ||
| 	void _onDraw() override;
 | ||
| };
 | ||
| 
 | ||
| class BatchSprite :
 | ||
| 	public Sprite
 | ||
| {
 | ||
| public:
 | ||
| 	BatchSprite();
 | ||
| 	virtual ~BatchSprite();
 | ||
| 
 | ||
| 	// <20><><EFBFBD>Ӿ<EFBFBD><D3BE><EFBFBD>
 | ||
| 	void addSprite(Sprite * sprite, int z_Order = 0);
 | ||
| 	// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	bool delSprite(Sprite * child);
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	int getCount();
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD>о<EFBFBD><D0BE><EFBFBD>
 | ||
| 	std::vector<Sprite*> &getChildren();
 | ||
| 	// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>о<EFBFBD><D0BE><EFBFBD>
 | ||
| 	void clearAllSprites();
 | ||
| 	// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ
 | ||
| 	// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD>ľ<EFBFBD><C4BE>飬<EFBFBD><E9A3AC><EFBFBD>ؿ<F2B7B5BB>ָ<EFBFBD><D6B8>
 | ||
| 	Sprite * isCollisionWith(Sprite * sprite);
 | ||
| 	// <20>жϵ<D0B6><CFB5>Ƿ<EFBFBD><C7B7>ھ<EFBFBD><DABE><EFBFBD><EFBFBD>ڲ<EFBFBD>
 | ||
| 	// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>飬<EFBFBD><E9A3AC><EFBFBD>ؿ<F2B7B5BB>ָ<EFBFBD><D6B8>
 | ||
| 	Sprite * isPointIn(CPoint point);
 | ||
| 	// <20><><EFBFBD>о<EFBFBD><D0BE><EFBFBD>ͬʱִ<CAB1><D6B4>һ<EFBFBD>ζ<EFBFBD><CEB6><EFBFBD>
 | ||
| 	virtual void addAction(Action * action) override;
 | ||
| 	// ͬʱ<CDAC><EFBFBD><DEB8><EFBFBD><EFBFBD>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD>ͼƬ
 | ||
| 	virtual void setImage(Image * image) override;
 | ||
| 
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setX(int x) override;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setY(int y) override;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setPos(int x, int y) override;
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setPos(CPoint p) override;
 | ||
| 	// <20>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
 | ||
| 	virtual void move(int x, int y) override;
 | ||
| 	// <20>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
 | ||
| 	virtual void move(CVector v) override;
 | ||
| 
 | ||
| 	virtual float getScaleX() const override;
 | ||
| 	virtual float getScaleY() const override;
 | ||
| 	virtual float getOpacity() const override;
 | ||
| 
 | ||
| 	virtual void setScale(float scaleX, float scaleY) override;
 | ||
| 	virtual void setOpacity(float opacity) override;
 | ||
| 
 | ||
| protected:
 | ||
| 	std::vector<Sprite*> m_vSprites;
 | ||
| 
 | ||
| protected:
 | ||
| 	bool _exec(bool active) override;
 | ||
| 	void _onDraw() override;
 | ||
| };
 | ||
| 
 | ||
| class MouseNode :
 | ||
| 	public RectNode
 | ||
| {
 | ||
| public:
 | ||
| 	MouseNode();
 | ||
| 	virtual ~MouseNode();
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual bool isMouseIn();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ѡ<EFBFBD><D1A1>
 | ||
| 	virtual bool isSelected();
 | ||
| 	// <20><><EFBFBD>ûص<C3BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setClickedCallback(const CLICK_CALLBACK & callback);
 | ||
| 	// <20><><EFBFBD>ûص<C3BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setMouseInCallback(const CLICK_CALLBACK & callback);
 | ||
| 	// <20><><EFBFBD>ûص<C3BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setMouseOutCallback(const CLICK_CALLBACK & callback);
 | ||
| 	// <20><><EFBFBD>ûص<C3BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setSelectCallback(const CLICK_CALLBACK & callback);
 | ||
| 	// <20><><EFBFBD>ûص<C3BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setUnselectCallback(const CLICK_CALLBACK & callback);
 | ||
| 	// <20><><EFBFBD><EFBFBD>״̬
 | ||
| 	virtual void reset();
 | ||
| 	// <20><><EFBFBD>ýڵ<C3BD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
 | ||
| 	void setBlock(bool block);
 | ||
| 
 | ||
| protected:
 | ||
| 	bool m_bTarget;
 | ||
| 	bool m_bBlock;
 | ||
| 	enum Status { NORMAL, MOUSEIN, SELECTED } m_eStatus;
 | ||
| 	CLICK_CALLBACK m_OnMouseInCallback;
 | ||
| 	CLICK_CALLBACK m_OnMouseOutCallback;
 | ||
| 	CLICK_CALLBACK m_OnSelectCallback;
 | ||
| 	CLICK_CALLBACK m_OnUnselectCallback;
 | ||
| 	CLICK_CALLBACK m_ClickCallback;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual bool _exec(bool active) override;
 | ||
| 	virtual void _onDraw() override;
 | ||
| 
 | ||
| 	// <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>尴ť<E5B0B4><C5A5><EFBFBD>жϷ<D0B6><CFB7><EFBFBD>
 | ||
| 	virtual bool _isMouseIn();
 | ||
| 	// <20>л<EFBFBD>״̬
 | ||
| 	virtual void _setStatus(Status status);
 | ||
| 	// <20><><EFBFBD><EFBFBD>״̬
 | ||
| 	virtual void _onNormal() = 0;
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
 | ||
| 	virtual void _onMouseIn() = 0;
 | ||
| 	// <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ʱ
 | ||
| 	virtual void _onSelected() = 0;
 | ||
| };
 | ||
| 
 | ||
| class Button :
 | ||
| 	public MouseNode
 | ||
| {
 | ||
| public:
 | ||
| 	Button();
 | ||
| 	virtual ~Button();
 | ||
| 
 | ||
| 	// <20><>ť<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual bool isEnable();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setEnable(bool enable);
 | ||
| 
 | ||
| 	// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setX(int x) override;
 | ||
| 	// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setY(int y) override;
 | ||
| 	// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>
 | ||
| 	virtual void setPos(int x, int y) override;
 | ||
| 	// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>
 | ||
| 	virtual void setPos(CPoint p) override;
 | ||
| 	// <20>ƶ<EFBFBD><C6B6><EFBFBD>ť
 | ||
| 	virtual void move(int x, int y) override;
 | ||
| 	// <20>ƶ<EFBFBD><C6B6><EFBFBD>ť
 | ||
| 	virtual void move(CVector v) override;
 | ||
| 
 | ||
| protected:
 | ||
| 	bool m_bEnable;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual bool _exec(bool active) override;
 | ||
| 	virtual void _onDraw() override;
 | ||
| 	virtual void _resetPosition() = 0;
 | ||
| 
 | ||
| 	virtual void _onNormal() = 0;
 | ||
| 	virtual void _onMouseIn() = 0;
 | ||
| 	virtual void _onSelected() = 0;
 | ||
| 	virtual void _onDisable() = 0;
 | ||
| };
 | ||
| 
 | ||
| class TextButton :
 | ||
| 	public Button
 | ||
| {
 | ||
| public:
 | ||
| 	TextButton();
 | ||
| 	TextButton(TString text);
 | ||
| 	TextButton(Text * text);
 | ||
| 	virtual ~TextButton();
 | ||
| 
 | ||
| 	// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>
 | ||
| 	void setNormal(Text * text);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>İ<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>
 | ||
| 	void setMouseIn(Text * text);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ʱ<EFBFBD>İ<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>
 | ||
| 	void setSelected(Text * text);
 | ||
| 	// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>ʱ<EFBFBD>İ<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>
 | ||
| 	void setUnable(Text * text);
 | ||
| 
 | ||
| protected:
 | ||
| 	Text * m_pNormalText;
 | ||
| 	Text * m_pMouseInText;
 | ||
| 	Text * m_pSelectedText;
 | ||
| 	Text * m_pUnableText;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _resetPosition() override;
 | ||
| 
 | ||
| 	virtual void _setStatus(Status status) override;
 | ||
| 	virtual void _onNormal() override;
 | ||
| 	virtual void _onMouseIn() override;
 | ||
| 	virtual void _onSelected() override;
 | ||
| 	virtual void _onDisable() override;
 | ||
| };
 | ||
| 
 | ||
| class ImageButton :
 | ||
| 	public Button
 | ||
| {
 | ||
| public:
 | ||
| 	ImageButton();
 | ||
| 	ImageButton(LPCTSTR image);
 | ||
| 	ImageButton(Image * image);
 | ||
| 	virtual ~ImageButton();
 | ||
| 
 | ||
| 	// <20><><EFBFBD>ð<EFBFBD>ťͼƬ
 | ||
| 	void setNormal(Image * image);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>İ<EFBFBD>ťͼƬ
 | ||
| 	void setMouseIn(Image * image);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ʱ<EFBFBD>İ<EFBFBD>ťͼƬ
 | ||
| 	void setSelected(Image * image);
 | ||
| 	// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>ʱ<EFBFBD>İ<EFBFBD>ťͼƬ
 | ||
| 	void setUnable(Image * image);
 | ||
| 
 | ||
| protected:
 | ||
| 	Image * m_pNormalImage;
 | ||
| 	Image * m_pMouseInImage;
 | ||
| 	Image * m_pSelectedImage;
 | ||
| 	Image * m_pUnableImage;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _resetPosition() override;
 | ||
| 	virtual void _setStatus(Status status) override;
 | ||
| 	virtual void _onNormal() override;
 | ||
| 	virtual void _onMouseIn() override;
 | ||
| 	virtual void _onSelected() override;
 | ||
| 	virtual void _onDisable() override;
 | ||
| };
 | ||
| 
 | ||
| class Shape :
 | ||
| 	public Node
 | ||
| {
 | ||
| public:
 | ||
| 	Shape();
 | ||
| 	virtual ~Shape();
 | ||
| 
 | ||
| 	// <20><>״<EFBFBD><D7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
 | ||
| 	enum STYLE { ROUND, SOLID, FILL } m_eStyle;
 | ||
| 
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1>״<EFBFBD><D7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
 | ||
| 	COLORREF getFillColor() const;
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1>״<EFBFBD><D7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
 | ||
| 	COLORREF getLineColor() const;
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
 | ||
| 	void setFillColor(COLORREF color);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
 | ||
| 	void setLineColor(COLORREF color);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
 | ||
| 	void setStyle(STYLE style);
 | ||
| 
 | ||
| protected:
 | ||
| 	COLORREF fillColor;
 | ||
| 	COLORREF lineColor;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _onDraw() override;
 | ||
| 	virtual void solidShape() = 0;
 | ||
| 	virtual void fillShape() = 0;
 | ||
| 	virtual void roundShape() = 0;
 | ||
| };
 | ||
| 
 | ||
| class Rect :
 | ||
| 	public Shape
 | ||
| {
 | ||
| public:
 | ||
| 	Rect();
 | ||
| 	Rect(int x, int y, int width, int height);
 | ||
| 	virtual ~Rect();
 | ||
| 
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ο<EFBFBD><CEBF><EFBFBD>
 | ||
| 	int getWidth() const;
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD>θ߶<CEB8>
 | ||
| 	int getHeight() const;
 | ||
| 	// <20><><EFBFBD>þ<EFBFBD><C3BE>ο<EFBFBD><CEBF><EFBFBD>
 | ||
| 	void setWidth(int width);
 | ||
| 	// <20><><EFBFBD>þ<EFBFBD><C3BE>θ߶<CEB8>
 | ||
| 	void setHeight(int height);
 | ||
| 	// <20><><EFBFBD>þ<EFBFBD><C3BE>δ<EFBFBD>С
 | ||
| 	void setSize(int width, int height);
 | ||
| 
 | ||
| protected:
 | ||
| 	CSize m_Size;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void solidShape() override;
 | ||
| 	virtual void fillShape() override;
 | ||
| 	virtual void roundShape() override;
 | ||
| };
 | ||
| 
 | ||
| class Circle :
 | ||
| 	public Shape
 | ||
| {
 | ||
| public:
 | ||
| 	Circle();
 | ||
| 	Circle(int x, int y, int radius);
 | ||
| 	virtual ~Circle();
 | ||
| 
 | ||
| 	// <20><>ȡԲ<C8A1>ΰ뾶
 | ||
| 	int getRadius() const;
 | ||
| 	// <20><><EFBFBD><EFBFBD>Բ<EFBFBD>ΰ뾶
 | ||
| 	void setRadius(int m_nRadius);
 | ||
| 
 | ||
| protected:
 | ||
| 	int m_nRadius;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void solidShape() override;
 | ||
| 	virtual void fillShape() override;
 | ||
| 	virtual void roundShape() override;
 | ||
| };
 | ||
| 
 | ||
| class Action :
 | ||
| 	public Object
 | ||
| {
 | ||
| 	friend Sprite;
 | ||
| 	friend ActionManager;
 | ||
| 	friend ActionTwo;
 | ||
| 	friend ActionNeverStop;
 | ||
| 	friend ActionSequence;
 | ||
| public:
 | ||
| 	Action();
 | ||
| 	virtual ~Action();
 | ||
| 
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
 | ||
| 	virtual bool isRunning();
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
 | ||
| 	virtual bool isEnding();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void start();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void resume();
 | ||
| 	// <20><>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>
 | ||
| 	virtual void pause();
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
 | ||
| 	virtual void stop();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>״̬
 | ||
| 	virtual void wait();
 | ||
| 	// <20><><EFBFBD><EFBFBD>
 | ||
| 	virtual void notify();
 | ||
| 	// <20><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD>ÿһ֡ʱ<D6A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual void setInterval(LONGLONG milliSeconds);
 | ||
| 	// <20><>ȡһ<C8A1><D2BB><EFBFBD>µĿ<C2B5><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual Action * copy() const = 0;
 | ||
| 	// <20><>ȡһ<C8A1><D2BB><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	virtual Action * reverse() const;
 | ||
| 	// <20><>ȡִ<C8A1>иö<D0B8><C3B6><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>
 | ||
| 	virtual Sprite * getTarget();
 | ||
| 
 | ||
| protected:
 | ||
| 	bool		m_bRunning;
 | ||
| 	bool		m_bWaiting;
 | ||
| 	bool		m_bEnding;
 | ||
| 	bool		m_bInit;
 | ||
| 	Sprite *	m_pTargetSprite;
 | ||
| 	Scene *		m_pParentScene;
 | ||
| 	LONGLONG	m_nAnimationInterval;
 | ||
| 	std::chrono::steady_clock::time_point m_nLast;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init();
 | ||
| 	virtual void _exec(std::chrono::steady_clock::time_point nNow) = 0;
 | ||
| 	virtual void _reset();
 | ||
| };
 | ||
| 
 | ||
| class Animation :
 | ||
| 	public Action
 | ||
| {
 | ||
| public:
 | ||
| 	Animation(float duration);
 | ||
| 	virtual ~Animation();
 | ||
| 
 | ||
| protected:
 | ||
| 	LONGLONG m_nDuration;
 | ||
| 	LONGLONG m_nTotalDuration;
 | ||
| 
 | ||
| protected:
 | ||
| 	bool _isEnd() const;
 | ||
| 	bool _isDelayEnough(std::chrono::steady_clock::time_point nNow);
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class ActionMoveBy :
 | ||
| 	public Animation
 | ||
| {
 | ||
| public:
 | ||
| 	ActionMoveBy(float duration, CVector vec);
 | ||
| 	virtual ~ActionMoveBy();
 | ||
| 
 | ||
| 	virtual ActionMoveBy * copy() const override;
 | ||
| 	virtual ActionMoveBy * reverse() const override;
 | ||
| 
 | ||
| protected:
 | ||
| 	CPoint	m_BeginPos;
 | ||
| 	CVector	m_MoveVector;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class ActionMoveTo :
 | ||
| 	public ActionMoveBy
 | ||
| {
 | ||
| public:
 | ||
| 	ActionMoveTo(float duration, CPoint pos);
 | ||
| 	virtual ~ActionMoveTo();
 | ||
| 
 | ||
| 	virtual ActionMoveTo * copy() const override;
 | ||
| 
 | ||
| protected:
 | ||
| 	CPoint m_EndPos;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class ActionScaleBy :
 | ||
| 	public Animation
 | ||
| {
 | ||
| public:
 | ||
| 	ActionScaleBy(float duration, float scaleX, float scaleY);
 | ||
| 	virtual ~ActionScaleBy();
 | ||
| 
 | ||
| 	virtual ActionScaleBy * copy() const override;
 | ||
| 	virtual ActionScaleBy * reverse() const override;
 | ||
| 
 | ||
| protected:
 | ||
| 	float	m_nBeginScaleX;
 | ||
| 	float	m_nBeginScaleY;
 | ||
| 	float	m_nVariationX;
 | ||
| 	float	m_nVariationY;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class ActionScaleTo :
 | ||
| 	public ActionScaleBy
 | ||
| {
 | ||
| public:
 | ||
| 	ActionScaleTo(float duration, float scaleX, float scaleY);
 | ||
| 	virtual ~ActionScaleTo();
 | ||
| 
 | ||
| 	virtual ActionScaleTo * copy() const override;
 | ||
| 
 | ||
| protected:
 | ||
| 	float	m_nEndScaleX;
 | ||
| 	float	m_nEndScaleY;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class ActionOpacityBy :
 | ||
| 	public Animation
 | ||
| {
 | ||
| public:
 | ||
| 	ActionOpacityBy(float duration, float opacity);
 | ||
| 	virtual ~ActionOpacityBy();
 | ||
| 
 | ||
| 	virtual ActionOpacityBy * copy() const override;
 | ||
| 	virtual ActionOpacityBy * reverse() const override;
 | ||
| 
 | ||
| protected:
 | ||
| 	float m_nBeginVal;
 | ||
| 	float m_nVariation;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class ActionOpacityTo :
 | ||
| 	public ActionOpacityBy
 | ||
| {
 | ||
| public:
 | ||
| 	ActionOpacityTo(float duration, float opacity);
 | ||
| 	virtual ~ActionOpacityTo();
 | ||
| 
 | ||
| 	virtual ActionOpacityTo * copy() const override;
 | ||
| 
 | ||
| protected:
 | ||
| 	float m_nEndVal;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class ActionFadeIn :
 | ||
| 	public ActionOpacityTo
 | ||
| {
 | ||
| public:
 | ||
| 	ActionFadeIn(float duration) : ActionOpacityTo(duration, 1) {}
 | ||
| };
 | ||
| 
 | ||
| class ActionFadeOut :
 | ||
| 	public ActionOpacityTo
 | ||
| {
 | ||
| public:
 | ||
| 	ActionFadeOut(float duration) : ActionOpacityTo(duration, 0) {}
 | ||
| };
 | ||
| 
 | ||
| class ActionTwo :
 | ||
| 	public Action
 | ||
| {
 | ||
| public:
 | ||
| 	ActionTwo(Action * actionFirst, Action * actionSecond);
 | ||
| 	virtual ~ActionTwo();
 | ||
| 
 | ||
| 	virtual ActionTwo * copy() const override;
 | ||
| 	virtual ActionTwo * reverse(bool actionReverse = true) const;
 | ||
| 
 | ||
| protected:
 | ||
| 	Action *	m_FirstAction;
 | ||
| 	Action *	m_SecondAction;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class ActionSequence :
 | ||
| 	public Action
 | ||
| {
 | ||
| public:
 | ||
| 	ActionSequence();
 | ||
| 	ActionSequence(int number, Action * action1, ...);
 | ||
| 	virtual ~ActionSequence();
 | ||
| 
 | ||
| 	void addAction(Action * action);
 | ||
| 	virtual ActionSequence * copy() const override;
 | ||
| 	virtual ActionSequence * reverse(bool actionReverse = true) const;
 | ||
| 
 | ||
| protected:
 | ||
| 	UINT					m_nActionIndex;
 | ||
| 	std::vector<Action*>	m_vActions;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class ActionDelay :
 | ||
| 	public Action
 | ||
| {
 | ||
| public:
 | ||
| 	ActionDelay(float duration);
 | ||
| 	virtual ~ActionDelay();
 | ||
| 
 | ||
| 	virtual ActionDelay * copy() const override;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class ActionNeverStop :
 | ||
| 	public Action
 | ||
| {
 | ||
| public:
 | ||
| 	ActionNeverStop(Action * action);
 | ||
| 	virtual ~ActionNeverStop();
 | ||
| 
 | ||
| 	virtual ActionNeverStop * copy() const override;
 | ||
| 
 | ||
| protected:
 | ||
| 	Action * m_Action;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class ActionFrames :
 | ||
| 	public Action
 | ||
| {
 | ||
| public:
 | ||
| 	ActionFrames();
 | ||
| 	ActionFrames(LONGLONG frameDelay);
 | ||
| 	~ActionFrames();
 | ||
| 
 | ||
| 	void addFrame(Image * frame);
 | ||
| 	virtual ActionFrames * copy() const override;
 | ||
| 	virtual ActionFrames * reverse() const override;
 | ||
| 
 | ||
| protected:
 | ||
| 	UINT				m_nFrameIndex;
 | ||
| 	std::vector<Image*> m_vFrames;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class ActionCallback :
 | ||
| 	public Action
 | ||
| {
 | ||
| public:
 | ||
| 	ActionCallback(const std::function<void()>& callback);
 | ||
| 	~ActionCallback();
 | ||
| 
 | ||
| 	virtual ActionCallback * copy() const override;
 | ||
| 
 | ||
| protected:
 | ||
| 	std::function<void()> m_Callback;
 | ||
| 
 | ||
| protected:
 | ||
| 	virtual void _init() override;
 | ||
| 	virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
 | ||
| 	virtual void _reset() override;
 | ||
| };
 | ||
| 
 | ||
| class FileUtils
 | ||
| {
 | ||
| public:
 | ||
| 	// <20><>ȡϵͳ<CFB5><CDB3> AppData\Local ·<><C2B7>
 | ||
| 	static TString getLocalAppDataPath();
 | ||
| 	// <20><>ȡĬ<C8A1>ϵı<CFB5><C4B1><EFBFBD>·<EFBFBD><C2B7>
 | ||
| 	static TString getDefaultSavePath();
 | ||
| 	// <20><><EFBFBD><EFBFBD> int <20>͵<EFBFBD>ֵ
 | ||
| 	static void saveInt(LPCTSTR key, int value);
 | ||
| 	// <20><><EFBFBD><EFBFBD> double <20>͵<EFBFBD>ֵ
 | ||
| 	static void saveDouble(LPCTSTR key, double value);
 | ||
| 	// <20><><EFBFBD><EFBFBD> <20>ַ<EFBFBD><D6B7><EFBFBD> <20>͵<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA> Unicode <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
 | ||
| 	static void saveString(LPCTSTR key, TString value);
 | ||
| 	// <20><>ȡ int <20>͵<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> default <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
 | ||
| 	static int getInt(LPCTSTR key, int default);
 | ||
| 	// <20><>ȡ double <20>͵<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> default <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
 | ||
| 	static double getDouble(LPCTSTR key, double default);
 | ||
| 	// <20><>ȡ <20>ַ<EFBFBD><D6B7><EFBFBD> <20>͵<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> default <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
 | ||
| 	static TString geTString(LPCTSTR key, TString default);
 | ||
| 	// <20>õ<EFBFBD><C3B5>ļ<EFBFBD><C4BC><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>Сд<D0A1><D0B4>
 | ||
| 	static TString getFileExtension(const TString& filePath);
 | ||
| 	/**
 | ||
| 	*  <20><EFBFBD><F2BFAAB1><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>Ի<EFBFBD><D4BB>õ<F2A3ACB5><C3B5><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true
 | ||
| 	*  <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><DAB1>⣬<EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD>չ<EFBFBD><D5B9>
 | ||
| 	*/
 | ||
| 	static bool getSaveFilePath(TString& path, LPCTSTR title = _T("<EFBFBD><EFBFBD><EFBFBD>浽"), LPCTSTR defExt = NULL);
 | ||
| };
 | ||
| 
 | ||
| class MusicUtils
 | ||
| {
 | ||
| public:
 | ||
| 	// <20><><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void playBackgroundMusic(TString pszFilePath, bool bLoop = true);
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void stopBackgroundMusic(bool bReleaseData = false);
 | ||
| 	// <20><>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void pauseBackgroundMusic();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void resumeBackgroundMusic();
 | ||
| 	// <20><>ͷ<EFBFBD><CDB7><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void rewindBackgroundMusic();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>
 | ||
| 	static bool isBackgroundMusicPlaying();
 | ||
| 	// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0 ~ 1.0f
 | ||
| 	static void setBackgroundMusicVolume(float volume);
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
 | ||
| 	static unsigned int playMusic(TString pszFilePath, bool loop = false);
 | ||
| 	// ֹͣ<CDA3><D6B9>Ч
 | ||
| 	static void stopMusic(unsigned int nSoundId);
 | ||
| 	// Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
 | ||
| 	static void preloadMusic(TString pszFilePath);
 | ||
| 	// <20><>ͣ<EFBFBD><CDA3>Ч
 | ||
| 	static void pauseMusic(unsigned int nSoundId);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
 | ||
| 	static void resumeMusic(unsigned int nSoundId);
 | ||
| 	// ж<><D0B6><EFBFBD><EFBFBD>Ч
 | ||
| 	static void unloadMusic(LPCTSTR pszFilePath);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0 ~ 1.0f
 | ||
| 	static void setVolume(TString pszFilePath, float volume);
 | ||
| 
 | ||
| 	// <20><>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void pauseAllMusics();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void resumeAllMusics();
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void stopAllMusics();
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
 | ||
| 	static void end();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0 ~ 1.0f
 | ||
| 	static void setVolume(float volume);
 | ||
| };
 | ||
| 
 | ||
| class Timer
 | ||
| {
 | ||
| 	friend App;
 | ||
| public:
 | ||
| 	Timer(TString name, LONGLONG milliSeconds, const TIMER_CALLBACK & callback);
 | ||
| 	~Timer();
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	void start();
 | ||
| 	// ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1>
 | ||
| 	void stop();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>״̬
 | ||
| 	void wait();
 | ||
| 	// <20><><EFBFBD><EFBFBD>
 | ||
| 	void notify();
 | ||
| 	// <20><>ʱ<EFBFBD><CAB1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	bool isRunning();
 | ||
| 	// <20><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	void setInterval(LONGLONG milliSeconds);
 | ||
| 	// <20><><EFBFBD>ûص<C3BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void setCallback(const TIMER_CALLBACK& callback);
 | ||
| 	// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	void setName(TString name);
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	LONGLONG getInterval() const;
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	TString getName() const;
 | ||
| 
 | ||
| 	// <20><><EFBFBD>Ӷ<EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	static void addTimer(Timer * timer);
 | ||
| 	// <20><><EFBFBD>Ӷ<EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	static void addTimer(TString name, const TIMER_CALLBACK & callback);
 | ||
| 	// <20><><EFBFBD>Ӷ<EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	static void addTimer(TString name, LONGLONG milliSeconds, const TIMER_CALLBACK & callback);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	static void startTimer(TString name);
 | ||
| 	// ֹͣ<CDA3>ض<EFBFBD><D8B6><EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	static void stopTimer(TString name);
 | ||
| 	// ɾ<><C9BE><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	static void delTimer(TString name);
 | ||
| 	// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	static void clearAllTimers();
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	static void notifyAllSceneTimers(Scene* scene);
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	static void waitAllSceneTimers(Scene* scene);
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
 | ||
| 	static void clearAllSceneTimers(Scene* scene);
 | ||
| 
 | ||
| protected:
 | ||
| 	bool			m_bRunning;
 | ||
| 	bool			m_bWaiting;
 | ||
| 	TString			m_sName;
 | ||
| 	TIMER_CALLBACK	m_callback;
 | ||
| 	LONGLONG		m_nAnimationInterval;
 | ||
| 	Scene *			m_pParentScene;
 | ||
| 	std::chrono::steady_clock::time_point m_nLast;
 | ||
| 
 | ||
| private:
 | ||
| 	static void __exec();
 | ||
| };
 | ||
| 
 | ||
| class ActionManager
 | ||
| {
 | ||
| 	friend App;
 | ||
| 	friend Sprite;
 | ||
| public:
 | ||
| 	// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ض<EFBFBD><D8B6>Ķ<EFBFBD><C4B6><EFBFBD>
 | ||
| 	static void startAction(Action * action);
 | ||
| 	// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ض<EFBFBD><D8B6>Ķ<EFBFBD><C4B6><EFBFBD>
 | ||
| 	static void resumeAction(Action * action);
 | ||
| 	// <20><>ͣһ<CDA3><D2BB><EFBFBD>ض<EFBFBD><D8B6>Ķ<EFBFBD><C4B6><EFBFBD>
 | ||
| 	static void pauseAction(Action * action);
 | ||
| 	// ֹͣһ<D6B9><D2BB><EFBFBD>ض<EFBFBD><D8B6>Ķ<EFBFBD><C4B6><EFBFBD>
 | ||
| 	static void stopAction(Action * action);
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> Sprite <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	static void startSpriteAllActions(Sprite * sprite);
 | ||
| 	// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> Sprite <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	static void resumeSpriteAllActions(Sprite * sprite);
 | ||
| 	// <20><>ͣһ<CDA3><D2BB> Sprite <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	static void pauseSpriteAllActions(Sprite * sprite);
 | ||
| 	// ֹͣһ<D6B9><D2BB> Sprite <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	static void stopSpriteAllActions(Sprite * sprite);
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	static void startAllActions();
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	static void resumeAllActions();
 | ||
| 	// <20><>ͣ<EFBFBD><CDA3>ǰ<EFBFBD><C7B0><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	static void pauseAllActions();
 | ||
| 	// ֹͣ<CDA3><D6B9>ǰ<EFBFBD><C7B0><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	static void stopAllActions();
 | ||
| 	// ɾ<><C9BE><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
 | ||
| 	static void clearAllActions();
 | ||
| 
 | ||
| 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>ϵĶ<CFB5><C4B6><EFBFBD>
 | ||
| 	static void notifyAllSceneActions(Scene* scene);
 | ||
| 	// <20><>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>ϵĶ<CFB5><C4B6><EFBFBD>
 | ||
| 	static void waitAllSceneActions(Scene* scene);
 | ||
| 	// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD>ϵĶ<CFB5><C4B6><EFBFBD>
 | ||
| 	static void stopAllSceneActions(Scene* scene);
 | ||
| 
 | ||
| private:
 | ||
| 	static void __exec();
 | ||
| 	// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static void addAction(Action * action);
 | ||
| };
 | ||
| 
 | ||
| class Math
 | ||
| {
 | ||
| public:
 | ||
| 	// ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>Χ<EFBFBD>ڵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	template<typename T>
 | ||
| 	static T randomInt(T min, T max)
 | ||
| 	{
 | ||
| 		std::uniform_int_distribution<T> dist(min, max);
 | ||
| 		return dist(getEngine());
 | ||
| 	}
 | ||
| 	// ȡ<>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>Χ<EFBFBD>ڵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	template<typename T>
 | ||
| 	static T randomReal(T min, T max)
 | ||
| 	{
 | ||
| 		std::uniform_real_distribution<T> dist(min, max);
 | ||
| 		return dist(getEngine());
 | ||
| 	}
 | ||
| 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 	static std::default_random_engine &getEngine();
 | ||
| };
 | ||
| 
 | ||
| }	// End of easy2d namespace
 | ||
| 
 | ||
| 
 | ||
| // Functions Declare
 | ||
| 
 | ||
| inline void SafeRelease(easy2d::Object * p) { if (p) p->release(); }
 | ||
| inline void SafeDelete(void * p) { if (p) delete p; }
 | ||
| 
 | ||
| template<typename T>
 | ||
| inline T random(T min, T max) { return easy2d::Math::randomInt(min, max); }
 | ||
| inline float random(float min, float max) { return easy2d::Math::randomReal(min, max); }
 | ||
| inline double random(double min, double max) { return easy2d::Math::randomReal(min, max); }
 | ||
| inline long double random(long double min, long double max) { return easy2d::Math::randomReal(min, max); }
 | ||
| 
 | ||
| using namespace easy2d; |