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