1662 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C
		
	
	
	
		
		
			
		
	
	
			1662 lines
		
	
	
		
			40 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(); | |||
|  | 
 | |||
|  | 	// 窗口可选模式
 | |||
|  | 	enum MODE { SHOW_CONSOLE = 1, NO_CLOSE = 2, NO_MINI_MIZE = 4 }; | |||
|  | 
 | |||
|  | 	// 定义绘图窗口
 | |||
|  | 	void createWindow(int width, int height, int mode = 0); | |||
|  | 	// 定义绘图窗口
 | |||
|  | 	void createWindow(CSize size, int mode = 0); | |||
|  | 	// 定义绘图窗口
 | |||
|  | 	void createWindow(TString title, int width, int height, int mode = 0); | |||
|  | 	// 定义绘图窗口
 | |||
|  | 	void createWindow(TString title, CSize size, int mode = 0); | |||
|  | 	// 启动程序
 | |||
|  | 	int run(); | |||
|  | 	// 释放所有内存资源
 | |||
|  | 	void free(); | |||
|  | 
 | |||
|  | 	// 获取程序实例
 | |||
|  | 	static App * get(); | |||
|  | 	// 终止程序
 | |||
|  | 	static void quit(); | |||
|  | 	// 终止程序
 | |||
|  | 	static void end(); | |||
|  | 	// 修改窗口大小
 | |||
|  | 	static void setWindowSize(int width, int height); | |||
|  | 	// 修改窗口大小
 | |||
|  | 	static void setWindowSize(CSize size); | |||
|  | 	// 关闭窗口
 | |||
|  | 	static void close(); | |||
|  | 	// 设置窗口标题
 | |||
|  | 	static void setWindowTitle(TString title); | |||
|  | 	// 获取窗口标题
 | |||
|  | 	static TString getWindowTitle(); | |||
|  | 	// 获取窗口宽度
 | |||
|  | 	static int getWidth(); | |||
|  | 	// 获取窗口高度
 | |||
|  | 	static int getHeight(); | |||
|  | 	// 切换场景
 | |||
|  | 	static void enterScene(Scene *scene, bool save = true); | |||
|  | 	// 返回上一场景
 | |||
|  | 	static void backScene(); | |||
|  | 	// 清空之前保存的所有场景
 | |||
|  | 	static void clearScene(); | |||
|  | 	// 设置 AppName
 | |||
|  | 	static void setAppName(TString appname); | |||
|  | 	// 获取 AppName
 | |||
|  | 	static TString getAppName(); | |||
|  | 	// 修改窗口背景色
 | |||
|  | 	static void setBkColor(COLORREF color); | |||
|  | 	// 重置绘图样式为默认值
 | |||
|  | 	static void reset(); | |||
|  | 	// 获取当前场景
 | |||
|  | 	static Scene * getCurrentScene(); | |||
|  | 	// 获取正处于加载中的场景
 | |||
|  | 	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: | |||
|  | 	// 刷新内存池
 | |||
|  | 	static void __flush(); | |||
|  | 	// 将一个节点放入释放池
 | |||
|  | 	static void __add(Object * nptr); | |||
|  | 	// 删除所有节点
 | |||
|  | 	static void __clearAllObjects(); | |||
|  | }; | |||
|  | 
 | |||
|  | class Scene | |||
|  | { | |||
|  | 	friend App; | |||
|  | 	friend MouseMsg; | |||
|  | public: | |||
|  | 	Scene(); | |||
|  | 	~Scene(); | |||
|  | 
 | |||
|  | 	// 重写这个函数,初始化这个场景
 | |||
|  | 	virtual void init(); | |||
|  | 	// 重写这个函数,它将在进入这个场景时自动执行
 | |||
|  | 	virtual void onEnter(); | |||
|  | 	// 重写这个函数,它将在离开这个场景时自动执行
 | |||
|  | 	virtual void onExit(); | |||
|  | 	// 添加子成员到场景
 | |||
|  | 	void add(Node * child, int zOrder = 0); | |||
|  | 	// 删除子成员
 | |||
|  | 	bool del(Node * child); | |||
|  | 	// 清空所有子成员
 | |||
|  | 	void clearAllChildren(); | |||
|  | 
 | |||
|  | protected: | |||
|  | 	std::vector<Node*> m_vChildren; | |||
|  | 
 | |||
|  | protected: | |||
|  | 	void _exec(); | |||
|  | 	void _onDraw(); | |||
|  | }; | |||
|  | 
 | |||
|  | class Object | |||
|  | { | |||
|  | 	friend FreePool; | |||
|  | public: | |||
|  | 	Object(); | |||
|  | 	virtual ~Object(); | |||
|  | 
 | |||
|  | 	// 保留这个对象
 | |||
|  | 	void retain(); | |||
|  | 	// 释放这个对象
 | |||
|  | 	void release(); | |||
|  | 	// 让引擎自动释放这个对象
 | |||
|  | 	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,	// 鼠标移动
 | |||
|  | 		LBUTTON_DOWN,	// 鼠标左键按下
 | |||
|  | 		LBUTTON_UP,		// 鼠标左键抬起
 | |||
|  | 		LBUTTON_DBLCLK,	// 鼠标左键双击
 | |||
|  | 		RBUTTON_DOWN,	// 鼠标右键按下
 | |||
|  | 		RBUTTON_UP,		// 鼠标右键抬起
 | |||
|  | 		RBUTTON_DBLCLK,	// 鼠标右键双击
 | |||
|  | 		MBUTTON_DOWN,	// 鼠标中键按下
 | |||
|  | 		MBUTTON_UP,		// 鼠标中键抬起
 | |||
|  | 		MBUTTON_DBLCLK,	// 鼠标中键双击
 | |||
|  | 		WHEEL			// 滑动滚轮
 | |||
|  | 	}; | |||
|  | 
 | |||
|  | 	// 启动监听
 | |||
|  | 	void start(); | |||
|  | 	// 停止监听
 | |||
|  | 	void stop(); | |||
|  | 	// 进入等待状态
 | |||
|  | 	void wait(); | |||
|  | 	// 唤醒
 | |||
|  | 	void notify(); | |||
|  | 
 | |||
|  | 	// 左键是否按下
 | |||
|  | 	static bool isLButtonDown(); | |||
|  | 	// 右键是否按下
 | |||
|  | 	static bool isRButtonDown(); | |||
|  | 	// 中键是否按下
 | |||
|  | 	static bool isMButtonDown(); | |||
|  | 	// 获取鼠标X坐标
 | |||
|  | 	static int getX(); | |||
|  | 	// 获取鼠标Y坐标
 | |||
|  | 	static int getY(); | |||
|  | 	// 获取鼠标坐标
 | |||
|  | 	static CPoint getPos(); | |||
|  | 	// 获取鼠标滚轮值
 | |||
|  | 	static int getWheel(); | |||
|  | 	// 获取当前鼠标消息
 | |||
|  | 	static MESSAGE getMsg(); | |||
|  | 
 | |||
|  | 	// 添加鼠标消息监听
 | |||
|  | 	static void addListener(TString name, const MOUSE_CALLBACK& callback); | |||
|  | 	// 启动鼠标消息监听
 | |||
|  | 	static void startListener(TString name); | |||
|  | 	// 停止鼠标消息监听
 | |||
|  | 	static void stopListener(TString name); | |||
|  | 	// 删除鼠标消息监听
 | |||
|  | 	static void delListener(TString name); | |||
|  | 	// 删除所有鼠标消息监听
 | |||
|  | 	static void clearAllListeners(); | |||
|  | 	// 启动绑定在场景上的所有监听器
 | |||
|  | 	static void notifyAllSceneListeners(Scene* scene); | |||
|  | 	// 停止绑定在场景上的所有监听器
 | |||
|  | 	static void waitAllSceneListeners(Scene* scene); | |||
|  | 	// 清除绑定在场景上的所有监听器
 | |||
|  | 	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: | |||
|  | 	// 执行回调函数
 | |||
|  | 	void onMouseMsg(); | |||
|  | }; | |||
|  | 
 | |||
|  | class KeyMsg | |||
|  | { | |||
|  | 	friend App; | |||
|  | public: | |||
|  | 	KeyMsg(TString name, const KEY_CALLBACK& callback); | |||
|  | 	~KeyMsg(); | |||
|  | 
 | |||
|  | 	// 执行回调函数
 | |||
|  | 	void onKbHit(VK_KEY key); | |||
|  | 	// 启动监听
 | |||
|  | 	void start(); | |||
|  | 	// 停止监听
 | |||
|  | 	void stop(); | |||
|  | 	// 进入等待状态
 | |||
|  | 	void wait(); | |||
|  | 	// 唤醒
 | |||
|  | 	void notify(); | |||
|  | 
 | |||
|  | 	// 判断键是否被按下,按下返回true
 | |||
|  | 	static bool isKeyDown(VK_KEY key); | |||
|  | 	// 添加按键监听
 | |||
|  | 	static void addListener(TString name, const KEY_CALLBACK& callback); | |||
|  | 	// 启动按键监听
 | |||
|  | 	static void startListener(TString name); | |||
|  | 	// 停止按键监听
 | |||
|  | 	static void stopListener(TString name); | |||
|  | 	// 删除按键监听
 | |||
|  | 	static void KeyMsg::delListener(TString name); | |||
|  | 	// 启动绑定在场景上的所有监听器
 | |||
|  | 	static void notifyAllSceneListeners(Scene* scene); | |||
|  | 	// 停止绑定在场景上的所有监听器
 | |||
|  | 	static void waitAllSceneListeners(Scene* scene); | |||
|  | 	// 停止绑定在场景上的所有定时器
 | |||
|  | 	static void clearAllSceneListeners(Scene* scene); | |||
|  | 	// 删除所有按键监听
 | |||
|  | 	static void clearAllListeners(); | |||
|  | 
 | |||
|  | public: | |||
|  | 	// 字母键值
 | |||
|  | 	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; | |||
|  | 	// 数字键值
 | |||
|  | 	static const VK_KEY NUM_1, NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7, NUM_8, NUM_9, NUM_0; | |||
|  | 	// 小数字键盘值
 | |||
|  | 	static const VK_KEY NUMPAD_1, NUMPAD_2, NUMPAD_3, NUMPAD_4, NUMPAD_5, NUMPAD_6, NUMPAD_7, NUMPAD_8, NUMPAD_9, NUMPAD_0; | |||
|  | 	// 控制键值
 | |||
|  | 	static const VK_KEY Enter, Space, Up, Down, Left, Right, Esc, Shift, LShift, RShift, Ctrl, LCtrl, RCtrl; | |||
|  | 	// F 键值
 | |||
|  | 	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(); | |||
|  | 	/**
 | |||
|  | 	*  使用 [字体名称、字号、粗细、字宽、斜体、下划线、删除线、字符串书写角度、 | |||
|  | 	*  每个字符书写角度、抗锯齿] 属性创建字体样式 | |||
|  | 	*/ | |||
|  | 	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(); | |||
|  | 
 | |||
|  | 	// 获取默认字体
 | |||
|  | 	static FontStyle * getDefault(); | |||
|  | 	// 设置字符平均高度
 | |||
|  | 	void setHeight(LONG value); | |||
|  | 	// 设置字符平均宽度(0表示自适应)
 | |||
|  | 	void setWidth(LONG value); | |||
|  | 	// 设置字体
 | |||
|  | 	void setFontFamily(LPCTSTR value); | |||
|  | 	// 设置字符笔画粗细,范围0~1000,默认为0
 | |||
|  | 	void setWeight(LONG value); | |||
|  | 	// 设置斜体
 | |||
|  | 	void setItalic(bool value); | |||
|  | 	// 设置下划线
 | |||
|  | 	void setUnderline(bool value); | |||
|  | 	// 设置删除线
 | |||
|  | 	void setStrikeOut(bool value); | |||
|  | 	// 设置字符串的书写角度,单位0.1度,默认为0
 | |||
|  | 	void setEscapement(LONG value); | |||
|  | 	// 设置每个字符的书写角度,单位0.1度,默认为0
 | |||
|  | 	void setOrientation(LONG value); | |||
|  | 	// 设置字体抗锯齿,默认为true
 | |||
|  | 	void setQuality(bool value); | |||
|  | 
 | |||
|  | protected: | |||
|  | 	LOGFONT m_font; | |||
|  | }; | |||
|  | 
 | |||
|  | class FontWeight | |||
|  | { | |||
|  | public: | |||
|  | 	static const LONG dontcare;		// 粗细值 0
 | |||
|  | 	static const LONG thin;			// 粗细值 100
 | |||
|  | 	static const LONG extraLight;	// 粗细值 200
 | |||
|  | 	static const LONG light;		// 粗细值 300
 | |||
|  | 	static const LONG normal;		// 粗细值 400
 | |||
|  | 	static const LONG regular;		// 粗细值 400
 | |||
|  | 	static const LONG medium;		// 粗细值 500
 | |||
|  | 	static const LONG demiBlod;		// 粗细值 600
 | |||
|  | 	static const LONG blod;			// 粗细值 700
 | |||
|  | 	static const LONG extraBold;	// 粗细值 800
 | |||
|  | 	static const LONG black;		// 粗细值 900
 | |||
|  | 	static const LONG heavy;		// 粗细值 900
 | |||
|  | }; | |||
|  | 
 | |||
|  | class Color | |||
|  | { | |||
|  | public: | |||
|  | 	static const COLORREF black;		// 黑色
 | |||
|  | 	static const COLORREF blue;			// 蓝色
 | |||
|  | 	static const COLORREF green;		// 绿色
 | |||
|  | 	static const COLORREF cyan;			// 青色
 | |||
|  | 	static const COLORREF red;			// 红色
 | |||
|  | 	static const COLORREF magenta;		// 紫色
 | |||
|  | 	static const COLORREF brown;		// 棕色
 | |||
|  | 	static const COLORREF lightgray;	// 亮灰色
 | |||
|  | 	static const COLORREF darkgray;		// 深灰色
 | |||
|  | 	static const COLORREF lightblue;	// 亮蓝色
 | |||
|  | 	static const COLORREF lightgreen;	// 亮绿色
 | |||
|  | 	static const COLORREF lightcyan;	// 亮青色
 | |||
|  | 	static const COLORREF lightred;		// 亮红色
 | |||
|  | 	static const COLORREF lightmagenta;	// 亮紫色
 | |||
|  | 	static const COLORREF yellow;		// 亮黄色
 | |||
|  | 	static const COLORREF white;		// 白色
 | |||
|  | 
 | |||
|  | 	// 通过红、绿、蓝颜色分量合成颜色
 | |||
|  | 	static COLORREF getFromRGB(BYTE r, BYTE g, BYTE b); | |||
|  | 	// 通过色相、饱和度、亮度合成颜色
 | |||
|  | 	static COLORREF getFromHSL(float H, float S, float L); | |||
|  | 	// 通过色相、饱和度、明度合成颜色
 | |||
|  | 	static COLORREF getFromHSV(float H, float S, float V); | |||
|  | 
 | |||
|  | 	// 返回指定颜色中的红色值
 | |||
|  | 	static BYTE getRValue(COLORREF color); | |||
|  | 	// 返回指定颜色中的绿色值
 | |||
|  | 	static BYTE getGValue(COLORREF color); | |||
|  | 	// 返回指定颜色中的蓝色值
 | |||
|  | 	static BYTE getBValue(COLORREF color); | |||
|  | 	// 返回与指定颜色对应的灰度值颜色
 | |||
|  | 	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(); | |||
|  | 
 | |||
|  | 	// 获取节点横坐标
 | |||
|  | 	virtual int getX() const; | |||
|  | 	// 获取节点纵坐标
 | |||
|  | 	virtual int getY() const; | |||
|  | 	// 获取节点坐标
 | |||
|  | 	virtual CPoint getPos() const; | |||
|  | 	// 设置节点横坐标
 | |||
|  | 	virtual void setX(int x); | |||
|  | 	// 设置节点纵坐标
 | |||
|  | 	virtual void setY(int y); | |||
|  | 	// 设置节点横纵坐标
 | |||
|  | 	virtual void setPos(int x, int y); | |||
|  | 	// 设置节点横纵坐标
 | |||
|  | 	virtual void setPos(CPoint p); | |||
|  | 	// 移动节点
 | |||
|  | 	virtual void move(int x, int y); | |||
|  | 	// 设置节点横纵坐标
 | |||
|  | 	virtual void move(CVector v); | |||
|  | 	// 节点是否显示
 | |||
|  | 	virtual bool display() const; | |||
|  | 	// 设置节点是否显示
 | |||
|  | 	virtual void setDisplay(bool value); | |||
|  | 	// 获取节点绘图顺序
 | |||
|  | 	virtual int getZOrder() const; | |||
|  | 	// 设置节点绘图顺序(0为最先绘制,显示在最底层)
 | |||
|  | 	virtual void setZOrder(int z); | |||
|  | 	// 获取父节点
 | |||
|  | 	virtual Node* getParent(); | |||
|  | 	// 设置父节点
 | |||
|  | 	virtual void setParent(Node* parent); | |||
|  | 	// 获取节点所在场景
 | |||
|  | 	Scene * getParentScene(); | |||
|  | 
 | |||
|  | protected: | |||
|  | 	int		m_nZOrder; | |||
|  | 	bool	m_bDisplay; | |||
|  | 	Scene*	m_pScene; | |||
|  | 	CPoint	m_Pos; | |||
|  | 	Node*	m_pParent; | |||
|  | 
 | |||
|  | protected: | |||
|  | 	virtual bool _exec(bool active); | |||
|  | 	virtual void _onDraw() = 0; | |||
|  | 	void setParentScene(Scene * scene); | |||
|  | }; | |||
|  | 
 | |||
|  | class BatchNode : | |||
|  | 	public Node | |||
|  | { | |||
|  | public: | |||
|  | 	BatchNode(); | |||
|  | 	virtual ~BatchNode(); | |||
|  | 
 | |||
|  | 	// 添加子节点
 | |||
|  | 	void add(Node *child, int z_Order = 0); | |||
|  | 	// 删除子节点
 | |||
|  | 	bool del(Node * child); | |||
|  | 	// 获取子节点数量
 | |||
|  | 	int getCount(); | |||
|  | 	// 获取所有子节点
 | |||
|  | 	std::vector<Node*> &getChildren(); | |||
|  | 	// 清空所有子节点
 | |||
|  | 	void clearAllChildren(); | |||
|  | 
 | |||
|  | 	// 设置节点横坐标
 | |||
|  | 	virtual void setX(int x) override; | |||
|  | 	// 设置节点纵坐标
 | |||
|  | 	virtual void setY(int y) override; | |||
|  | 	// 设置节点坐标
 | |||
|  | 	virtual void setPos(int x, int y) override; | |||
|  | 	// 设置节点坐标
 | |||
|  | 	virtual void setPos(CPoint p) override; | |||
|  | 	// 移动节点
 | |||
|  | 	virtual void move(int x, int y) override; | |||
|  | 	// 移动节点
 | |||
|  | 	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(); | |||
|  | 
 | |||
|  | 	// 图层是否阻塞消息
 | |||
|  | 	int getBlock() const; | |||
|  | 	// 设置图层是否阻塞消息
 | |||
|  | 	void setBlock(bool block); | |||
|  | 
 | |||
|  | protected: | |||
|  | 	bool m_bBlock; | |||
|  | 
 | |||
|  | protected: | |||
|  | 	virtual bool _exec(bool active) override; | |||
|  | }; | |||
|  | 
 | |||
|  | class RectNode : | |||
|  | 	public Node | |||
|  | { | |||
|  | public: | |||
|  | 	RectNode(); | |||
|  | 	~RectNode(); | |||
|  | 
 | |||
|  | 	// 判断两节点是否碰撞
 | |||
|  | 	virtual bool isCollisionWith(RectNode * rectNode) const; | |||
|  | 	// 判断点是否在节点内
 | |||
|  | 	virtual bool isPointIn(CPoint p) const; | |||
|  | 
 | |||
|  | 	// 设置节点在窗口居中
 | |||
|  | 	virtual void setWindowCenter(); | |||
|  | 	// 设置节点在窗口横向居中
 | |||
|  | 	virtual void setWindowCenterX(); | |||
|  | 	// 设置节点在窗口纵向居中
 | |||
|  | 	virtual void setWindowCenterY(); | |||
|  | 
 | |||
|  | 	// 获取节点横坐标
 | |||
|  | 	virtual int getX() const override; | |||
|  | 	// 获取节点纵坐标
 | |||
|  | 	virtual int getY() const override; | |||
|  | 	// 获取节点坐标
 | |||
|  | 	virtual CPoint getPos() const override; | |||
|  | 	// 获取节点宽度
 | |||
|  | 	virtual int getWidth() const; | |||
|  | 	// 获取节点高度
 | |||
|  | 	virtual int getHeight() const; | |||
|  | 	// 获取节点大小
 | |||
|  | 	virtual CSize getSize() const; | |||
|  | 	// 获取节点所在的矩形
 | |||
|  | 	virtual CRect getRect() const; | |||
|  | 
 | |||
|  | 	// 设置节点横坐标
 | |||
|  | 	virtual void setX(int x) override; | |||
|  | 	// 设置节点纵坐标
 | |||
|  | 	virtual void setY(int y) override; | |||
|  | 	// 设置节点坐标
 | |||
|  | 	virtual void setPos(int x, int y) override; | |||
|  | 	// 设置节点坐标
 | |||
|  | 	virtual void setPos(CPoint p) override; | |||
|  | 	// 移动节点
 | |||
|  | 	virtual void move(int x, int y) override; | |||
|  | 	// 移动节点
 | |||
|  | 	virtual void move(CVector v) override; | |||
|  | 	// 设置节点宽度
 | |||
|  | 	virtual void setWidth(int width); | |||
|  | 	// 设置节点高度
 | |||
|  | 	virtual void setHeight(int height); | |||
|  | 	// 设置节点大小
 | |||
|  | 	virtual void setSize(int width, int height); | |||
|  | 	// 设置节点大小
 | |||
|  | 	virtual void setSize(CSize size); | |||
|  | 	// 设置节点所在的矩形
 | |||
|  | 	virtual void setRect(int x1, int y1, int x2, int y2); | |||
|  | 	// 设置节点所在的矩形
 | |||
|  | 	virtual void setRect(CPoint leftTop, CPoint rightBottom); | |||
|  | 	// 设置节点所在的矩形
 | |||
|  | 	virtual void setRect(CRect rect); | |||
|  | 
 | |||
|  | protected: | |||
|  | 	CRect m_Rect; | |||
|  | }; | |||
|  | 
 | |||
|  | class Text : | |||
|  | 	public RectNode | |||
|  | { | |||
|  | 	friend TextButton; | |||
|  | public: | |||
|  | 	Text(); | |||
|  | 	// 根据字符串、颜色和字体创建文字
 | |||
|  | 	Text(TString text, COLORREF color = Color::white, FontStyle * font = FontStyle::getDefault()); | |||
|  | 	// 根据横纵坐标、字符串、颜色和字体创建文字
 | |||
|  | 	Text(int x, int y, TString text, COLORREF color = Color::white, FontStyle * font = FontStyle::getDefault()); | |||
|  | 	virtual ~Text(); | |||
|  | 
 | |||
|  | 	// 获取当前颜色
 | |||
|  | 	COLORREF getColor() const; | |||
|  | 	// 获取当前文字
 | |||
|  | 	TString getText() const; | |||
|  | 	// 获取当前字体
 | |||
|  | 	FontStyle * getFontStyle(); | |||
|  | 	// 文本是否为空
 | |||
|  | 	bool isEmpty() const; | |||
|  | 
 | |||
|  | 	// 设置文字
 | |||
|  | 	void setText(TString text); | |||
|  | 	// 设置文字颜色
 | |||
|  | 	void setColor(COLORREF color); | |||
|  | 	// 设置字体
 | |||
|  | 	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(); | |||
|  | 	// 从图片文件获取图像
 | |||
|  | 	Image(LPCTSTR ImageFile); | |||
|  | 	/**
 | |||
|  | 	*  从图片文件获取图像 | |||
|  | 	*  参数:图片文件名,图片裁剪坐标,图片裁剪宽度和高度 | |||
|  | 	*/ | |||
|  | 	Image(LPCTSTR ImageFile, int x, int y, int width, int height); | |||
|  | 	virtual ~Image(); | |||
|  | 
 | |||
|  | 	// 获取横向拉伸比例
 | |||
|  | 	float getScaleX() const; | |||
|  | 	// 获取纵向拉伸比例
 | |||
|  | 	float getScaleY() const; | |||
|  | 	// 获取透明度
 | |||
|  | 	float getOpacity() const; | |||
|  | 
 | |||
|  | 	/**
 | |||
|  | 	*  从图片文件获取图像 | |||
|  | 	*  返回值:图片加载是否成功 | |||
|  | 	*/ | |||
|  | 	bool setImage(LPCTSTR ImageFile); | |||
|  | 	/**
 | |||
|  | 	*  从图片文件获取图像 | |||
|  | 	*  参数:图片文件名,图片裁剪起始坐标,图片裁剪宽度和高度 | |||
|  | 	*  返回值:图片加载是否成功 | |||
|  | 	*/ | |||
|  | 	bool setImage(LPCTSTR ImageFile, int x, int y, int width, int height); | |||
|  | 	/**
 | |||
|  | 	*  从资源文件获取图像,不支持 png | |||
|  | 	*  返回值:图片加载是否成功 | |||
|  | 	*/ | |||
|  | 	bool setImageFromRes(LPCTSTR pResName); | |||
|  | 	/**
 | |||
|  | 	*  从资源文件获取图像,不支持 png | |||
|  | 	*  参数:资源名称,图片裁剪坐标,图片裁剪宽度和高度 | |||
|  | 	*  返回值:图片加载是否成功 | |||
|  | 	*/ | |||
|  | 	bool setImageFromRes(LPCTSTR pResName, int x, int y, int width, int height); | |||
|  | 	// 裁剪图片(裁剪后会恢复 stretch 拉伸)
 | |||
|  | 	void crop(int x, int y, int width, int height); | |||
|  | 	// 将图片拉伸到固定宽高
 | |||
|  | 	void stretch(int width, int height); | |||
|  | 	// 按比例拉伸图片
 | |||
|  | 	void setScale(float scaleX, float scaleY); | |||
|  | 	// 设置透明度,范围 0~1.0f(只对 png 图片生效)
 | |||
|  | 	void setOpacity(float value); | |||
|  | 	// 设置透明色
 | |||
|  | 	void setTransparentColor(COLORREF value); | |||
|  | 	// 重置图片属性
 | |||
|  | 	void reset(); | |||
|  | 
 | |||
|  | 	// 预加载图片
 | |||
|  | 	static bool preload(LPCTSTR fileName, bool fromRes = false); | |||
|  | 	// 保存游戏截图
 | |||
|  | 	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(); | |||
|  | 
 | |||
|  | 	// 判断是否和另一个精灵碰撞
 | |||
|  | 	bool isCollisionWith(Sprite * sprite); | |||
|  | 	// 修改精灵图片
 | |||
|  | 	virtual void setImage(Image * image); | |||
|  | 	// 执行动作
 | |||
|  | 	virtual void addAction(Action * action); | |||
|  | 	// 执行动作
 | |||
|  | 	virtual void runAction(Action * action); | |||
|  | 	// 继续动作
 | |||
|  | 	virtual void resumeAction(Action * action); | |||
|  | 	// 暂停动作
 | |||
|  | 	virtual void pauseAction(Action * action); | |||
|  | 	// 停止动作
 | |||
|  | 	virtual void stopAction(Action * action); | |||
|  | 	// 暂停所有动作
 | |||
|  | 	virtual void pauseAllActions(); | |||
|  | 	// 继续所有动作
 | |||
|  | 	virtual void resumeAllActions(); | |||
|  | 	// 停止所有动作
 | |||
|  | 	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(); | |||
|  | 
 | |||
|  | 	// 添加精灵
 | |||
|  | 	void add(Sprite * sprite, int z_Order = 0); | |||
|  | 	// 删除精灵
 | |||
|  | 	bool delSprite(Sprite * child); | |||
|  | 	// 获取精灵数量
 | |||
|  | 	int getCount(); | |||
|  | 	// 获取所有精灵
 | |||
|  | 	std::vector<Sprite*> &getChildren(); | |||
|  | 	// 删除所有精灵
 | |||
|  | 	void clearAllSprites(); | |||
|  | 	// 判断是否有精灵产生碰撞
 | |||
|  | 	// 返回值:若有碰撞,返回第一个产生碰撞的精灵,否则返回空指针
 | |||
|  | 	Sprite * isCollisionWith(Sprite * sprite); | |||
|  | 	// 判断点是否在精灵内部
 | |||
|  | 	// 返回值:若这个点在任意一个精灵内部,返回这个精灵,否则返回空指针
 | |||
|  | 	Sprite * isPointIn(CPoint point); | |||
|  | 	// 所有精灵同时执行一段动画
 | |||
|  | 	virtual void addAction(Action * action) override; | |||
|  | 	// 同时修改所有精灵的图片
 | |||
|  | 	virtual void setImage(Image * image) override; | |||
|  | 
 | |||
|  | 	// 设置节点横坐标
 | |||
|  | 	virtual void setX(int x) override; | |||
|  | 	// 设置节点纵坐标
 | |||
|  | 	virtual void setY(int y) override; | |||
|  | 	// 设置节点坐标
 | |||
|  | 	virtual void setPos(int x, int y) override; | |||
|  | 	// 设置节点坐标
 | |||
|  | 	virtual void setPos(CPoint p) override; | |||
|  | 	// 移动节点
 | |||
|  | 	virtual void move(int x, int y) override; | |||
|  | 	// 移动节点
 | |||
|  | 	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(); | |||
|  | 
 | |||
|  | 	// 鼠标是否移入
 | |||
|  | 	virtual bool isMouseIn(); | |||
|  | 	// 鼠标是否选中
 | |||
|  | 	virtual bool isSelected(); | |||
|  | 	// 设置回调函数
 | |||
|  | 	virtual void setClickedCallback(const CLICK_CALLBACK & callback); | |||
|  | 	// 设置回调函数
 | |||
|  | 	virtual void setMouseInCallback(const CLICK_CALLBACK & callback); | |||
|  | 	// 设置回调函数
 | |||
|  | 	virtual void setMouseOutCallback(const CLICK_CALLBACK & callback); | |||
|  | 	// 设置回调函数
 | |||
|  | 	virtual void setSelectCallback(const CLICK_CALLBACK & callback); | |||
|  | 	// 设置回调函数
 | |||
|  | 	virtual void setUnselectCallback(const CLICK_CALLBACK & callback); | |||
|  | 	// 重置状态
 | |||
|  | 	virtual void reset(); | |||
|  | 	// 设置节点是否阻塞鼠标消息
 | |||
|  | 	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; | |||
|  | 
 | |||
|  | 	// 重写这个方法可以自定义按钮的判断方法
 | |||
|  | 	virtual bool _isMouseIn(); | |||
|  | 	// 切换状态
 | |||
|  | 	virtual void _setStatus(Status status); | |||
|  | 	// 正常状态
 | |||
|  | 	virtual void _onNormal() = 0; | |||
|  | 	// 鼠标移入时
 | |||
|  | 	virtual void _onMouseIn() = 0; | |||
|  | 	// 鼠标选中时
 | |||
|  | 	virtual void _onSelected() = 0; | |||
|  | }; | |||
|  | 
 | |||
|  | class Button : | |||
|  | 	public MouseNode | |||
|  | { | |||
|  | public: | |||
|  | 	Button(); | |||
|  | 	virtual ~Button(); | |||
|  | 
 | |||
|  | 	// 按钮是否启用
 | |||
|  | 	virtual bool isEnable(); | |||
|  | 	// 设置是否启用
 | |||
|  | 	virtual void setEnable(bool enable); | |||
|  | 
 | |||
|  | 	// 设置按钮横坐标
 | |||
|  | 	virtual void setX(int x) override; | |||
|  | 	// 设置按钮纵坐标
 | |||
|  | 	virtual void setY(int y) override; | |||
|  | 	// 设置按钮坐标
 | |||
|  | 	virtual void setPos(int x, int y) override; | |||
|  | 	// 设置按钮坐标
 | |||
|  | 	virtual void setPos(CPoint p) override; | |||
|  | 	// 移动按钮
 | |||
|  | 	virtual void move(int x, int y) override; | |||
|  | 	// 移动按钮
 | |||
|  | 	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(); | |||
|  | 
 | |||
|  | 	// 设置按钮文字
 | |||
|  | 	void setNormal(Text * text); | |||
|  | 	// 设置鼠标移入时的按钮文字
 | |||
|  | 	void setMouseIn(Text * text); | |||
|  | 	// 设置鼠标选中时的按钮文字
 | |||
|  | 	void setSelected(Text * text); | |||
|  | 	// 设置按钮禁用时的按钮文字
 | |||
|  | 	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(); | |||
|  | 
 | |||
|  | 	// 设置按钮图片
 | |||
|  | 	void setNormal(Image * image); | |||
|  | 	// 设置鼠标移入时的按钮图片
 | |||
|  | 	void setMouseIn(Image * image); | |||
|  | 	// 设置鼠标选中时的按钮图片
 | |||
|  | 	void setSelected(Image * image); | |||
|  | 	// 设置按钮禁用时的按钮图片
 | |||
|  | 	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(); | |||
|  | 
 | |||
|  | 	// 形状填充样式
 | |||
|  | 	enum STYLE { ROUND, SOLID, FILL } m_eStyle; | |||
|  | 
 | |||
|  | 	// 获取形状的填充颜色
 | |||
|  | 	COLORREF getFillColor() const; | |||
|  | 	// 获取形状的线条颜色
 | |||
|  | 	COLORREF getLineColor() const; | |||
|  | 	// 设置填充颜色
 | |||
|  | 	void setFillColor(COLORREF color); | |||
|  | 	// 设置线条颜色
 | |||
|  | 	void setLineColor(COLORREF color); | |||
|  | 	// 设置填充样式
 | |||
|  | 	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(); | |||
|  | 
 | |||
|  | 	// 获取矩形宽度
 | |||
|  | 	int getWidth() const; | |||
|  | 	// 获取矩形高度
 | |||
|  | 	int getHeight() const; | |||
|  | 	// 设置矩形宽度
 | |||
|  | 	void setWidth(int width); | |||
|  | 	// 设置矩形高度
 | |||
|  | 	void setHeight(int height); | |||
|  | 	// 设置矩形大小
 | |||
|  | 	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(); | |||
|  | 
 | |||
|  | 	// 获取圆形半径
 | |||
|  | 	int getRadius() const; | |||
|  | 	// 设置圆形半径
 | |||
|  | 	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(); | |||
|  | 
 | |||
|  | 	// 获取动作运行状态
 | |||
|  | 	virtual bool isRunning(); | |||
|  | 	// 获取动作结束状态
 | |||
|  | 	virtual bool isEnding(); | |||
|  | 	// 继续动作
 | |||
|  | 	virtual void start(); | |||
|  | 	// 继续动作
 | |||
|  | 	virtual void resume(); | |||
|  | 	// 暂停动作
 | |||
|  | 	virtual void pause(); | |||
|  | 	// 停止动作
 | |||
|  | 	virtual void stop(); | |||
|  | 	// 进入等待状态
 | |||
|  | 	virtual void wait(); | |||
|  | 	// 唤醒
 | |||
|  | 	virtual void notify(); | |||
|  | 	// 设置动作每一帧时间间隔
 | |||
|  | 	virtual void setInterval(LONGLONG milliSeconds); | |||
|  | 	// 获取一个新的拷贝动作
 | |||
|  | 	virtual Action * copy() const = 0; | |||
|  | 	// 获取一个新的逆向动作
 | |||
|  | 	virtual Action * reverse() const; | |||
|  | 	// 获取执行该动作的目标
 | |||
|  | 	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: | |||
|  | 	// 获取系统的 AppData\Local 路径
 | |||
|  | 	static TString getLocalAppDataPath(); | |||
|  | 	// 获取默认的保存路径
 | |||
|  | 	static TString getDefaultSavePath(); | |||
|  | 	// 保存 int 型的值
 | |||
|  | 	static void saveInt(LPCTSTR key, int value); | |||
|  | 	// 保存 double 型的值
 | |||
|  | 	static void saveDouble(LPCTSTR key, double value); | |||
|  | 	// 保存 字符串 型的值(不要在 Unicode 字符集下保存中文字符)
 | |||
|  | 	static void saveString(LPCTSTR key, TString value); | |||
|  | 	// 获取 int 型的值(若不存在则返回 default 参数的值)
 | |||
|  | 	static int getInt(LPCTSTR key, int default); | |||
|  | 	// 获取 double 型的值(若不存在则返回 default 参数的值)
 | |||
|  | 	static double getDouble(LPCTSTR key, double default); | |||
|  | 	// 获取 字符串 型的值(若不存在则返回 default 参数的值)
 | |||
|  | 	static TString geTString(LPCTSTR key, TString default); | |||
|  | 	// 得到文件扩展名(小写)
 | |||
|  | 	static TString getFileExtension(const TString& filePath); | |||
|  | 	/**
 | |||
|  | 	*  打开保存文件对话框,得到有效保存路径返回 true | |||
|  | 	*  参数:返回文件路径的字符串,窗口标题,设置扩展名过滤,设置默认扩展名 | |||
|  | 	*/ | |||
|  | 	static bool getSaveFilePath(TString& path, LPCTSTR title = _T("保存到"), LPCTSTR defExt = NULL); | |||
|  | }; | |||
|  | 
 | |||
|  | class MusicUtils | |||
|  | { | |||
|  | public: | |||
|  | 	// 播放背景音乐
 | |||
|  | 	static void playBackgroundMusic(TString pszFilePath, bool bLoop = true); | |||
|  | 	// 停止背景音乐
 | |||
|  | 	static void stopBackgroundMusic(bool bReleaseData = false); | |||
|  | 	// 暂停背景音乐
 | |||
|  | 	static void pauseBackgroundMusic(); | |||
|  | 	// 继续播放背景音乐
 | |||
|  | 	static void resumeBackgroundMusic(); | |||
|  | 	// 从头播放背景音乐
 | |||
|  | 	static void rewindBackgroundMusic(); | |||
|  | 	// 背景音乐是否正在播放
 | |||
|  | 	static bool isBackgroundMusicPlaying(); | |||
|  | 	// 设置背景音乐音量,0 ~ 1.0f
 | |||
|  | 	static void setBackgroundMusicVolume(float volume); | |||
|  | 
 | |||
|  | 	// 播放音效
 | |||
|  | 	static unsigned int playMusic(TString pszFilePath, bool loop = false); | |||
|  | 	// 停止音效
 | |||
|  | 	static void stopMusic(unsigned int nSoundId); | |||
|  | 	// 预加载音效
 | |||
|  | 	static void preloadMusic(TString pszFilePath); | |||
|  | 	// 暂停音效
 | |||
|  | 	static void pauseMusic(unsigned int nSoundId); | |||
|  | 	// 继续播放音效
 | |||
|  | 	static void resumeMusic(unsigned int nSoundId); | |||
|  | 	// 卸载音效
 | |||
|  | 	static void unloadMusic(LPCTSTR pszFilePath); | |||
|  | 	// 设置特定音乐的音量,0 ~ 1.0f
 | |||
|  | 	static void setVolume(TString pszFilePath, float volume); | |||
|  | 
 | |||
|  | 	// 暂停所有音乐
 | |||
|  | 	static void pauseAllMusics(); | |||
|  | 	// 继续播放所有音乐
 | |||
|  | 	static void resumeAllMusics(); | |||
|  | 	// 停止所有音乐
 | |||
|  | 	static void stopAllMusics(); | |||
|  | 	// 停止所有音乐,并释放内存
 | |||
|  | 	static void end(); | |||
|  | 	// 设置总音量,0 ~ 1.0f
 | |||
|  | 	static void setVolume(float volume); | |||
|  | }; | |||
|  | 
 | |||
|  | class Timer | |||
|  | { | |||
|  | 	friend App; | |||
|  | public: | |||
|  | 	Timer(TString name, LONGLONG milliSeconds, const TIMER_CALLBACK & callback); | |||
|  | 	~Timer(); | |||
|  | 
 | |||
|  | 	// 启动定时器
 | |||
|  | 	void start(); | |||
|  | 	// 停止定时器
 | |||
|  | 	void stop(); | |||
|  | 	// 进入等待状态
 | |||
|  | 	void wait(); | |||
|  | 	// 唤醒
 | |||
|  | 	void notify(); | |||
|  | 	// 定时器是否正在运行
 | |||
|  | 	bool isRunning(); | |||
|  | 	// 设置间隔时间
 | |||
|  | 	void setInterval(LONGLONG milliSeconds); | |||
|  | 	// 设置回调函数
 | |||
|  | 	void setCallback(const TIMER_CALLBACK& callback); | |||
|  | 	// 设置定时器名称
 | |||
|  | 	void setName(TString name); | |||
|  | 	// 获取定时器间隔时间
 | |||
|  | 	LONGLONG getInterval() const; | |||
|  | 	// 获取定时器名称
 | |||
|  | 	TString getName() const; | |||
|  | 
 | |||
|  | 	// 添加定时器
 | |||
|  | 	static void addTimer(Timer * timer); | |||
|  | 	// 添加定时器
 | |||
|  | 	static void addTimer(TString name, const TIMER_CALLBACK & callback); | |||
|  | 	// 添加定时器
 | |||
|  | 	static void addTimer(TString name, LONGLONG milliSeconds, const TIMER_CALLBACK & callback); | |||
|  | 	// 启动特定定时器
 | |||
|  | 	static void startTimer(TString name); | |||
|  | 	// 停止特定定时器
 | |||
|  | 	static void stopTimer(TString name); | |||
|  | 	// 删除特定定时器
 | |||
|  | 	static void delTimer(TString name); | |||
|  | 	// 删除所有定时器
 | |||
|  | 	static void clearAllTimers(); | |||
|  | 
 | |||
|  | 	// 继续绑定在场景上的所有定时器
 | |||
|  | 	static void notifyAllSceneTimers(Scene* scene); | |||
|  | 	// 停止绑定在场景上的所有定时器
 | |||
|  | 	static void waitAllSceneTimers(Scene* scene); | |||
|  | 	// 清除绑定在场景上的所有定时器
 | |||
|  | 	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: | |||
|  | 	// 继续一个特定的动作
 | |||
|  | 	static void startAction(Action * action); | |||
|  | 	// 继续一个特定的动作
 | |||
|  | 	static void resumeAction(Action * action); | |||
|  | 	// 暂停一个特定的动作
 | |||
|  | 	static void pauseAction(Action * action); | |||
|  | 	// 停止一个特定的动作
 | |||
|  | 	static void stopAction(Action * action); | |||
|  | 
 | |||
|  | 	// 继续一个 Sprite 的所有动作
 | |||
|  | 	static void startSpriteAllActions(Sprite * sprite); | |||
|  | 	// 继续一个 Sprite 的所有动作
 | |||
|  | 	static void resumeSpriteAllActions(Sprite * sprite); | |||
|  | 	// 暂停一个 Sprite 的所有动作
 | |||
|  | 	static void pauseSpriteAllActions(Sprite * sprite); | |||
|  | 	// 停止一个 Sprite 的所有动作
 | |||
|  | 	static void stopSpriteAllActions(Sprite * sprite); | |||
|  | 
 | |||
|  | 	// 继续当前存在的所有动作
 | |||
|  | 	static void startAllActions(); | |||
|  | 	// 继续当前存在的所有动作
 | |||
|  | 	static void resumeAllActions(); | |||
|  | 	// 暂停当前存在的所有动作
 | |||
|  | 	static void pauseAllActions(); | |||
|  | 	// 停止当前存在的所有动作
 | |||
|  | 	static void stopAllActions(); | |||
|  | 	// 删除当前存在的所有动作
 | |||
|  | 	static void clearAllActions(); | |||
|  | 
 | |||
|  | 	// 继续绑定在场景上的动作
 | |||
|  | 	static void notifyAllSceneActions(Scene* scene); | |||
|  | 	// 暂停绑定在场景上的动作
 | |||
|  | 	static void waitAllSceneActions(Scene* scene); | |||
|  | 	// 停止绑定在场景上的动作
 | |||
|  | 	static void stopAllSceneActions(Scene* scene); | |||
|  | 
 | |||
|  | private: | |||
|  | 	static void __exec(); | |||
|  | 	// 将一个动作添加进动作管理器
 | |||
|  | 	static void addAction(Action * action); | |||
|  | }; | |||
|  | 
 | |||
|  | class Math | |||
|  | { | |||
|  | public: | |||
|  | 	// 取得整型范围内的一个随机数
 | |||
|  | 	template<typename T> | |||
|  | 	static T randomInt(T min, T max) | |||
|  | 	{ | |||
|  | 		std::uniform_int_distribution<T> dist(min, max); | |||
|  | 		return dist(getEngine()); | |||
|  | 	} | |||
|  | 	// 取得浮点数类型范围内的一个随机数
 | |||
|  | 	template<typename T> | |||
|  | 	static T randomReal(T min, T max) | |||
|  | 	{ | |||
|  | 		std::uniform_real_distribution<T> dist(min, max); | |||
|  | 		return dist(getEngine()); | |||
|  | 	} | |||
|  | 	// 获取随机数产生器
 | |||
|  | 	static std::default_random_engine &getEngine(); | |||
|  | }; | |||
|  | 
 | |||
|  | }	// End of easy2d namespace
 | |||
|  | 
 | |||
|  | 
 | |||
|  | // Functions Declare
 | |||
|  | 
 | |||
|  | template<typename T> | |||
|  | inline void SafeRelease(T* p) { if (p) p->release(); } | |||
|  | template<typename T> | |||
|  | inline void SafeDelete(T* 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; |