parent
							
								
									ecc0e9cf25
								
							
						
					
					
						commit
						4a71273b35
					
				|  | @ -125,7 +125,7 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Sequence::Sequence(const Actions& actions) | 	Sequence::Sequence(Array<SpAction> const& actions) | ||||||
| 		: action_index_(0) | 		: action_index_(0) | ||||||
| 	{ | 	{ | ||||||
| 		this->Add(actions); | 		this->Add(actions); | ||||||
|  | @ -180,7 +180,7 @@ namespace easy2d | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void Sequence::Add(const Actions& actions) | 	void Sequence::Add(Array<SpAction> const& actions) | ||||||
| 	{ | 	{ | ||||||
| 		for (const auto &action : actions) | 		for (const auto &action : actions) | ||||||
| 		{ | 		{ | ||||||
|  | @ -227,7 +227,7 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Spawn::Spawn(const Actions& actions) | 	Spawn::Spawn(Array<SpAction> const& actions) | ||||||
| 	{ | 	{ | ||||||
| 		this->Add(actions); | 		this->Add(actions); | ||||||
| 	} | 	} | ||||||
|  | @ -289,7 +289,7 @@ namespace easy2d | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void Spawn::Add(const Actions& actions) | 	void Spawn::Add(Array<SpAction> const& actions) | ||||||
| 	{ | 	{ | ||||||
| 		for (const auto &action : actions) | 		for (const auto &action : actions) | ||||||
| 		{ | 		{ | ||||||
|  |  | ||||||
|  | @ -64,13 +64,11 @@ namespace easy2d | ||||||
| 	class Sequence | 	class Sequence | ||||||
| 		: public Action | 		: public Action | ||||||
| 	{ | 	{ | ||||||
| 		using Actions = std::vector<SpAction>; |  | ||||||
| 
 |  | ||||||
| 	public: | 	public: | ||||||
| 		Sequence(); | 		Sequence(); | ||||||
| 
 | 
 | ||||||
| 		explicit Sequence( | 		explicit Sequence( | ||||||
| 			Actions const& actions	/* 动作列表 */ | 			Array<SpAction> const& actions	/* 动作列表 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		virtual ~Sequence(); | 		virtual ~Sequence(); | ||||||
|  | @ -82,7 +80,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		// 在结尾添加多个动作
 | 		// 在结尾添加多个动作
 | ||||||
| 		void Add( | 		void Add( | ||||||
| 			const Actions& actions	/* 动作列表 */ | 			Array<SpAction> const& actions	/* 动作列表 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 获取该动作的拷贝对象
 | 		// 获取该动作的拷贝对象
 | ||||||
|  | @ -103,7 +101,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 	protected: | 	protected: | ||||||
| 		UINT action_index_; | 		UINT action_index_; | ||||||
| 		Actions actions_; | 		Array<SpAction> actions_; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -111,13 +109,11 @@ namespace easy2d | ||||||
| 	class Spawn | 	class Spawn | ||||||
| 		: public Action | 		: public Action | ||||||
| 	{ | 	{ | ||||||
| 		using Actions = std::vector<SpAction>; |  | ||||||
| 
 |  | ||||||
| 	public: | 	public: | ||||||
| 		Spawn(); | 		Spawn(); | ||||||
| 
 | 
 | ||||||
| 		explicit Spawn( | 		explicit Spawn( | ||||||
| 			const Actions& actions	/* 动作列表 */ | 			Array<SpAction> const& actions	/* 动作列表 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		virtual ~Spawn(); | 		virtual ~Spawn(); | ||||||
|  | @ -129,7 +125,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		// 在结尾添加多个动作
 | 		// 在结尾添加多个动作
 | ||||||
| 		void Add( | 		void Add( | ||||||
| 			const Actions& actions	/* 动作列表 */ | 			Array<SpAction> const& actions	/* 动作列表 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 获取该动作的拷贝对象
 | 		// 获取该动作的拷贝对象
 | ||||||
|  | @ -149,6 +145,6 @@ namespace easy2d | ||||||
| 		virtual void Update(Node* target, Duration const& dt) override; | 		virtual void Update(Node* target, Duration const& dt) override; | ||||||
| 
 | 
 | ||||||
| 	protected: | 	protected: | ||||||
| 		Actions actions_; | 		Array<SpAction> actions_; | ||||||
| 	}; | 	}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -262,7 +262,7 @@ namespace easy2d | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void Canvas::DrawText(std::wstring const & text, Point const & point) | 	void Canvas::DrawText(String const & text, Point const & point) | ||||||
| 	{ | 	{ | ||||||
| 		if (text.empty()) | 		if (text.empty()) | ||||||
| 			return; | 			return; | ||||||
|  | @ -416,14 +416,14 @@ namespace easy2d | ||||||
| 			current_sink_->AddLine(point); | 			current_sink_->AddLine(point); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void Canvas::AddLines(std::vector<Point> const& points) | 	void Canvas::AddLines(Array<Point> const& points) | ||||||
| 	{ | 	{ | ||||||
| 		if (current_sink_) | 		if (current_sink_) | ||||||
| 		{ | 		{ | ||||||
| 			if (!points.empty()) | 			if (!points.empty()) | ||||||
| 			{ | 			{ | ||||||
| 				size_t size = points.size(); | 				size_t size = points.size(); | ||||||
| 				std::vector<D2D1_POINT_2F> d2d_points(size); | 				Array<D2D1_POINT_2F> d2d_points(size); | ||||||
| 				for (size_t i = 0; i < size; ++i) | 				for (size_t i = 0; i < size; ++i) | ||||||
| 				{ | 				{ | ||||||
| 					d2d_points[i] = points[i]; | 					d2d_points[i] = points[i]; | ||||||
|  |  | ||||||
|  | @ -91,7 +91,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		// 画文字
 | 		// 画文字
 | ||||||
| 		void DrawText( | 		void DrawText( | ||||||
| 			std::wstring const& text,		/* 文字 */ | 			String const& text,		/* 文字 */ | ||||||
| 			Point const& point		/* 文字位置 */ | 			Point const& point		/* 文字位置 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
|  | @ -147,7 +147,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		// 添加多条线段
 | 		// 添加多条线段
 | ||||||
| 		void AddLines( | 		void AddLines( | ||||||
| 			std::vector<Point> const& points | 			Array<Point> const& points | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 添加一条三次方贝塞尔曲线
 | 		// 添加一条三次方贝塞尔曲线
 | ||||||
|  |  | ||||||
|  | @ -50,7 +50,7 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void DebugNodeImpl::AddDebugText(std::wstring const & text) | 	void DebugNodeImpl::AddDebugText(String const & text) | ||||||
| 	{ | 	{ | ||||||
| 		try | 		try | ||||||
| 		{ | 		{ | ||||||
|  |  | ||||||
|  | @ -35,7 +35,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		virtual ~DebugNodeImpl(); | 		virtual ~DebugNodeImpl(); | ||||||
| 
 | 
 | ||||||
| 		void AddDebugText(std::wstring const& text); | 		void AddDebugText(String const& text); | ||||||
| 
 | 
 | ||||||
| 		void ClearDebugText(); | 		void ClearDebugText(); | ||||||
| 
 | 
 | ||||||
|  | @ -45,8 +45,8 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 	protected: | 	protected: | ||||||
| 		SpText				debug_text_; | 		SpText				debug_text_; | ||||||
| 		std::vector<TimePoint> frame_time_; | 		Array<TimePoint>	frame_time_; | ||||||
| 		std::vector<std::wstring> texts_; | 		Array<String>		texts_; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	E2D_DECLARE_SINGLETON_TYPE(DebugNodeImpl, DebugNode); | 	E2D_DECLARE_SINGLETON_TYPE(DebugNodeImpl, DebugNode); | ||||||
|  |  | ||||||
|  | @ -50,7 +50,7 @@ namespace easy2d | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void EventDispatcher::AddListener(EventType type, EventCallback callback, std::wstring const& name) | 	void EventDispatcher::AddListener(EventType type, EventCallback callback, String const& name) | ||||||
| 	{ | 	{ | ||||||
| 		SpEventListener listener = new EventListener(type, callback, name); | 		SpEventListener listener = new EventListener(type, callback, name); | ||||||
| 		if (listener) | 		if (listener) | ||||||
|  | @ -59,7 +59,7 @@ namespace easy2d | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void EventDispatcher::StartListeners(std::wstring const & listener_name) | 	void EventDispatcher::StartListeners(String const & listener_name) | ||||||
| 	{ | 	{ | ||||||
| 		for (auto listener = listeners_.First(); listener; listener = listener->NextItem()) | 		for (auto listener = listeners_.First(); listener; listener = listener->NextItem()) | ||||||
| 		{ | 		{ | ||||||
|  | @ -70,7 +70,7 @@ namespace easy2d | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void EventDispatcher::StopListeners(std::wstring const & listener_name) | 	void EventDispatcher::StopListeners(String const & listener_name) | ||||||
| 	{ | 	{ | ||||||
| 		for (auto listener = listeners_.First(); listener; listener = listener->NextItem()) | 		for (auto listener = listeners_.First(); listener; listener = listener->NextItem()) | ||||||
| 		{ | 		{ | ||||||
|  | @ -81,7 +81,7 @@ namespace easy2d | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void EventDispatcher::RemoveListeners(std::wstring const & listener_name) | 	void EventDispatcher::RemoveListeners(String const & listener_name) | ||||||
| 	{ | 	{ | ||||||
| 		SpEventListener next; | 		SpEventListener next; | ||||||
| 		for (auto listener = listeners_.First(); listener; listener = next) | 		for (auto listener = listeners_.First(); listener; listener = next) | ||||||
|  |  | ||||||
|  | @ -37,22 +37,22 @@ namespace easy2d | ||||||
| 		void AddListener( | 		void AddListener( | ||||||
| 			EventType type, | 			EventType type, | ||||||
| 			EventCallback callback, | 			EventCallback callback, | ||||||
| 			std::wstring const& name = L"" | 			String const& name = L"" | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 启动监听器
 | 		// 启动监听器
 | ||||||
| 		void StartListeners( | 		void StartListeners( | ||||||
| 			std::wstring const& listener_name | 			String const& listener_name | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 停止监听器
 | 		// 停止监听器
 | ||||||
| 		void StopListeners( | 		void StopListeners( | ||||||
| 			std::wstring const& listener_name | 			String const& listener_name | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 移除监听器
 | 		// 移除监听器
 | ||||||
| 		void RemoveListeners( | 		void RemoveListeners( | ||||||
| 			std::wstring const& listener_name | 			String const& listener_name | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 启动监听器
 | 		// 启动监听器
 | ||||||
|  |  | ||||||
|  | @ -23,7 +23,7 @@ | ||||||
| 
 | 
 | ||||||
| namespace easy2d | namespace easy2d | ||||||
| { | { | ||||||
| 	EventListener::EventListener(EventType type, EventCallback const & callback, std::wstring const & name) | 	EventListener::EventListener(EventType type, EventCallback const & callback, String const & name) | ||||||
| 		: type_(type) | 		: type_(type) | ||||||
| 		, callback_(callback) | 		, callback_(callback) | ||||||
| 		, name_(name) | 		, name_(name) | ||||||
|  | @ -50,12 +50,12 @@ namespace easy2d | ||||||
| 		return running_; | 		return running_; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::wstring const & EventListener::GetName() const | 	String const & EventListener::GetName() const | ||||||
| 	{ | 	{ | ||||||
| 		return name_; | 		return name_; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void EventListener::SetName(std::wstring const & name) | 	void EventListener::SetName(String const & name) | ||||||
| 	{ | 	{ | ||||||
| 		name_ = name; | 		name_ = name; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -41,7 +41,7 @@ namespace easy2d | ||||||
| 		EventListener( | 		EventListener( | ||||||
| 			EventType type, | 			EventType type, | ||||||
| 			EventCallback const& callback, | 			EventCallback const& callback, | ||||||
| 			std::wstring const& name = L"" | 			String const& name = L"" | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		virtual ~EventListener(); | 		virtual ~EventListener(); | ||||||
|  | @ -50,15 +50,15 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		void Stop(); | 		void Stop(); | ||||||
| 
 | 
 | ||||||
| 		void SetName(std::wstring const& name); | 		void SetName(String const& name); | ||||||
| 
 | 
 | ||||||
| 		bool IsRunning() const; | 		bool IsRunning() const; | ||||||
| 
 | 
 | ||||||
| 		std::wstring const& GetName() const; | 		String const& GetName() const; | ||||||
| 
 | 
 | ||||||
| 	protected: | 	protected: | ||||||
| 		bool			running_; | 		bool			running_; | ||||||
| 		std::wstring	name_; | 		String			name_; | ||||||
| 		EventType		type_; | 		EventType		type_; | ||||||
| 		EventCallback	callback_; | 		EventCallback	callback_; | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|  | @ -150,7 +150,7 @@ namespace easy2d | ||||||
| 		return hr; | 		return hr; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	HRESULT FactoryImpl::CreateBitmapFromFile(CpBitmap & bitmap, CpRenderTarget const & rt, std::wstring const & file_path) | 	HRESULT FactoryImpl::CreateBitmapFromFile(CpBitmap & bitmap, CpRenderTarget const & rt, String const & file_path) | ||||||
| 	{ | 	{ | ||||||
| 		if (imaging_factory_ == nullptr) | 		if (imaging_factory_ == nullptr) | ||||||
| 		{ | 		{ | ||||||
|  | @ -227,8 +227,9 @@ namespace easy2d | ||||||
| 		SmartPointer<ID2D1Bitmap>			bitmap_tmp; | 		SmartPointer<ID2D1Bitmap>			bitmap_tmp; | ||||||
| 		 | 		 | ||||||
| 		// ¼ÓÔØ×ÊÔ´
 | 		// ¼ÓÔØ×ÊÔ´
 | ||||||
| 		ResourceData buffer; | 		LPVOID buffer; | ||||||
| 		HRESULT hr = res.Load(&buffer) ? S_OK : E_FAIL; | 		DWORD buffer_size; | ||||||
|  | 		HRESULT hr = res.Load(buffer, buffer_size) ? S_OK : E_FAIL; | ||||||
| 
 | 
 | ||||||
| 		if (SUCCEEDED(hr)) | 		if (SUCCEEDED(hr)) | ||||||
| 		{ | 		{ | ||||||
|  | @ -238,8 +239,8 @@ namespace easy2d | ||||||
| 		if (SUCCEEDED(hr)) | 		if (SUCCEEDED(hr)) | ||||||
| 		{ | 		{ | ||||||
| 			hr = stream->InitializeFromMemory( | 			hr = stream->InitializeFromMemory( | ||||||
| 				static_cast<WICInProcPointer>(buffer.buffer), | 				static_cast<WICInProcPointer>(buffer), | ||||||
| 				buffer.buffer_size | 				buffer_size | ||||||
| 			); | 			); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -418,7 +419,7 @@ namespace easy2d | ||||||
| 		return hr; | 		return hr; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	HRESULT FactoryImpl::CreateTextLayout(CpTextLayout & text_layout, Size& layout_size, std::wstring const & text, CpTextFormat const& text_format, TextStyle const & text_style) const | 	HRESULT FactoryImpl::CreateTextLayout(CpTextLayout & text_layout, Size& layout_size, String const & text, CpTextFormat const& text_format, TextStyle const & text_style) const | ||||||
| 	{ | 	{ | ||||||
| 		if (!write_factory_) | 		if (!write_factory_) | ||||||
| 			return E_UNEXPECTED; | 			return E_UNEXPECTED; | ||||||
|  |  | ||||||
|  | @ -52,7 +52,7 @@ namespace easy2d | ||||||
| 		HRESULT CreateBitmapFromFile( | 		HRESULT CreateBitmapFromFile( | ||||||
| 			CpBitmap& bitmap, | 			CpBitmap& bitmap, | ||||||
| 			CpRenderTarget const& rt, | 			CpRenderTarget const& rt, | ||||||
| 			std::wstring const& file_path | 			String const& file_path | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		HRESULT CreateBitmapFromResource( | 		HRESULT CreateBitmapFromResource( | ||||||
|  | @ -99,7 +99,7 @@ namespace easy2d | ||||||
| 		HRESULT CreateTextLayout( | 		HRESULT CreateTextLayout( | ||||||
| 			CpTextLayout& text_layout, | 			CpTextLayout& text_layout, | ||||||
| 			Size& layout_size, | 			Size& layout_size, | ||||||
| 			std::wstring const& text, | 			String const& text, | ||||||
| 			CpTextFormat const& text_format, | 			CpTextFormat const& text_format, | ||||||
| 			TextStyle const& text_style | 			TextStyle const& text_style | ||||||
| 		) const; | 		) const; | ||||||
|  |  | ||||||
|  | @ -41,14 +41,14 @@ namespace easy2d | ||||||
| 	class Font | 	class Font | ||||||
| 	{ | 	{ | ||||||
| 	public: | 	public: | ||||||
| 		std::wstring	family;		// ×ÖÌå×å
 | 		String			family;		// ×ÖÌå×å
 | ||||||
| 		float			size;		// 字号
 | 		float			size;		// 字号
 | ||||||
| 		unsigned int	weight;		// 粗细值
 | 		unsigned int	weight;		// 粗细值
 | ||||||
| 		bool			italic;		// 是否斜体
 | 		bool			italic;		// 是否斜体
 | ||||||
| 
 | 
 | ||||||
| 	public: | 	public: | ||||||
| 		Font( | 		Font( | ||||||
| 			const std::wstring& family	= L"", | 			const String& family	= L"", | ||||||
| 			float size				= 22, | 			float size				= 22, | ||||||
| 			unsigned int weight		= FontWeight::Normal, | 			unsigned int weight		= FontWeight::Normal, | ||||||
| 			bool italic				= false | 			bool italic				= false | ||||||
|  |  | ||||||
|  | @ -29,7 +29,7 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Frames::Frames(Images const& frames) | 	Frames::Frames(Array<SpImage> const& frames) | ||||||
| 		: interval_(1) | 		: interval_(1) | ||||||
| 	{ | 	{ | ||||||
| 		this->Add(frames); | 		this->Add(frames); | ||||||
|  | @ -40,7 +40,7 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Frames::Frames(Duration const& interval, Images const& frames) | 	Frames::Frames(Duration const& interval, Array<SpImage> const& frames) | ||||||
| 		: interval_(interval) | 		: interval_(interval) | ||||||
| 	{ | 	{ | ||||||
| 		this->Add(frames); | 		this->Add(frames); | ||||||
|  | @ -65,7 +65,7 @@ namespace easy2d | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void Frames::Add(Images const& frames) | 	void Frames::Add(Array<SpImage> const& frames) | ||||||
| 	{ | 	{ | ||||||
| 		for (const auto &image : frames) | 		for (const auto &image : frames) | ||||||
| 		{ | 		{ | ||||||
|  | @ -78,7 +78,7 @@ namespace easy2d | ||||||
| 		return interval_; | 		return interval_; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Frames::Images const& Frames::GetFrames() const | 	Array<SpImage> const& Frames::GetFrames() const | ||||||
| 	{ | 	{ | ||||||
| 		return frames_; | 		return frames_; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -28,13 +28,11 @@ namespace easy2d | ||||||
| 	class Frames | 	class Frames | ||||||
| 		: public Object | 		: public Object | ||||||
| 	{ | 	{ | ||||||
| 		using Images = std::vector< SpImage >; |  | ||||||
| 
 |  | ||||||
| 	public: | 	public: | ||||||
| 		Frames(); | 		Frames(); | ||||||
| 
 | 
 | ||||||
| 		explicit Frames( | 		explicit Frames( | ||||||
| 			Images const& frames		/* 关键帧数组 */ | 			Array<SpImage> const& frames	/* 关键帧数组 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		explicit Frames( | 		explicit Frames( | ||||||
|  | @ -43,7 +41,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		explicit Frames( | 		explicit Frames( | ||||||
| 			Duration const& interval,		/* 帧间隔 */ | 			Duration const& interval,		/* 帧间隔 */ | ||||||
| 			Images const& frames		/* 关键帧数组 */ | 			Array<SpImage> const& frames	/* 关键帧数组 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		virtual ~Frames(); | 		virtual ~Frames(); | ||||||
|  | @ -55,14 +53,14 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		// 添加多个关键帧
 | 		// 添加多个关键帧
 | ||||||
| 		void Add( | 		void Add( | ||||||
| 			Images const& frames | 			Array<SpImage> const& frames | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 获取帧间隔
 | 		// 获取帧间隔
 | ||||||
| 		Duration const& GetInterval() const; | 		Duration const& GetInterval() const; | ||||||
| 
 | 
 | ||||||
| 		// 获取关键帧
 | 		// 获取关键帧
 | ||||||
| 		Images const& GetFrames() const; | 		Array<SpImage> const& GetFrames() const; | ||||||
| 
 | 
 | ||||||
| 		// 设置每一帧的时间间隔
 | 		// 设置每一帧的时间间隔
 | ||||||
| 		void SetInterval( | 		void SetInterval( | ||||||
|  | @ -77,6 +75,6 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 	protected: | 	protected: | ||||||
| 		Duration		interval_; | 		Duration		interval_; | ||||||
| 		Images		frames_; | 		Array<SpImage>	frames_; | ||||||
| 	}; | 	}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -27,7 +27,6 @@ | ||||||
| #include "Transition.h" | #include "Transition.h" | ||||||
| #include "KeyEvent.hpp" | #include "KeyEvent.hpp" | ||||||
| #include "MouseEvent.hpp" | #include "MouseEvent.hpp" | ||||||
| #include "../math/Matrix.hpp" |  | ||||||
| #include <windowsx.h> | #include <windowsx.h> | ||||||
| #include <imm.h> | #include <imm.h> | ||||||
| 
 | 
 | ||||||
|  | @ -258,9 +257,21 @@ namespace easy2d | ||||||
| 			::InvalidateRect(hwnd, NULL, FALSE); | 			::InvalidateRect(hwnd, NULL, FALSE); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool Game::HandleMessage(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) | 	void Game::Dispatch(Event * event) | ||||||
| 	{ | 	{ | ||||||
| 		bool unhandled = false; | 		if (transition_) | ||||||
|  | 			return; | ||||||
|  | 
 | ||||||
|  | 		if (curr_scene_) | ||||||
|  | 			curr_scene_->DispatchEvent(event); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	LRESULT CALLBACK Game::WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) | ||||||
|  | 	{ | ||||||
|  | 		Game * game = reinterpret_cast<Game*>(::GetWindowLongW(hwnd, GWLP_USERDATA)); | ||||||
|  | 
 | ||||||
|  | 		if (!game) | ||||||
|  | 			return ::DefWindowProcW(hwnd, msg, wparam, lparam); | ||||||
| 		 | 		 | ||||||
| 		switch (msg) | 		switch (msg) | ||||||
| 		{ | 		{ | ||||||
|  | @ -269,10 +280,12 @@ namespace easy2d | ||||||
| 			PAINTSTRUCT ps; | 			PAINTSTRUCT ps; | ||||||
| 			::BeginPaint(hwnd, &ps); | 			::BeginPaint(hwnd, &ps); | ||||||
| 
 | 
 | ||||||
| 			Update(); | 			game->Update(); | ||||||
| 			Render(hwnd); | 			game->Render(hwnd); | ||||||
| 
 | 
 | ||||||
| 			::EndPaint(hwnd, &ps); | 			::EndPaint(hwnd, &ps); | ||||||
|  | 
 | ||||||
|  | 			return 0; | ||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
|  | @ -310,7 +323,7 @@ namespace easy2d | ||||||
| 			if (wparam & MK_LBUTTON || wparam & MK_RBUTTON) | 			if (wparam & MK_LBUTTON || wparam & MK_RBUTTON) | ||||||
| 				event.button_down = true; | 				event.button_down = true; | ||||||
| 
 | 
 | ||||||
| 			Dispatch(&event); | 			game->Dispatch(&event); | ||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
|  | @ -318,13 +331,14 @@ namespace easy2d | ||||||
| 		case WM_KEYUP: | 		case WM_KEYUP: | ||||||
| 		{ | 		{ | ||||||
| 			KeyEvent event(msg, KeyCode(wparam)); | 			KeyEvent event(msg, KeyCode(wparam)); | ||||||
| 			Dispatch(&event); | 			game->Dispatch(&event); | ||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
| 		case WM_DISPLAYCHANGE: | 		case WM_DISPLAYCHANGE: | ||||||
| 		{ | 		{ | ||||||
| 			E2D_LOG("The display resolution has changed"); | 			E2D_LOG("The display resolution has changed"); | ||||||
|  | 
 | ||||||
| 			::InvalidateRect(hwnd, nullptr, FALSE); | 			::InvalidateRect(hwnd, nullptr, FALSE); | ||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
|  | @ -334,12 +348,13 @@ namespace easy2d | ||||||
| 			E2D_LOG("Received a message to close the window"); | 			E2D_LOG("Received a message to close the window"); | ||||||
| 
 | 
 | ||||||
| 			SysEvent event(SysEvent::WindowClose); | 			SysEvent event(SysEvent::WindowClose); | ||||||
| 			Dispatch(&event); | 			game->Dispatch(&event); | ||||||
| 
 | 
 | ||||||
| 			if (OnClose()) | 			if (game->OnClose()) | ||||||
| 			{ | 			{ | ||||||
| 				::DestroyWindow(hwnd); | 				::DestroyWindow(hwnd); | ||||||
| 			} | 			} | ||||||
|  | 			return 0; | ||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
|  | @ -347,8 +362,9 @@ namespace easy2d | ||||||
| 		{ | 		{ | ||||||
| 			E2D_LOG("Window was destroyed"); | 			E2D_LOG("Window was destroyed"); | ||||||
| 
 | 
 | ||||||
| 			OnExit(); | 			game->OnExit(); | ||||||
| 			::PostQuitMessage(0); | 			::PostQuitMessage(0); | ||||||
|  | 			return 0; | ||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
|  | @ -356,13 +372,13 @@ namespace easy2d | ||||||
| 		{ | 		{ | ||||||
| 			if (SIZE_MAXHIDE == wparam || SIZE_MINIMIZED == wparam) | 			if (SIZE_MAXHIDE == wparam || SIZE_MINIMIZED == wparam) | ||||||
| 			{ | 			{ | ||||||
| 				active_ = false; | 				game->active_ = false; | ||||||
| 
 | 
 | ||||||
| 				E2D_LOG("Window minimized"); | 				E2D_LOG("Window minimized"); | ||||||
| 			} | 			} | ||||||
| 			else if (SIZE_RESTORED == wparam) | 			else if (SIZE_RESTORED == wparam) | ||||||
| 			{ | 			{ | ||||||
| 				active_ = true; | 				game->active_ = true; | ||||||
| 				::InvalidateRect(hwnd, nullptr, FALSE); | 				::InvalidateRect(hwnd, nullptr, FALSE); | ||||||
| 
 | 
 | ||||||
| 				E2D_LOG("Window restored"); | 				E2D_LOG("Window restored"); | ||||||
|  | @ -376,69 +392,41 @@ namespace easy2d | ||||||
| 			// 错误,因为这个错误将在下一次调用 EndDraw 时产生
 | 			// 错误,因为这个错误将在下一次调用 EndDraw 时产生
 | ||||||
| 			Graphics::Instance()->Resize(width, height); | 			Graphics::Instance()->Resize(width, height); | ||||||
| 		} | 		} | ||||||
| 		unhandled = true; |  | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
| 		case WM_ACTIVATE: | 		case WM_ACTIVATE: | ||||||
| 		{ | 		{ | ||||||
| 			if (WA_INACTIVE == wparam) | 			bool active = (LOWORD(wparam) != WA_INACTIVE); | ||||||
| 			{ | 			if (active) | ||||||
| 				E2D_LOG("Window deactivated"); |  | ||||||
| 
 |  | ||||||
| 				SysEvent event(SysEvent::WindowDeavtivate); |  | ||||||
| 				Dispatch(&event); |  | ||||||
| 			} |  | ||||||
| 			else |  | ||||||
| 			{ | 			{ | ||||||
| 				E2D_LOG("Window activated"); | 				E2D_LOG("Window activated"); | ||||||
| 
 | 
 | ||||||
| 				SysEvent event(SysEvent::WindowActivate); | 				SysEvent event(SysEvent::WindowActivate); | ||||||
| 				Dispatch(&event); | 				game->Dispatch(&event); | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 			{ | ||||||
|  | 				E2D_LOG("Window deactivated"); | ||||||
|  | 
 | ||||||
|  | 				SysEvent event(SysEvent::WindowDeavtivate); | ||||||
|  | 				game->Dispatch(&event); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		unhandled = true; |  | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
| 		case WM_SETTEXT: | 		case WM_SETTEXT: | ||||||
| 		{ | 		{ | ||||||
| 			E2D_LOG("Window title changed"); | 			E2D_LOG("Window title changed"); | ||||||
| 		} | 		} | ||||||
| 		unhandled = true; |  | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
| 		case WM_SETICON: | 		case WM_SETICON: | ||||||
| 		{ | 		{ | ||||||
| 			E2D_LOG("Window icon changed"); | 			E2D_LOG("Window icon changed"); | ||||||
| 		} | 		} | ||||||
| 		unhandled = true; |  | ||||||
| 		break; |  | ||||||
| 
 |  | ||||||
| 		default: |  | ||||||
| 			unhandled = true; |  | ||||||
| 		break; | 		break; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		return !unhandled; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	void Game::Dispatch(Event * event) |  | ||||||
| 	{ |  | ||||||
| 		if (transition_) |  | ||||||
| 			return; |  | ||||||
| 
 |  | ||||||
| 		if (curr_scene_) |  | ||||||
| 			curr_scene_->DispatchEvent(event); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	LRESULT CALLBACK Game::WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) |  | ||||||
| 	{ |  | ||||||
| 		Game * game = reinterpret_cast<Game*>( |  | ||||||
| 			static_cast<LONG_PTR>(::GetWindowLongW(hwnd, GWLP_USERDATA)) |  | ||||||
| 			); |  | ||||||
| 		 |  | ||||||
| 		if (game && game->HandleMessage(hwnd, msg, wparam, lparam)) |  | ||||||
| 			return 0; |  | ||||||
| 
 |  | ||||||
| 		return ::DefWindowProcW(hwnd, msg, wparam, lparam); | 		return ::DefWindowProcW(hwnd, msg, wparam, lparam); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -31,7 +31,7 @@ namespace easy2d | ||||||
| { | { | ||||||
| 	struct Options | 	struct Options | ||||||
| 	{ | 	{ | ||||||
| 		std::wstring	title;	// ±êÌâ
 | 		String	title;	// ±êÌâ
 | ||||||
| 		int		width;	// 宽度
 | 		int		width;	// 宽度
 | ||||||
| 		int		height;	// 高度
 | 		int		height;	// 高度
 | ||||||
| 		LPCWSTR	icon;	// 图标
 | 		LPCWSTR	icon;	// 图标
 | ||||||
|  | @ -100,13 +100,6 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		void Update(); | 		void Update(); | ||||||
| 
 | 
 | ||||||
| 		bool HandleMessage( |  | ||||||
| 			HWND hwnd, |  | ||||||
| 			UINT msg, |  | ||||||
| 			WPARAM wparam, |  | ||||||
| 			LPARAM lparam |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		void Dispatch( | 		void Dispatch( | ||||||
| 			Event* event | 			Event* event | ||||||
| 		); | 		); | ||||||
|  |  | ||||||
|  | @ -324,14 +324,14 @@ namespace easy2d | ||||||
| 			current_sink_->AddLine(point); | 			current_sink_->AddLine(point); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void PathGeometry::AddLines(std::vector<Point> const& points) | 	void PathGeometry::AddLines(Array<Point> const& points) | ||||||
| 	{ | 	{ | ||||||
| 		if (current_sink_) | 		if (current_sink_) | ||||||
| 		{ | 		{ | ||||||
| 			if (!points.empty()) | 			if (!points.empty()) | ||||||
| 			{ | 			{ | ||||||
| 				size_t size = points.size(); | 				size_t size = points.size(); | ||||||
| 				std::vector<D2D1_POINT_2F> d2d_points(size); | 				Array<D2D1_POINT_2F> d2d_points(size); | ||||||
| 				for (size_t i = 0; i < size; ++i) | 				for (size_t i = 0; i < size; ++i) | ||||||
| 				{ | 				{ | ||||||
| 					d2d_points[i] = points[i]; | 					d2d_points[i] = points[i]; | ||||||
|  |  | ||||||
|  | @ -231,7 +231,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		// 添加多条线段
 | 		// 添加多条线段
 | ||||||
| 		void AddLines( | 		void AddLines( | ||||||
| 			std::vector<Point> const& points | 			Array<Point> const& points | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 添加一条三次方贝塞尔曲线
 | 		// 添加一条三次方贝塞尔曲线
 | ||||||
|  |  | ||||||
|  | @ -45,19 +45,6 @@ namespace easy2d | ||||||
| 		this->Crop(crop_rect); | 		this->Crop(crop_rect); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Image::Image(std::wstring const& file_name) |  | ||||||
| 		: Image() |  | ||||||
| 	{ |  | ||||||
| 		this->Load(file_name); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	Image::Image(std::wstring const& file_name, const Rect & crop_rect) |  | ||||||
| 		: Image() |  | ||||||
| 	{ |  | ||||||
| 		this->Load(file_name); |  | ||||||
| 		this->Crop(crop_rect); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	Image::Image(CpBitmap const & bitmap) | 	Image::Image(CpBitmap const & bitmap) | ||||||
| 		: Image() | 		: Image() | ||||||
| 	{ | 	{ | ||||||
|  | @ -70,35 +57,32 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 	bool Image::Load(Resource const& res) | 	bool Image::Load(Resource const& res) | ||||||
| 	{ | 	{ | ||||||
|  | 		HRESULT hr = S_OK; | ||||||
| 		CpBitmap bitmap; | 		CpBitmap bitmap; | ||||||
| 		HRESULT hr = Graphics::Instance()->CreateBitmapFromResource(bitmap, res); |  | ||||||
| 		if (FAILED(hr)) |  | ||||||
| 		{ |  | ||||||
| 			logs::Errorln(hr, "Load Image from resource failed!"); |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 		SetBitmap(bitmap); |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	bool Image::Load(std::wstring const& file_name) | 		if (res.IsFile()) | ||||||
| 		{ | 		{ | ||||||
| 			File image_file; | 			File image_file; | ||||||
| 		if (!image_file.Open(file_name)) | 			if (!image_file.Open(res.GetFileName())) | ||||||
| 			{ | 			{ | ||||||
| 			logs::Warningln("Image file '%s' not found!", StringWideCharToMultiByte(file_name).c_str()); | 				logs::Warningln("Image file '%s' not found!", StringWideCharToMultiByte(res.GetFileName()).c_str()); | ||||||
| 				return false; | 				return false; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			// 用户输入的路径不一定是完整路径,因为用户可能通过 File::AddSearchPath 添加
 | 			// 用户输入的路径不一定是完整路径,因为用户可能通过 File::AddSearchPath 添加
 | ||||||
| 			// 默认搜索路径,所以需要通过 File::GetPath 获取完整路径
 | 			// 默认搜索路径,所以需要通过 File::GetPath 获取完整路径
 | ||||||
| 		std::wstring image_file_path = image_file.GetPath(); | 			String image_file_path = image_file.GetPath(); | ||||||
|  | 
 | ||||||
|  | 			hr = Graphics::Instance()->CreateBitmapFromFile(bitmap, image_file_path); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			hr = Graphics::Instance()->CreateBitmapFromResource(bitmap, res); | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		CpBitmap bitmap; |  | ||||||
| 		HRESULT hr = Graphics::Instance()->CreateBitmapFromFile(bitmap, image_file_path); |  | ||||||
| 		if (FAILED(hr)) | 		if (FAILED(hr)) | ||||||
| 		{ | 		{ | ||||||
| 			logs::Errorln(hr, "Load Image from file failed!"); | 			logs::Errorln(hr, "Load image file failed!"); | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -40,15 +40,6 @@ namespace easy2d | ||||||
| 			Rect const& crop_rect	/* 裁剪矩形 */ | 			Rect const& crop_rect	/* 裁剪矩形 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		explicit Image( |  | ||||||
| 			std::wstring const& file_name |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		explicit Image( |  | ||||||
| 			std::wstring const& file_name, |  | ||||||
| 			Rect const& crop_rect	/* ²Ã¼ô¾ØÐÎ */ |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		explicit Image( | 		explicit Image( | ||||||
| 			CpBitmap const& bitmap | 			CpBitmap const& bitmap | ||||||
| 		); | 		); | ||||||
|  | @ -60,11 +51,6 @@ namespace easy2d | ||||||
| 			Resource const& res | 			Resource const& res | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// ¼ÓÔØÍ¼Æ¬×ÊÔ´
 |  | ||||||
| 		bool Load( |  | ||||||
| 			std::wstring const& file_name |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		// 将图片裁剪为矩形
 | 		// 将图片裁剪为矩形
 | ||||||
| 		void Crop( | 		void Crop( | ||||||
| 			Rect const& crop_rect	/* 裁剪矩形 */ | 			Rect const& crop_rect	/* 裁剪矩形 */ | ||||||
|  |  | ||||||
|  | @ -37,22 +37,8 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Music::Music(std::wstring const& file_path) |  | ||||||
| 		: opened_(false) |  | ||||||
| 		, playing_(false) |  | ||||||
| 		, wave_data_(nullptr) |  | ||||||
| 		, size_(0) |  | ||||||
| 		, voice_(nullptr) |  | ||||||
| 	{ |  | ||||||
| 		Load(file_path); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	Music::Music(Resource const& res) | 	Music::Music(Resource const& res) | ||||||
| 		: opened_(false) | 		: Music() | ||||||
| 		, playing_(false) |  | ||||||
| 		, wave_data_(nullptr) |  | ||||||
| 		, size_(0) |  | ||||||
| 		, voice_(nullptr) |  | ||||||
| 	{ | 	{ | ||||||
| 		Load(res); | 		Load(res); | ||||||
| 	} | 	} | ||||||
|  | @ -62,48 +48,6 @@ namespace easy2d | ||||||
| 		Close(); | 		Close(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool Music::Load(std::wstring const& file_path) |  | ||||||
| 	{ |  | ||||||
| 		if (opened_) |  | ||||||
| 		{ |  | ||||||
| 			Close(); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		File music_file; |  | ||||||
| 		if (!music_file.Open(file_path)) |  | ||||||
| 		{ |  | ||||||
| 			logs::Warningln("Media file '%s' not found", StringWideCharToMultiByte(file_path).c_str()); |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// 用户输入的路径不一定是完整路径,因为用户可能通过 File::AddSearchPath 添加
 |  | ||||||
| 		// 默认搜索路径,所以需要通过 File::GetPath 获取完整路径
 |  | ||||||
| 		std::wstring music_file_path = music_file.GetPath(); |  | ||||||
| 
 |  | ||||||
| 		Transcoder transcoder; |  | ||||||
| 		HRESULT hr = transcoder.LoadMediaFile(music_file_path.c_str(), &wave_data_, &size_); |  | ||||||
| 		if (FAILED(hr)) |  | ||||||
| 		{ |  | ||||||
| 			logs::Errorln(hr, "Load media from file failed"); |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		hr = Audio::Instance()->CreateVoice(voice_, transcoder.GetWaveFormatEx()); |  | ||||||
| 		if (FAILED(hr)) |  | ||||||
| 		{ |  | ||||||
| 			if (wave_data_) |  | ||||||
| 			{ |  | ||||||
| 				delete[] wave_data_; |  | ||||||
| 				wave_data_ = nullptr; |  | ||||||
| 			} |  | ||||||
| 			logs::Errorln(hr, "Create source voice failed"); |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		opened_ = true; |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	bool Music::Load(Resource const& res) | 	bool Music::Load(Resource const& res) | ||||||
| 	{ | 	{ | ||||||
| 		if (opened_) | 		if (opened_) | ||||||
|  | @ -111,12 +55,31 @@ namespace easy2d | ||||||
| 			Close(); | 			Close(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		HRESULT hr = S_OK; | ||||||
| 		Transcoder transcoder; | 		Transcoder transcoder; | ||||||
| 		HRESULT hr = transcoder.LoadMediaResource(res, &wave_data_, &size_); | 
 | ||||||
|  | 		if (res.IsFile()) | ||||||
|  | 		{ | ||||||
|  | 			File music_file; | ||||||
|  | 			if (!music_file.Open(res.GetFileName())) | ||||||
|  | 			{ | ||||||
|  | 				logs::Warningln("Media file '%s' not found", StringWideCharToMultiByte(res.GetFileName()).c_str()); | ||||||
|  | 				return false; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// 用户输入的路径不一定是完整路径,因为用户可能通过 File::AddSearchPath 添加
 | ||||||
|  | 			// 默认搜索路径,所以需要通过 File::GetPath 获取完整路径
 | ||||||
|  | 			String music_file_path = music_file.GetPath(); | ||||||
|  | 			HRESULT hr = transcoder.LoadMediaFile(music_file_path.c_str(), &wave_data_, &size_); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			hr = transcoder.LoadMediaResource(res, &wave_data_, &size_); | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		if (FAILED(hr)) | 		if (FAILED(hr)) | ||||||
| 		{ | 		{ | ||||||
| 			logs::Errorln(hr, "Load media from resource failed"); | 			logs::Errorln(hr, "Load media file failed"); | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -32,21 +32,12 @@ namespace easy2d | ||||||
| 	public: | 	public: | ||||||
| 		Music(); | 		Music(); | ||||||
| 
 | 
 | ||||||
| 		Music( |  | ||||||
| 			std::wstring const& file_path	/* 音乐文件路径 */ |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		Music( | 		Music( | ||||||
| 			Resource const& res		/* 稜있栗都 */ | 			Resource const& res		/* 稜있栗都 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		virtual ~Music(); | 		virtual ~Music(); | ||||||
| 
 | 
 | ||||||
| 		// 打开音乐文件
 |  | ||||||
| 		bool Load( |  | ||||||
| 			std::wstring const& file_path	/* 音乐文件路径 */ |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		// 댔역稜있栗都
 | 		// 댔역稜있栗都
 | ||||||
| 		bool Load( | 		bool Load( | ||||||
| 			Resource const& res		/* 稜있栗都 */ | 			Resource const& res		/* 稜있栗都 */ | ||||||
|  |  | ||||||
|  | @ -346,12 +346,12 @@ namespace easy2d | ||||||
| 		visible_ = val; | 		visible_ = val; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void Node::SetName(std::wstring const& name) | 	void Node::SetName(String const& name) | ||||||
| 	{ | 	{ | ||||||
| 		if (name_ != name) | 		if (name_ != name) | ||||||
| 		{ | 		{ | ||||||
| 			name_ = name; | 			name_ = name; | ||||||
| 			hash_name_ = std::hash<std::wstring>{}(name); | 			hash_name_ = std::hash<String>{}(name); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -470,7 +470,7 @@ namespace easy2d | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void Node::AddChildren(const Nodes& children) | 	void Node::AddChildren(Array<SpNode> const& children) | ||||||
| 	{ | 	{ | ||||||
| 		for (const auto& node : children) | 		for (const auto& node : children) | ||||||
| 		{ | 		{ | ||||||
|  | @ -483,10 +483,10 @@ namespace easy2d | ||||||
| 		return Rect(Point{}, size_); | 		return Rect(Point{}, size_); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Node::Nodes Node::GetChildren(std::wstring const& name) const | 	Array<SpNode> Node::GetChildren(String const& name) const | ||||||
| 	{ | 	{ | ||||||
| 		Nodes children; | 		Array<SpNode> children; | ||||||
| 		size_t hash_code = std::hash<std::wstring>{}(name); | 		size_t hash_code = std::hash<String>{}(name); | ||||||
| 
 | 
 | ||||||
| 		for (Node* child = children_.First().Get(); child; child = child->NextItem().Get()) | 		for (Node* child = children_.First().Get(); child; child = child->NextItem().Get()) | ||||||
| 		{ | 		{ | ||||||
|  | @ -498,9 +498,9 @@ namespace easy2d | ||||||
| 		return children; | 		return children; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	SpNode Node::GetChild(std::wstring const& name) const | 	SpNode Node::GetChild(String const& name) const | ||||||
| 	{ | 	{ | ||||||
| 		size_t hash_code = std::hash<std::wstring>{}(name); | 		size_t hash_code = std::hash<String>{}(name); | ||||||
| 
 | 
 | ||||||
| 		for (Node* child = children_.First().Get(); child; child = child->NextItem().Get()) | 		for (Node* child = children_.First().Get(); child; child = child->NextItem().Get()) | ||||||
| 		{ | 		{ | ||||||
|  | @ -547,14 +547,14 @@ namespace easy2d | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void Node::RemoveChildren(std::wstring const& child_name) | 	void Node::RemoveChildren(String const& child_name) | ||||||
| 	{ | 	{ | ||||||
| 		if (children_.IsEmpty()) | 		if (children_.IsEmpty()) | ||||||
| 		{ | 		{ | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		size_t hash_code = std::hash<std::wstring>{}(child_name); | 		size_t hash_code = std::hash<String>{}(child_name); | ||||||
| 
 | 
 | ||||||
| 		Node* next; | 		Node* next; | ||||||
| 		for (Node* child = children_.First().Get(); child; child = next) | 		for (Node* child = children_.First().Get(); child; child = next) | ||||||
|  |  | ||||||
|  | @ -44,7 +44,6 @@ namespace easy2d | ||||||
| 		friend class Transition; | 		friend class Transition; | ||||||
| 		friend class intrusive::List<SpNode>; | 		friend class intrusive::List<SpNode>; | ||||||
| 
 | 
 | ||||||
| 		using Nodes = std::vector<SpNode>; |  | ||||||
| 		using Children = intrusive::List<SpNode>; | 		using Children = intrusive::List<SpNode>; | ||||||
| 
 | 
 | ||||||
| 	public: | 	public: | ||||||
|  | @ -60,7 +59,7 @@ namespace easy2d | ||||||
| 		bool IsVisible()				const	{ return visible_; } | 		bool IsVisible()				const	{ return visible_; } | ||||||
| 
 | 
 | ||||||
| 		// 获取名称
 | 		// 获取名称
 | ||||||
| 		std::wstring const& GetName()	const	{ return name_; } | 		String const& GetName()	const	{ return name_; } | ||||||
| 
 | 
 | ||||||
| 		// 获取名称的 Hash 值
 | 		// 获取名称的 Hash 值
 | ||||||
| 		size_t GetHashName()			const	{ return hash_name_; } | 		size_t GetHashName()			const	{ return hash_name_; } | ||||||
|  | @ -144,7 +143,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		// 设置名称
 | 		// 设置名称
 | ||||||
| 		void SetName( | 		void SetName( | ||||||
| 			std::wstring const& name | 			String const& name | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 设置横坐标
 | 		// 设置横坐标
 | ||||||
|  | @ -297,17 +296,17 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		// 添加多个子节点
 | 		// 添加多个子节点
 | ||||||
| 		void AddChildren( | 		void AddChildren( | ||||||
| 			const Nodes& children | 			Array<SpNode> const& children | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 获取所有名称相同的子节点
 | 		// 获取所有名称相同的子节点
 | ||||||
| 		Nodes GetChildren( | 		Array<SpNode> GetChildren( | ||||||
| 			std::wstring const& name | 			String const& name | ||||||
| 		) const; | 		) const; | ||||||
| 
 | 
 | ||||||
| 		// 获取名称相同的子节点
 | 		// 获取名称相同的子节点
 | ||||||
| 		SpNode GetChild( | 		SpNode GetChild( | ||||||
| 			std::wstring const& name | 			String const& name | ||||||
| 		) const; | 		) const; | ||||||
| 
 | 
 | ||||||
| 		// 获取全部子节点
 | 		// 获取全部子节点
 | ||||||
|  | @ -325,7 +324,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		// 移除所有名称相同的子节点
 | 		// 移除所有名称相同的子节点
 | ||||||
| 		void RemoveChildren( | 		void RemoveChildren( | ||||||
| 			std::wstring const& child_name | 			String const& child_name | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 移除所有节点
 | 		// 移除所有节点
 | ||||||
|  | @ -360,7 +359,7 @@ namespace easy2d | ||||||
| 		int			z_order_; | 		int			z_order_; | ||||||
| 		float		opacity_; | 		float		opacity_; | ||||||
| 		float		display_opacity_; | 		float		display_opacity_; | ||||||
| 		std::wstring name_; | 		String		name_; | ||||||
| 		size_t		hash_name_; | 		size_t		hash_name_; | ||||||
| 		Transform	transform_; | 		Transform	transform_; | ||||||
| 		Point		pivot_; | 		Point		pivot_; | ||||||
|  |  | ||||||
|  | @ -25,7 +25,7 @@ namespace easy2d | ||||||
| 	namespace | 	namespace | ||||||
| 	{ | 	{ | ||||||
| 		bool tracing_leaks = true; | 		bool tracing_leaks = true; | ||||||
| 		std::vector<Object*> tracing_objects; | 		Array<Object*> tracing_objects; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Object::Object() | 	Object::Object() | ||||||
|  | @ -67,7 +67,7 @@ namespace easy2d | ||||||
| 		tracing_leaks = false; | 		tracing_leaks = false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::vector<Object*> const& easy2d::Object::__GetTracingObjects() | 	Array<Object*> const& easy2d::Object::__GetTracingObjects() | ||||||
| 	{ | 	{ | ||||||
| 		return tracing_objects; | 		return tracing_objects; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -20,7 +20,7 @@ | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
| #include "RefCounter.hpp" | #include "RefCounter.hpp" | ||||||
| #include <vector> | #include "helper.hpp" | ||||||
| 
 | 
 | ||||||
| namespace easy2d | namespace easy2d | ||||||
| { | { | ||||||
|  | @ -40,7 +40,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		static void StopTracingLeaks(); | 		static void StopTracingLeaks(); | ||||||
| 
 | 
 | ||||||
| 		static std::vector<Object*> const& __GetTracingObjects(); | 		static Array<Object*> const& __GetTracingObjects(); | ||||||
| 
 | 
 | ||||||
| 	protected: | 	protected: | ||||||
| 		static void __AddObjectToTracingList(Object*); | 		static void __AddObjectToTracingList(Object*); | ||||||
|  |  | ||||||
|  | @ -23,36 +23,45 @@ | ||||||
| 
 | 
 | ||||||
| namespace easy2d | namespace easy2d | ||||||
| { | { | ||||||
|  | 	Resource::Resource(String file_name) | ||||||
|  | 		: type_(Type::File) | ||||||
|  | 		, file_name_(file_name) | ||||||
|  | 	{ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	Resource::Resource(LPCWSTR file_name) | ||||||
|  | 		: type_(Type::File) | ||||||
|  | 		, file_name_(file_name) | ||||||
|  | 	{ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	Resource::Resource(LPCWSTR name, LPCWSTR type) | 	Resource::Resource(LPCWSTR name, LPCWSTR type) | ||||||
| 		: name_(name) | 		: type_(Type::Binary) | ||||||
| 		, type_(type) | 		, bin_name_(name) | ||||||
|  | 		, bin_type_(type) | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	LPCWSTR Resource::GetName() const | 	Resource::~Resource() | ||||||
| 	{ | 	{ | ||||||
| 		return name_; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	LPCWSTR Resource::GetType() const |  | ||||||
| 	{ |  | ||||||
| 		return type_; |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	size_t Resource::GetHashCode() const | 	size_t Resource::GetHashCode() const | ||||||
| 	{ | 	{ | ||||||
| 		return std::hash<LPCWSTR>{}(name_); | 		if (type_ == Type::File) | ||||||
|  | 			return std::hash<String>{}(file_name_); | ||||||
|  | 		return std::hash<LPCWSTR>{}(bin_name_); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool Resource::Load(ResourceData* buffer) const | 	bool Resource::Load(LPVOID& buffer, DWORD& buffer_size) const | ||||||
| 	{ | 	{ | ||||||
| 		if (!buffer) | 		if (type_ != Type::Binary) | ||||||
| 			return false; | 			return false; | ||||||
| 
 | 
 | ||||||
| 		HGLOBAL res_data; | 		HGLOBAL res_data; | ||||||
| 		HRSRC res_info; | 		HRSRC res_info; | ||||||
| 
 | 
 | ||||||
| 		res_info = FindResourceW(nullptr, name_, type_); | 		res_info = FindResourceW(nullptr, bin_name_, bin_type_); | ||||||
| 		if (res_info == nullptr) | 		if (res_info == nullptr) | ||||||
| 		{ | 		{ | ||||||
| 			logs::Errorln("FindResource"); | 			logs::Errorln("FindResource"); | ||||||
|  | @ -66,15 +75,15 @@ namespace easy2d | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		(*buffer).buffer_size = SizeofResource(nullptr, res_info); | 		buffer_size = SizeofResource(nullptr, res_info); | ||||||
| 		if ((*buffer).buffer_size == 0) | 		if (buffer_size == 0) | ||||||
| 		{ | 		{ | ||||||
| 			logs::Errorln("SizeofResource"); | 			logs::Errorln("SizeofResource"); | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		(*buffer).buffer = LockResource(res_data); | 		buffer = LockResource(res_data); | ||||||
| 		if ((*buffer).buffer == nullptr) | 		if (buffer == nullptr) | ||||||
| 		{ | 		{ | ||||||
| 			logs::Errorln("LockResource"); | 			logs::Errorln("LockResource"); | ||||||
| 			return false; | 			return false; | ||||||
|  |  | ||||||
|  | @ -19,32 +19,15 @@ | ||||||
| // THE SOFTWARE.
 | // THE SOFTWARE.
 | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
| #include "macros.h" | #include "helper.hpp" | ||||||
| 
 | 
 | ||||||
| namespace easy2d | namespace easy2d | ||||||
| { | { | ||||||
| 	// 资源数据
 |  | ||||||
| 	// 
 |  | ||||||
| 	// Usage:
 |  | ||||||
| 	//     如果需要手动加载资源, 可以通过 Resource::Load 方法获取资源内容
 |  | ||||||
| 	//     ResourceData data;
 |  | ||||||
| 	//     if (res.Load(&data)) {
 |  | ||||||
| 	//         LPVOID data = data.buffer;
 |  | ||||||
| 	//         DWORD size_ = data.buffer_size;
 |  | ||||||
| 	//     }
 |  | ||||||
| 	//
 |  | ||||||
| 	struct ResourceData |  | ||||||
| 	{ |  | ||||||
| 		LPVOID buffer; |  | ||||||
| 		DWORD buffer_size; |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 	// 资源
 | 	// 资源
 | ||||||
| 	// 
 | 	// 
 | ||||||
| 	// Usage:
 | 	// Usage:
 | ||||||
| 	//     Resource 用于获取可执行文件 (exe) 中的资源, 必须在构造函数中指定它的
 | 	//     Resource 用于指定一份资源
 | ||||||
| 	//     资源类型和名称标识符。
 | 	//     资源可以是文件类型,也可以是保存在 exe 中的二进制文件
 | ||||||
| 	//     例如, 一份音频资源的类型为 L"WAVE", 名称标识符为 IDR_WAVE_1,
 | 	//     例如, 一份音频资源的类型为 L"WAVE", 名称标识符为 IDR_WAVE_1,
 | ||||||
| 	//     那么可以这样指定该资源: Resource res(MAKEINTRESOURCE(IDR_WAVE_1), L"WAVE");
 | 	//     那么可以这样指定该资源: Resource res(MAKEINTRESOURCE(IDR_WAVE_1), L"WAVE");
 | ||||||
| 	// 
 | 	// 
 | ||||||
|  | @ -53,23 +36,50 @@ namespace easy2d | ||||||
| 	class Resource | 	class Resource | ||||||
| 	{ | 	{ | ||||||
| 	public: | 	public: | ||||||
|  | 		enum class Type { File, Binary }; | ||||||
|  | 
 | ||||||
|  | 		Resource( | ||||||
|  | 			String file_name	/* 文件路径 */ | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		Resource( | ||||||
|  | 			LPCWSTR file_name	/* 文件路径 */ | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
| 		Resource( | 		Resource( | ||||||
| 			LPCWSTR name,		/* 资源名称 */ | 			LPCWSTR name,		/* 资源名称 */ | ||||||
| 			LPCWSTR type		/* 资源类型 */ | 			LPCWSTR type		/* 资源类型 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
|  | 		virtual ~Resource(); | ||||||
|  | 
 | ||||||
|  | 		inline bool IsFile() const { return type_ == Type::File; } | ||||||
|  | 
 | ||||||
|  | 		inline Type GetType() const { return type_; } | ||||||
|  | 
 | ||||||
|  | 		inline String const& GetFileName() const { return file_name_; } | ||||||
|  | 
 | ||||||
| 		bool Load( | 		bool Load( | ||||||
| 			ResourceData* buffer | 			LPVOID& buffer, | ||||||
|  | 			DWORD& buffer_size | ||||||
| 		) const; | 		) const; | ||||||
| 
 | 
 | ||||||
| 		LPCWSTR	GetName() const; |  | ||||||
| 
 |  | ||||||
| 		LPCWSTR	GetType() const; |  | ||||||
| 
 |  | ||||||
| 		size_t GetHashCode() const; | 		size_t GetHashCode() const; | ||||||
| 
 | 
 | ||||||
| 	private: | 	private: | ||||||
| 		LPCWSTR	name_; | 		Type type_; | ||||||
| 		LPCWSTR	type_; | 		union | ||||||
|  | 		{ | ||||||
|  | 			struct | ||||||
|  | 			{ | ||||||
|  | 				String	file_name_; | ||||||
|  | 			}; | ||||||
|  | 
 | ||||||
|  | 			struct | ||||||
|  | 			{ | ||||||
|  | 				LPCWSTR	bin_name_; | ||||||
|  | 				LPCWSTR	bin_type_; | ||||||
|  | 			}; | ||||||
|  | 		}; | ||||||
| 	}; | 	}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -47,19 +47,6 @@ namespace easy2d | ||||||
| 		Crop(crop_rect); | 		Crop(crop_rect); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Sprite::Sprite(std::wstring const& file_name) |  | ||||||
| 		: image_(nullptr) |  | ||||||
| 	{ |  | ||||||
| 		Load(file_name); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	Sprite::Sprite(std::wstring const& file_name, const Rect & crop_rect) |  | ||||||
| 		: image_(nullptr) |  | ||||||
| 	{ |  | ||||||
| 		Load(file_name); |  | ||||||
| 		Crop(crop_rect); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	Sprite::~Sprite() | 	Sprite::~Sprite() | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
|  | @ -94,24 +81,6 @@ namespace easy2d | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool Sprite::Load(std::wstring const& file_name) |  | ||||||
| 	{ |  | ||||||
| 		if (!image_) |  | ||||||
| 		{ |  | ||||||
| 			image_ = new (std::nothrow) Image; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if (image_) |  | ||||||
| 		{ |  | ||||||
| 			if (image_->Load(file_name)) |  | ||||||
| 			{ |  | ||||||
| 				Node::SetSize(image_->GetWidth(), image_->GetHeight()); |  | ||||||
| 				return true; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		return false; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	void Sprite::Crop(const Rect& crop_rect) | 	void Sprite::Crop(const Rect& crop_rect) | ||||||
| 	{ | 	{ | ||||||
| 		image_->Crop(crop_rect); | 		image_->Crop(crop_rect); | ||||||
|  |  | ||||||
|  | @ -44,15 +44,6 @@ namespace easy2d | ||||||
| 			const Rect& crop_rect	/* 裁剪矩形 */ | 			const Rect& crop_rect	/* 裁剪矩形 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		explicit Sprite( |  | ||||||
| 			std::wstring const& file_name |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		explicit Sprite( |  | ||||||
| 			std::wstring const& file_name, |  | ||||||
| 			const Rect& crop_rect	/* 裁剪矩形 */ |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		virtual ~Sprite(); | 		virtual ~Sprite(); | ||||||
| 
 | 
 | ||||||
| 		// 加载图片文件
 | 		// 加载图片文件
 | ||||||
|  | @ -60,11 +51,6 @@ namespace easy2d | ||||||
| 			Resource const& res | 			Resource const& res | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 加载图片文件
 |  | ||||||
| 		bool Load( |  | ||||||
| 			std::wstring const& file_name |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		// 加载图片
 | 		// 加载图片
 | ||||||
| 		bool Load( | 		bool Load( | ||||||
| 			SpImage const& image | 			SpImage const& image | ||||||
|  |  | ||||||
|  | @ -22,12 +22,12 @@ | ||||||
| 
 | 
 | ||||||
| namespace easy2d | namespace easy2d | ||||||
| { | { | ||||||
| 	Task::Task(Callback const& func, std::wstring const& name) | 	Task::Task(Callback const& func, String const& name) | ||||||
| 		: Task(func, Duration{}, -1, name) | 		: Task(func, Duration{}, -1, name) | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Task::Task(Callback const& func, Duration const& delay, int times, std::wstring const& name) | 	Task::Task(Callback const& func, Duration const& delay, int times, String const& name) | ||||||
| 		: running_(true) | 		: running_(true) | ||||||
| 		, run_times_(0) | 		, run_times_(0) | ||||||
| 		, total_times_(times) | 		, total_times_(times) | ||||||
|  | @ -91,7 +91,7 @@ namespace easy2d | ||||||
| 		return running_; | 		return running_; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::wstring const& Task::GetName() const | 	String const& Task::GetName() const | ||||||
| 	{ | 	{ | ||||||
| 		return name_; | 		return name_; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -41,14 +41,14 @@ namespace easy2d | ||||||
| 	public: | 	public: | ||||||
| 		explicit Task( | 		explicit Task( | ||||||
| 			Callback const& func,			/* 执行函数 */ | 			Callback const& func,			/* 执行函数 */ | ||||||
| 			std::wstring const& name = L""	/* ÈÎÎñÃû³Æ */ | 			String const& name = L""	/* ÈÎÎñÃû³Æ */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		explicit Task( | 		explicit Task( | ||||||
| 			Callback const& func,			/* 执行函数 */ | 			Callback const& func,			/* 执行函数 */ | ||||||
| 			Duration const& delay,			/* 时间间隔(秒) */ | 			Duration const& delay,			/* 时间间隔(秒) */ | ||||||
| 			int times = -1,					/* 执行次数(设 -1 为永久执行) */ | 			int times = -1,					/* 执行次数(设 -1 为永久执行) */ | ||||||
| 			std::wstring const& name = L""	/* ÈÎÎñÃû³Æ */ | 			String const& name = L""	/* ÈÎÎñÃû³Æ */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 启动任务
 | 		// 启动任务
 | ||||||
|  | @ -61,7 +61,7 @@ namespace easy2d | ||||||
| 		bool IsRunning() const; | 		bool IsRunning() const; | ||||||
| 
 | 
 | ||||||
| 		// 获取任务名称
 | 		// 获取任务名称
 | ||||||
| 		std::wstring const& GetName() const; | 		String const& GetName() const; | ||||||
| 
 | 
 | ||||||
| 	protected: | 	protected: | ||||||
| 		void Update(Duration const& dt, bool& remove_after_update); | 		void Update(Duration const& dt, bool& remove_after_update); | ||||||
|  | @ -72,7 +72,7 @@ namespace easy2d | ||||||
| 		bool			running_; | 		bool			running_; | ||||||
| 		int				run_times_; | 		int				run_times_; | ||||||
| 		int				total_times_; | 		int				total_times_; | ||||||
| 		std::wstring	name_; | 		String	name_; | ||||||
| 		Duration		delay_; | 		Duration		delay_; | ||||||
| 		Duration		delta_; | 		Duration		delta_; | ||||||
| 		Callback		callback_; | 		Callback		callback_; | ||||||
|  |  | ||||||
|  | @ -52,7 +52,7 @@ namespace easy2d | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void TaskManager::StopTasks(std::wstring const& name) | 	void TaskManager::StopTasks(String const& name) | ||||||
| 	{ | 	{ | ||||||
| 		if (tasks_.IsEmpty()) | 		if (tasks_.IsEmpty()) | ||||||
| 			return; | 			return; | ||||||
|  | @ -66,7 +66,7 @@ namespace easy2d | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void TaskManager::StartTasks(std::wstring const& name) | 	void TaskManager::StartTasks(String const& name) | ||||||
| 	{ | 	{ | ||||||
| 		if (tasks_.IsEmpty()) | 		if (tasks_.IsEmpty()) | ||||||
| 			return; | 			return; | ||||||
|  | @ -80,7 +80,7 @@ namespace easy2d | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void TaskManager::RemoveTasks(std::wstring const& name) | 	void TaskManager::RemoveTasks(String const& name) | ||||||
| 	{ | 	{ | ||||||
| 		if (tasks_.IsEmpty()) | 		if (tasks_.IsEmpty()) | ||||||
| 			return; | 			return; | ||||||
|  |  | ||||||
|  | @ -35,17 +35,17 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		// 启动任务
 | 		// 启动任务
 | ||||||
| 		void StartTasks( | 		void StartTasks( | ||||||
| 			std::wstring const& task_name | 			String const& task_name | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 停止任务
 | 		// 停止任务
 | ||||||
| 		void StopTasks( | 		void StopTasks( | ||||||
| 			std::wstring const& task_name | 			String const& task_name | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 移除任务
 | 		// 移除任务
 | ||||||
| 		void RemoveTasks( | 		void RemoveTasks( | ||||||
| 			std::wstring const& task_name | 			String const& task_name | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 启动所有任务
 | 		// 启动所有任务
 | ||||||
|  |  | ||||||
|  | @ -48,22 +48,22 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Text::Text(std::wstring const& text) | 	Text::Text(String const& text) | ||||||
| 		: Text(text, text_default_font, text_default_style) | 		: Text(text, text_default_font, text_default_style) | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Text::Text(std::wstring const& text, const Font & font) | 	Text::Text(String const& text, const Font & font) | ||||||
| 		: Text(text, font, text_default_style) | 		: Text(text, font, text_default_style) | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Text::Text(std::wstring const& text, const TextStyle & style) | 	Text::Text(String const& text, const TextStyle & style) | ||||||
| 		: Text(text, text_default_font, style) | 		: Text(text, text_default_font, style) | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Text::Text(std::wstring const& text, const Font & font, const TextStyle & style) | 	Text::Text(String const& text, const Font & font, const TextStyle & style) | ||||||
| 		: font_(font) | 		: font_(font) | ||||||
| 		, style_(style) | 		, style_(style) | ||||||
| 		, text_(text) | 		, text_(text) | ||||||
|  | @ -75,7 +75,7 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::wstring const& Text::GetText() const | 	String const& Text::GetText() const | ||||||
| 	{ | 	{ | ||||||
| 		return text_; | 		return text_; | ||||||
| 	} | 	} | ||||||
|  | @ -90,7 +90,7 @@ namespace easy2d | ||||||
| 		return style_; | 		return style_; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::wstring const& Text::GetFontFamily() const | 	String const& Text::GetFontFamily() const | ||||||
| 	{ | 	{ | ||||||
| 		return font_.family; | 		return font_.family; | ||||||
| 	} | 	} | ||||||
|  | @ -158,7 +158,7 @@ namespace easy2d | ||||||
| 		return style_.outline; | 		return style_.outline; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void Text::SetText(std::wstring const& text) | 	void Text::SetText(String const& text) | ||||||
| 	{ | 	{ | ||||||
| 		text_ = text; | 		text_ = text; | ||||||
| 		UpdateLayout(); | 		UpdateLayout(); | ||||||
|  | @ -176,7 +176,7 @@ namespace easy2d | ||||||
| 		UpdateLayout(); | 		UpdateLayout(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void Text::SetFontFamily(std::wstring const& family) | 	void Text::SetFontFamily(String const& family) | ||||||
| 	{ | 	{ | ||||||
| 		if (font_.family != family) | 		if (font_.family != family) | ||||||
| 		{ | 		{ | ||||||
|  |  | ||||||
|  | @ -33,21 +33,21 @@ namespace easy2d | ||||||
| 		Text(); | 		Text(); | ||||||
| 
 | 
 | ||||||
| 		explicit Text( | 		explicit Text( | ||||||
| 			std::wstring const& text		/* 文字内容 */ | 			String const& text		/* 文字内容 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		explicit Text( | 		explicit Text( | ||||||
| 			std::wstring const& text,		/* 文字内容 */ | 			String const& text,		/* 文字内容 */ | ||||||
| 			const Font& font		/* 字体 */ | 			const Font& font		/* 字体 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		explicit Text( | 		explicit Text( | ||||||
| 			std::wstring const& text,		/* 文字内容 */ | 			String const& text,		/* 文字内容 */ | ||||||
| 			const TextStyle& style	/* 文本样式 */ | 			const TextStyle& style	/* 文本样式 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		explicit Text( | 		explicit Text( | ||||||
| 			std::wstring const& text,		/* 文字内容 */ | 			String const& text,		/* 文字内容 */ | ||||||
| 			const Font& font,		/* 字体 */ | 			const Font& font,		/* 字体 */ | ||||||
| 			const TextStyle& style	/* 文本样式 */ | 			const TextStyle& style	/* 文本样式 */ | ||||||
| 		); | 		); | ||||||
|  | @ -55,7 +55,7 @@ namespace easy2d | ||||||
| 		virtual ~Text(); | 		virtual ~Text(); | ||||||
| 
 | 
 | ||||||
| 		// 获取文本
 | 		// 获取文本
 | ||||||
| 		std::wstring const& GetText() const; | 		String const& GetText() const; | ||||||
| 
 | 
 | ||||||
| 		// 获取字体
 | 		// 获取字体
 | ||||||
| 		const Font& GetFont() const; | 		const Font& GetFont() const; | ||||||
|  | @ -64,7 +64,7 @@ namespace easy2d | ||||||
| 		const TextStyle& GetStyle() const; | 		const TextStyle& GetStyle() const; | ||||||
| 
 | 
 | ||||||
| 		// 获取字体族
 | 		// 获取字体族
 | ||||||
| 		std::wstring const& GetFontFamily() const; | 		String const& GetFontFamily() const; | ||||||
| 
 | 
 | ||||||
| 		// 获取当前字号
 | 		// 获取当前字号
 | ||||||
| 		float GetFontSize() const; | 		float GetFontSize() const; | ||||||
|  | @ -101,7 +101,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		// 设置文本
 | 		// 设置文本
 | ||||||
| 		void SetText( | 		void SetText( | ||||||
| 			std::wstring const& text | 			String const& text | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 设置文本样式
 | 		// 设置文本样式
 | ||||||
|  | @ -116,7 +116,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		// 设置字体族
 | 		// 设置字体族
 | ||||||
| 		void SetFontFamily( | 		void SetFontFamily( | ||||||
| 			std::wstring const& family | 			String const& family | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 设置字号(默认值为 22)
 | 		// 设置字号(默认值为 22)
 | ||||||
|  | @ -205,7 +205,7 @@ namespace easy2d | ||||||
| 		void UpdateLayout(); | 		void UpdateLayout(); | ||||||
| 
 | 
 | ||||||
| 	protected: | 	protected: | ||||||
| 		std::wstring			text_; | 		String			text_; | ||||||
| 		Font			font_; | 		Font			font_; | ||||||
| 		TextStyle		style_; | 		TextStyle		style_; | ||||||
| 		CpTextFormat	text_format_; | 		CpTextFormat	text_format_; | ||||||
|  |  | ||||||
|  | @ -20,10 +20,10 @@ | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
| #include "macros.h" | #include "macros.h" | ||||||
|  | #include "helper.hpp" | ||||||
| #include "Singleton.hpp" | #include "Singleton.hpp" | ||||||
| #include "noncopyable.hpp" | #include "noncopyable.hpp" | ||||||
| #include <xaudio2.h> | #include <xaudio2.h> | ||||||
| #include <unordered_set> |  | ||||||
| 
 | 
 | ||||||
| namespace easy2d | namespace easy2d | ||||||
| { | { | ||||||
|  | @ -79,7 +79,7 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 		E2D_DECLARE_SINGLETON(AudioDevice); | 		E2D_DECLARE_SINGLETON(AudioDevice); | ||||||
| 
 | 
 | ||||||
| 		using VoiceMap = std::unordered_set<Voice*>; | 		using VoiceMap = UnorderedSet<Voice*>; | ||||||
| 
 | 
 | ||||||
| 	public: | 	public: | ||||||
| 		HRESULT Init(bool debug); | 		HRESULT Init(bool debug); | ||||||
|  | @ -107,9 +107,9 @@ namespace easy2d | ||||||
| 		~AudioDevice(); | 		~AudioDevice(); | ||||||
| 
 | 
 | ||||||
| 	protected: | 	protected: | ||||||
|  | 		VoiceMap voice_cache_; | ||||||
| 		IXAudio2* x_audio2_; | 		IXAudio2* x_audio2_; | ||||||
| 		IXAudio2MasteringVoice*	mastering_voice_; | 		IXAudio2MasteringVoice*	mastering_voice_; | ||||||
| 		VoiceMap				voice_cache_; |  | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	E2D_DECLARE_SINGLETON_TYPE(AudioDevice, Audio); | 	E2D_DECLARE_SINGLETON_TYPE(AudioDevice, Audio); | ||||||
|  |  | ||||||
|  | @ -24,6 +24,12 @@ | ||||||
| #include "../math/vector.hpp" | #include "../math/vector.hpp" | ||||||
| #include "../math/Rect.hpp" | #include "../math/Rect.hpp" | ||||||
| #include "../math/Matrix.hpp" | #include "../math/Matrix.hpp" | ||||||
|  | #include <set> | ||||||
|  | #include <map> | ||||||
|  | #include <list> | ||||||
|  | #include <unordered_set> | ||||||
|  | #include <unordered_map> | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| #ifndef E2D_DECLARE_SMART_PTR | #ifndef E2D_DECLARE_SMART_PTR | ||||||
| #define E2D_DECLARE_SMART_PTR(class_name)\ | #define E2D_DECLARE_SMART_PTR(class_name)\ | ||||||
|  | @ -38,6 +44,30 @@ | ||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | namespace easy2d | ||||||
|  | { | ||||||
|  | 	using String = std::wstring; | ||||||
|  | 	using StringStream = std::wstringstream; | ||||||
|  | 
 | ||||||
|  | 	template<typename T> | ||||||
|  | 	using Array = std::vector<T>; | ||||||
|  | 
 | ||||||
|  | 	template<typename T> | ||||||
|  | 	using List = std::list<T>; | ||||||
|  | 
 | ||||||
|  | 	template<typename T> | ||||||
|  | 	using Set = std::set<T>; | ||||||
|  | 
 | ||||||
|  | 	template<typename T> | ||||||
|  | 	using UnorderedSet = std::unordered_set<T>; | ||||||
|  | 
 | ||||||
|  | 	template<typename T, typename Y> | ||||||
|  | 	using Map = std::map<T, Y>; | ||||||
|  | 
 | ||||||
|  | 	template<typename T, typename Y> | ||||||
|  | 	using UnorderedMap = std::unordered_map<T, Y>; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| namespace easy2d | namespace easy2d | ||||||
| { | { | ||||||
| 	// "Sp" is a shorthand for "Smart Pointer"
 | 	// "Sp" is a shorthand for "Smart Pointer"
 | ||||||
|  | @ -94,9 +124,29 @@ namespace easy2d | ||||||
| 	E2D_DECLARE_NS_SMART_PTR(ui, Button); | 	E2D_DECLARE_NS_SMART_PTR(ui, Button); | ||||||
| 	E2D_DECLARE_NS_SMART_PTR(ui, Menu); | 	E2D_DECLARE_NS_SMART_PTR(ui, Menu); | ||||||
| 
 | 
 | ||||||
| 	using Vector2 = math::Vector2; | 	using namespace math; | ||||||
| 	using Point = math::Vector2; | 	using namespace ui; | ||||||
| 	using Size = math::Vector2; |  | ||||||
| 	using Rect = math::Rect; |  | ||||||
| 	using Matrix = math::Matrix; |  | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | namespace easy2d | ||||||
|  | { | ||||||
|  | 	class __SmartPointerMaker | ||||||
|  | 	{ | ||||||
|  | 	public: | ||||||
|  | 		static inline __SmartPointerMaker const& Instance() | ||||||
|  | 		{ | ||||||
|  | 			static __SmartPointerMaker maker; | ||||||
|  | 			return maker; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		template<typename T> | ||||||
|  | 		inline intrusive::SmartPointer<T> operator- (T* ptr) const | ||||||
|  | 		{ | ||||||
|  | 			return intrusive::SmartPointer<T>(ptr); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #ifndef E_NEW | ||||||
|  | #	define E_NEW (::easy2d::__SmartPointerMaker::Instance()) - new (std::nothrow) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | @ -199,26 +199,4 @@ namespace easy2d | ||||||
| 		lhs.Swap(rhs); | 		lhs.Swap(rhs); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	class SmartMaker |  | ||||||
| 	{ |  | ||||||
| 	public: |  | ||||||
| 		static inline SmartMaker const& Instance() |  | ||||||
| 		{ |  | ||||||
| 			static SmartMaker maker; |  | ||||||
| 			return maker; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		template<typename T> |  | ||||||
| 		inline intrusive::SmartPointer<T> operator -(T* ptr) const |  | ||||||
| 		{ |  | ||||||
| 			return intrusive::SmartPointer<T>(ptr); |  | ||||||
| 		} |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| #ifdef NEW |  | ||||||
| #	undef NEW |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #define NEW ::easy2d::SmartMaker::Instance() - new (std::nothrow) |  | ||||||
| 
 |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -324,14 +324,14 @@ namespace easy2d | ||||||
| 		return S_OK; | 		return S_OK; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	HRESULT GraphicsDevice::CreateBitmapFromFile(CpBitmap& bitmap, std::wstring const& file_path) | 	HRESULT GraphicsDevice::CreateBitmapFromFile(CpBitmap& bitmap, String const& file_path) | ||||||
| 	{ | 	{ | ||||||
| 		if (render_target_ == nullptr) | 		if (render_target_ == nullptr) | ||||||
| 		{ | 		{ | ||||||
| 			return E_UNEXPECTED; | 			return E_UNEXPECTED; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		size_t hash_code = std::hash<std::wstring>{}(file_path); | 		size_t hash_code = std::hash<String>{}(file_path); | ||||||
| 		if (bitmap_cache_.find(hash_code) != bitmap_cache_.end()) | 		if (bitmap_cache_.find(hash_code) != bitmap_cache_.end()) | ||||||
| 		{ | 		{ | ||||||
| 			bitmap = bitmap_cache_[hash_code]; | 			bitmap = bitmap_cache_[hash_code]; | ||||||
|  |  | ||||||
|  | @ -43,7 +43,7 @@ namespace easy2d | ||||||
| 			int primitives; | 			int primitives; | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
| 		using BitmapMap = std::unordered_map<size_t, CpBitmap>; | 		using BitmapMap = UnorderedMap<size_t, CpBitmap>; | ||||||
| 
 | 
 | ||||||
| 	public: | 	public: | ||||||
| 		HRESULT Init(HWND hwnd, bool vsync, bool debug); | 		HRESULT Init(HWND hwnd, bool vsync, bool debug); | ||||||
|  | @ -87,7 +87,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 		HRESULT CreateBitmapFromFile( | 		HRESULT CreateBitmapFromFile( | ||||||
| 			CpBitmap& bitmap, | 			CpBitmap& bitmap, | ||||||
| 			std::wstring const& file_path | 			String const& file_path | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		HRESULT CreateBitmapFromResource( | 		HRESULT CreateBitmapFromResource( | ||||||
|  |  | ||||||
|  | @ -47,7 +47,7 @@ namespace easy2d | ||||||
| 		E2D_LOG("Destroying window"); | 		E2D_LOG("Destroying window"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	HRESULT WindowImpl::Init(std::wstring title, int width, int height, LPCWSTR icon, WNDPROC proc, bool debug) | 	HRESULT WindowImpl::Init(String title, int width, int height, LPCWSTR icon, WNDPROC proc, bool debug) | ||||||
| 	{ | 	{ | ||||||
| 		E2D_LOG("Creating window"); | 		E2D_LOG("Creating window"); | ||||||
| 
 | 
 | ||||||
|  | @ -82,7 +82,7 @@ namespace easy2d | ||||||
| 		GetContentScale(&scale_x, &scale_y); | 		GetContentScale(&scale_x, &scale_y); | ||||||
| 
 | 
 | ||||||
| 		Rect client_rect = LocateWindow(width, height, scale_x, scale_y); | 		Rect client_rect = LocateWindow(width, height, scale_x, scale_y); | ||||||
| 		handle = ::CreateWindowEx( | 		handle = ::CreateWindowExW( | ||||||
| 			NULL, | 			NULL, | ||||||
| 			REGISTER_CLASS, | 			REGISTER_CLASS, | ||||||
| 			title.c_str(), | 			title.c_str(), | ||||||
|  | @ -94,7 +94,7 @@ namespace easy2d | ||||||
| 			nullptr, | 			nullptr, | ||||||
| 			nullptr, | 			nullptr, | ||||||
| 			hinstance, | 			hinstance, | ||||||
| 			this | 			nullptr | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		if (handle == nullptr) | 		if (handle == nullptr) | ||||||
|  | @ -105,7 +105,7 @@ namespace easy2d | ||||||
| 		return S_OK; | 		return S_OK; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::wstring WindowImpl::GetTitle() const | 	String WindowImpl::GetTitle() const | ||||||
| 	{ | 	{ | ||||||
| 		if (handle) | 		if (handle) | ||||||
| 		{ | 		{ | ||||||
|  | @ -113,10 +113,10 @@ namespace easy2d | ||||||
| 			GetWindowTextW(handle, title, 256); | 			GetWindowTextW(handle, title, 256); | ||||||
| 			return title; | 			return title; | ||||||
| 		} | 		} | ||||||
| 		return std::wstring(); | 		return String(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void WindowImpl::SetTitle(std::wstring const& title) | 	void WindowImpl::SetTitle(String const& title) | ||||||
| 	{ | 	{ | ||||||
| 		if (handle) | 		if (handle) | ||||||
| 			::SetWindowText(handle, title.c_str()); | 			::SetWindowText(handle, title.c_str()); | ||||||
|  | @ -128,12 +128,12 @@ namespace easy2d | ||||||
| 		{ | 		{ | ||||||
| 			RECT rect; | 			RECT rect; | ||||||
| 			GetClientRect(handle, &rect); | 			GetClientRect(handle, &rect); | ||||||
| 			return Size( | 			return Size{ | ||||||
| 				static_cast<float>(rect.right - rect.left), | 				static_cast<float>(rect.right - rect.left), | ||||||
| 				static_cast<float>(rect.bottom - rect.top) | 				static_cast<float>(rect.bottom - rect.top) | ||||||
| 			); | 			}; | ||||||
| 		} | 		} | ||||||
| 		return Size(); | 		return Size{}; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	float WindowImpl::GetWidth() const | 	float WindowImpl::GetWidth() const | ||||||
|  |  | ||||||
|  | @ -31,7 +31,7 @@ namespace easy2d | ||||||
| 
 | 
 | ||||||
| 	public: | 	public: | ||||||
| 		HRESULT Init( | 		HRESULT Init( | ||||||
| 			std::wstring	title, | 			String	title, | ||||||
| 			int		width, | 			int		width, | ||||||
| 			int		height, | 			int		height, | ||||||
| 			LPCWSTR	icon, | 			LPCWSTR	icon, | ||||||
|  | @ -40,10 +40,10 @@ namespace easy2d | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 获取标题
 | 		// 获取标题
 | ||||||
| 		std::wstring GetTitle() const; | 		String GetTitle() const; | ||||||
| 
 | 
 | ||||||
| 		// 设置标题
 | 		// 设置标题
 | ||||||
| 		void SetTitle(std::wstring const& title); | 		void SetTitle(String const& title); | ||||||
| 
 | 
 | ||||||
| 		// 获取窗口大小
 | 		// 获取窗口大小
 | ||||||
| 		Size GetSize() const; | 		Size GetSize() const; | ||||||
|  |  | ||||||
|  | @ -84,5 +84,8 @@ namespace easy2d | ||||||
| 				return reinterpret_cast<D2D1_POINT_2F&>(*this); | 				return reinterpret_cast<D2D1_POINT_2F&>(*this); | ||||||
| 			} | 			} | ||||||
| 		}; | 		}; | ||||||
|  | 
 | ||||||
|  | 		using Point = Vector2; | ||||||
|  | 		using Size = Vector2; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -29,7 +29,7 @@ namespace easy2d | ||||||
| 		{ | 		{ | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		Menu::Menu(const std::vector<SpButton>& buttons) | 		Menu::Menu(Array<SpButton> const& buttons) | ||||||
| 			: enabled_(true) | 			: enabled_(true) | ||||||
| 		{ | 		{ | ||||||
| 			for (const auto& button : buttons) | 			for (const auto& button : buttons) | ||||||
|  | @ -94,7 +94,7 @@ namespace easy2d | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		const std::vector<SpButton>& Menu::GetAllButtons() const | 		Array<SpButton> const& Menu::GetAllButtons() const | ||||||
| 		{ | 		{ | ||||||
| 			return buttons_; | 			return buttons_; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -33,7 +33,7 @@ namespace easy2d | ||||||
| 			Menu(); | 			Menu(); | ||||||
| 
 | 
 | ||||||
| 			explicit Menu( | 			explicit Menu( | ||||||
| 				const std::vector<SpButton>& buttons	/* 按钮数组 */ | 				Array<SpButton> const& buttons	/* 按钮数组 */ | ||||||
| 			); | 			); | ||||||
| 
 | 
 | ||||||
| 			// 获取菜单是否禁用
 | 			// 获取菜单是否禁用
 | ||||||
|  | @ -58,11 +58,11 @@ namespace easy2d | ||||||
| 			); | 			); | ||||||
| 
 | 
 | ||||||
| 			// 获取所有按钮
 | 			// 获取所有按钮
 | ||||||
| 			const std::vector<SpButton>& GetAllButtons() const; | 			Array<SpButton> const& GetAllButtons() const; | ||||||
| 
 | 
 | ||||||
| 		private: | 		private: | ||||||
| 			bool enabled_; | 			bool enabled_; | ||||||
| 			std::vector<SpButton> buttons_; | 			Array<SpButton> buttons_; | ||||||
| 		}; | 		}; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -20,11 +20,10 @@ | ||||||
| 
 | 
 | ||||||
| #include "Data.h" | #include "Data.h" | ||||||
| #include "Path.h" | #include "Path.h" | ||||||
| #include "../base/macros.h" |  | ||||||
| 
 | 
 | ||||||
| namespace easy2d | namespace easy2d | ||||||
| { | { | ||||||
| 	Data::Data(std::wstring const& key, std::wstring const& field) | 	Data::Data(String const& key, String const& field) | ||||||
| 		: key_(key) | 		: key_(key) | ||||||
| 		, field_(field) | 		, field_(field) | ||||||
| 		, data_path_(Path::GetDataPath()) | 		, data_path_(Path::GetDataPath()) | ||||||
|  | @ -89,7 +88,7 @@ namespace easy2d | ||||||
| 		return ret == TRUE; | 		return ret == TRUE; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool Data::SaveString(std::wstring const& val) | 	bool Data::SaveString(String const& val) | ||||||
| 	{ | 	{ | ||||||
| 		BOOL ret = ::WritePrivateProfileStringW( | 		BOOL ret = ::WritePrivateProfileStringW( | ||||||
| 			field_.c_str(), | 			field_.c_str(), | ||||||
|  | @ -134,7 +133,7 @@ namespace easy2d | ||||||
| 		return nValue == TRUE; | 		return nValue == TRUE; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::wstring Data::GetString() | 	String Data::GetString() | ||||||
| 	{ | 	{ | ||||||
| 		wchar_t temp[256] = { 0 }; | 		wchar_t temp[256] = { 0 }; | ||||||
| 		::GetPrivateProfileStringW( | 		::GetPrivateProfileStringW( | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ | ||||||
| // THE SOFTWARE.
 | // THE SOFTWARE.
 | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
| #include <string> | #include "../base/helper.hpp" | ||||||
| 
 | 
 | ||||||
| namespace easy2d | namespace easy2d | ||||||
| { | { | ||||||
|  | @ -28,8 +28,8 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 	public: | 	public: | ||||||
| 		Data( | 		Data( | ||||||
| 			std::wstring const& key,				/* 键值 */ | 			String const& key,					/* 键值 */ | ||||||
| 			std::wstring const& field = L"Defalut"	/* 字段名称 */ | 			String const& field = L"Defalut"	/* 字段名称 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 该数据是否存在
 | 		// 该数据是否存在
 | ||||||
|  | @ -55,9 +55,9 @@ namespace easy2d | ||||||
| 			bool val | 			bool val | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 保存 std::wstring 类型的值
 | 		// 保存 String 类型的值
 | ||||||
| 		bool SaveString( | 		bool SaveString( | ||||||
| 			std::wstring const& val | 			String const& val | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 获取 int 类型的值
 | 		// 获取 int 类型的值
 | ||||||
|  | @ -73,11 +73,11 @@ namespace easy2d | ||||||
| 		bool GetBool() const; | 		bool GetBool() const; | ||||||
| 
 | 
 | ||||||
| 		// 获取 字符串 类型的值
 | 		// 获取 字符串 类型的值
 | ||||||
| 		std::wstring GetString(); | 		String GetString(); | ||||||
| 
 | 
 | ||||||
| 	protected: | 	protected: | ||||||
| 		std::wstring key_; | 		String key_; | ||||||
| 		std::wstring field_; | 		String field_; | ||||||
| 		std::wstring const& data_path_; | 		String const& data_path_; | ||||||
| 	}; | 	}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -24,14 +24,14 @@ | ||||||
| 
 | 
 | ||||||
| namespace easy2d | namespace easy2d | ||||||
| { | { | ||||||
| 	std::list<std::wstring>	File::search_paths_; | 	std::list<String>	File::search_paths_; | ||||||
| 
 | 
 | ||||||
| 	File::File() | 	File::File() | ||||||
| 		: file_path_() | 		: file_path_() | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	File::File(std::wstring const& file_name) | 	File::File(String const& file_name) | ||||||
| 		: file_path_(file_name) | 		: file_path_(file_name) | ||||||
| 	{ | 	{ | ||||||
| 		this->Open(file_name); | 		this->Open(file_name); | ||||||
|  | @ -41,12 +41,12 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool File::Open(std::wstring const& file_name) | 	bool File::Open(String const& file_name) | ||||||
| 	{ | 	{ | ||||||
| 		if (file_name.empty()) | 		if (file_name.empty()) | ||||||
| 			return false; | 			return false; | ||||||
| 
 | 
 | ||||||
| 		auto FindFile = [](std::wstring const& path) -> bool | 		auto FindFile = [](String const& path) -> bool | ||||||
| 		{ | 		{ | ||||||
| 			if (modules::Shlwapi().PathFileExistsW(path.c_str())) | 			if (modules::Shlwapi().PathFileExistsW(path.c_str())) | ||||||
| 				return true; | 				return true; | ||||||
|  | @ -77,16 +77,16 @@ namespace easy2d | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::wstring const& File::GetPath() const | 	String const& File::GetPath() const | ||||||
| 	{ | 	{ | ||||||
| 		return file_path_; | 		return file_path_; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::wstring File::GetExtension() const | 	String File::GetExtension() const | ||||||
| 	{ | 	{ | ||||||
| 		std::wstring file_ext; | 		String file_ext; | ||||||
| 		size_t pos = file_path_.find_last_of(L'.'); | 		size_t pos = file_path_.find_last_of(L'.'); | ||||||
| 		if (pos != std::wstring::npos) | 		if (pos != String::npos) | ||||||
| 		{ | 		{ | ||||||
| 			file_ext = file_path_.substr(pos); | 			file_ext = file_path_.substr(pos); | ||||||
| 			std::transform(file_ext.begin(), file_ext.end(), file_ext.begin(), std::towlower); | 			std::transform(file_ext.begin(), file_ext.end(), file_ext.begin(), std::towlower); | ||||||
|  | @ -101,7 +101,7 @@ namespace easy2d | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	File File::Extract(Resource& res, std::wstring const& dest_file_name) | 	File File::Extract(Resource& res, String const& dest_file_name) | ||||||
| 	{ | 	{ | ||||||
| 		File file; | 		File file; | ||||||
| 		HANDLE file_handle = ::CreateFile( | 		HANDLE file_handle = ::CreateFile( | ||||||
|  | @ -117,12 +117,13 @@ namespace easy2d | ||||||
| 		if (file_handle == INVALID_HANDLE_VALUE) | 		if (file_handle == INVALID_HANDLE_VALUE) | ||||||
| 			return file; | 			return file; | ||||||
| 
 | 
 | ||||||
| 		ResourceData buffer; | 		LPVOID buffer; | ||||||
| 		if (res.Load(&buffer)) | 		DWORD buffer_size; | ||||||
|  | 		if (res.Load(buffer, buffer_size)) | ||||||
| 		{ | 		{ | ||||||
| 			// дÈëÎļþ
 | 			// дÈëÎļþ
 | ||||||
| 			DWORD written_bytes = 0; | 			DWORD written_bytes = 0; | ||||||
| 			::WriteFile(file_handle, buffer.buffer, buffer.buffer_size, &written_bytes, NULL); | 			::WriteFile(file_handle, buffer, buffer_size, &written_bytes, NULL); | ||||||
| 			::CloseHandle(file_handle); | 			::CloseHandle(file_handle); | ||||||
| 
 | 
 | ||||||
| 			file.Open(dest_file_name); | 			file.Open(dest_file_name); | ||||||
|  | @ -136,11 +137,11 @@ namespace easy2d | ||||||
| 		return file; | 		return file; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void File::AddSearchPath(std::wstring const& path) | 	void File::AddSearchPath(String const& path) | ||||||
| 	{ | 	{ | ||||||
| 		std::wstring tmp = path; | 		String tmp = path; | ||||||
| 		size_t pos = 0; | 		size_t pos = 0; | ||||||
| 		while ((pos = tmp.find(L"/", pos)) != std::wstring::npos) | 		while ((pos = tmp.find(L"/", pos)) != String::npos) | ||||||
| 		{ | 		{ | ||||||
| 			tmp.replace(pos, 1, L"\\"); | 			tmp.replace(pos, 1, L"\\"); | ||||||
| 			pos++; | 			pos++; | ||||||
|  |  | ||||||
|  | @ -19,9 +19,8 @@ | ||||||
| // THE SOFTWARE.
 | // THE SOFTWARE.
 | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
|  | #include "../base/helper.hpp" | ||||||
| #include "../base/Resource.h" | #include "../base/Resource.h" | ||||||
| #include <string> |  | ||||||
| #include <list> |  | ||||||
| 
 | 
 | ||||||
| namespace easy2d | namespace easy2d | ||||||
| { | { | ||||||
|  | @ -32,14 +31,14 @@ namespace easy2d | ||||||
| 		File(); | 		File(); | ||||||
| 
 | 
 | ||||||
| 		File( | 		File( | ||||||
| 			std::wstring const& file_name | 			String const& file_name | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		virtual ~File(); | 		virtual ~File(); | ||||||
| 
 | 
 | ||||||
| 		// 打开文件
 | 		// 打开文件
 | ||||||
| 		bool Open( | 		bool Open( | ||||||
| 			std::wstring const& file_name | 			String const& file_name | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 文件是否存在
 | 		// 文件是否存在
 | ||||||
|  | @ -49,25 +48,25 @@ namespace easy2d | ||||||
| 		bool Delete(); | 		bool Delete(); | ||||||
| 
 | 
 | ||||||
| 		// 获取文件路径
 | 		// 获取文件路径
 | ||||||
| 		std::wstring const& GetPath() const; | 		String const& GetPath() const; | ||||||
| 
 | 
 | ||||||
| 		// 获取文件扩展名
 | 		// 获取文件扩展名
 | ||||||
| 		std::wstring GetExtension() const; | 		String GetExtension() const; | ||||||
| 
 | 
 | ||||||
| 		// 释放资源到临时文件目录
 | 		// 释放资源到临时文件目录
 | ||||||
| 		static File Extract( | 		static File Extract( | ||||||
| 			Resource& res,					/* 资源 */ | 			Resource& res,					/* 资源 */ | ||||||
| 			std::wstring const& dest_file_name	/* 目标文件名 */ | 			String const& dest_file_name	/* 目标文件名 */ | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		// 添加文件搜索路径
 | 		// 添加文件搜索路径
 | ||||||
| 		static void AddSearchPath( | 		static void AddSearchPath( | ||||||
| 			std::wstring const& path | 			String const& path | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 	protected: | 	protected: | ||||||
| 		std::wstring file_path_; | 		String file_path_; | ||||||
| 
 | 
 | ||||||
| 		static std::list<std::wstring> search_paths_; | 		static List<String> search_paths_; | ||||||
| 	}; | 	}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ namespace easy2d | ||||||
| 	namespace | 	namespace | ||||||
| 	{ | 	{ | ||||||
| 		// 创建指定文件夹
 | 		// 创建指定文件夹
 | ||||||
| 		bool CreateFolder(std::wstring const& dir_path) | 		bool CreateFolder(String const& dir_path) | ||||||
| 		{ | 		{ | ||||||
| 			if (dir_path.empty() || dir_path.size() >= MAX_PATH) | 			if (dir_path.empty() || dir_path.size() >= MAX_PATH) | ||||||
| 				return false; | 				return false; | ||||||
|  | @ -55,15 +55,15 @@ namespace easy2d | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	std::wstring const& Path::GetDataPath() | 	String const& Path::GetDataPath() | ||||||
| 	{ | 	{ | ||||||
| 		static std::wstring data_path; | 		static String data_path; | ||||||
| 		if (data_path.empty()) | 		if (data_path.empty()) | ||||||
| 		{ | 		{ | ||||||
| 			// 设置数据的保存路径
 | 			// 设置数据的保存路径
 | ||||||
| 			std::wstring local_app_data_path = Path::GetLocalAppDataPath(); | 			String local_app_data_path = Path::GetLocalAppDataPath(); | ||||||
| 			std::wstring title = Window::Instance()->GetTitle(); | 			String title = Window::Instance()->GetTitle(); | ||||||
| 			std::wstring folder_name = std::to_wstring(std::hash<std::wstring>{}(title)); | 			String folder_name = std::to_wstring(std::hash<String>{}(title)); | ||||||
| 
 | 
 | ||||||
| 			if (!local_app_data_path.empty()) | 			if (!local_app_data_path.empty()) | ||||||
| 			{ | 			{ | ||||||
|  | @ -83,15 +83,15 @@ namespace easy2d | ||||||
| 		return data_path; | 		return data_path; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::wstring const& Path::GetTemporaryPath() | 	String const& Path::GetTemporaryPath() | ||||||
| 	{ | 	{ | ||||||
| 		static std::wstring temp_path; | 		static String temp_path; | ||||||
| 		if (temp_path.empty()) | 		if (temp_path.empty()) | ||||||
| 		{ | 		{ | ||||||
| 			// 设置临时文件保存路径
 | 			// 设置临时文件保存路径
 | ||||||
| 			wchar_t path[_MAX_PATH]; | 			wchar_t path[_MAX_PATH]; | ||||||
| 			std::wstring title = Window::Instance()->GetTitle(); | 			String title = Window::Instance()->GetTitle(); | ||||||
| 			std::wstring folder_name = std::to_wstring(std::hash<std::wstring>{}(title)); | 			String folder_name = std::to_wstring(std::hash<String>{}(title)); | ||||||
| 
 | 
 | ||||||
| 			if (0 != ::GetTempPath(_MAX_PATH, path)) | 			if (0 != ::GetTempPath(_MAX_PATH, path)) | ||||||
| 			{ | 			{ | ||||||
|  | @ -110,9 +110,9 @@ namespace easy2d | ||||||
| 		return temp_path; | 		return temp_path; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::wstring const& Path::GetLocalAppDataPath() | 	String const& Path::GetLocalAppDataPath() | ||||||
| 	{ | 	{ | ||||||
| 		static std::wstring local_app_data_path; | 		static String local_app_data_path; | ||||||
| 		if (local_app_data_path.empty()) | 		if (local_app_data_path.empty()) | ||||||
| 		{ | 		{ | ||||||
| 			// 获取 AppData/Local 文件夹的路径
 | 			// 获取 AppData/Local 文件夹的路径
 | ||||||
|  | @ -124,9 +124,9 @@ namespace easy2d | ||||||
| 		return local_app_data_path; | 		return local_app_data_path; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::wstring const& Path::GetExeFilePath() | 	String const& Path::GetExeFilePath() | ||||||
| 	{ | 	{ | ||||||
| 		static std::wstring exe_file_path; | 		static String exe_file_path; | ||||||
| 		if (exe_file_path.empty()) | 		if (exe_file_path.empty()) | ||||||
| 		{ | 		{ | ||||||
| 			TCHAR path[_MAX_PATH] = { 0 }; | 			TCHAR path[_MAX_PATH] = { 0 }; | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ | ||||||
| // THE SOFTWARE.
 | // THE SOFTWARE.
 | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
| #include <string> | #include "../base/helper.hpp" | ||||||
| 
 | 
 | ||||||
| namespace easy2d | namespace easy2d | ||||||
| { | { | ||||||
|  | @ -28,15 +28,15 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 	public: | 	public: | ||||||
| 		// 获取数据的默认保存路径
 | 		// 获取数据的默认保存路径
 | ||||||
| 		static std::wstring const& GetDataPath(); | 		static String const& GetDataPath(); | ||||||
| 
 | 
 | ||||||
| 		// 获取临时文件目录
 | 		// 获取临时文件目录
 | ||||||
| 		static std::wstring const& GetTemporaryPath(); | 		static String const& GetTemporaryPath(); | ||||||
| 
 | 
 | ||||||
| 		// 获取 LocalAppData 目录
 | 		// 获取 LocalAppData 目录
 | ||||||
| 		static std::wstring const& GetLocalAppDataPath(); | 		static String const& GetLocalAppDataPath(); | ||||||
| 
 | 
 | ||||||
| 		// 获取当前程序的运行路径
 | 		// 获取当前程序的运行路径
 | ||||||
| 		static std::wstring const& GetExeFilePath(); | 		static String const& GetExeFilePath(); | ||||||
| 	}; | 	}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -33,84 +33,6 @@ namespace easy2d | ||||||
| 		ClearCache(); | 		ClearCache(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool Player::Load(std::wstring const& file_path) |  | ||||||
| 	{ |  | ||||||
| 		if (file_path.empty()) |  | ||||||
| 			return false; |  | ||||||
| 
 |  | ||||||
| 		SpMusic music = new (std::nothrow) Music(); |  | ||||||
| 
 |  | ||||||
| 		if (music) |  | ||||||
| 		{ |  | ||||||
| 			if (music->Load(file_path)) |  | ||||||
| 			{ |  | ||||||
| 				music->SetVolume(volume_); |  | ||||||
| 
 |  | ||||||
| 				size_t hash_code = std::hash<std::wstring>{}(file_path); |  | ||||||
| 				musics_cache_.insert(std::make_pair(hash_code, music)); |  | ||||||
| 				return true; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		return false; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	bool Player::Play(std::wstring const& file_path, int loop_count) |  | ||||||
| 	{ |  | ||||||
| 		if (file_path.empty()) |  | ||||||
| 			return false; |  | ||||||
| 
 |  | ||||||
| 		if (Load(file_path)) |  | ||||||
| 		{ |  | ||||||
| 			auto music = musics_cache_[std::hash<std::wstring>{}(file_path)]; |  | ||||||
| 			if (music->Play(loop_count)) |  | ||||||
| 			{ |  | ||||||
| 				return true; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		return false; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	void Player::Pause(std::wstring const& file_path) |  | ||||||
| 	{ |  | ||||||
| 		if (file_path.empty()) |  | ||||||
| 			return; |  | ||||||
| 
 |  | ||||||
| 		size_t hash_code = std::hash<std::wstring>{}(file_path); |  | ||||||
| 		if (musics_cache_.end() != musics_cache_.find(hash_code)) |  | ||||||
| 			musics_cache_[hash_code]->Pause(); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	void Player::Resume(std::wstring const& file_path) |  | ||||||
| 	{ |  | ||||||
| 		if (file_path.empty()) |  | ||||||
| 			return; |  | ||||||
| 
 |  | ||||||
| 		size_t hash_code = std::hash<std::wstring>{}(file_path); |  | ||||||
| 		if (musics_cache_.end() != musics_cache_.find(hash_code)) |  | ||||||
| 			musics_cache_[hash_code]->Resume(); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	void Player::Stop(std::wstring const& file_path) |  | ||||||
| 	{ |  | ||||||
| 		if (file_path.empty()) |  | ||||||
| 			return; |  | ||||||
| 
 |  | ||||||
| 		size_t hash_code = std::hash<std::wstring>{}(file_path); |  | ||||||
| 		if (musics_cache_.end() != musics_cache_.find(hash_code)) |  | ||||||
| 			musics_cache_[hash_code]->Stop(); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	bool Player::IsPlaying(std::wstring const& file_path) |  | ||||||
| 	{ |  | ||||||
| 		if (file_path.empty()) |  | ||||||
| 			return false; |  | ||||||
| 
 |  | ||||||
| 		size_t hash_code = std::hash<std::wstring>{}(file_path); |  | ||||||
| 		if (musics_cache_.end() != musics_cache_.find(hash_code)) |  | ||||||
| 			return musics_cache_[hash_code]->IsPlaying(); |  | ||||||
| 		return false; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	bool Player::Load(Resource const& res) | 	bool Player::Load(Resource const& res) | ||||||
| 	{ | 	{ | ||||||
| 		size_t hash_code = res.GetHashCode(); | 		size_t hash_code = res.GetHashCode(); | ||||||
|  |  | ||||||
|  | @ -29,44 +29,13 @@ namespace easy2d | ||||||
| 	class Player | 	class Player | ||||||
| 		: protected Noncopyable | 		: protected Noncopyable | ||||||
| 	{ | 	{ | ||||||
| 		using MusicMap = std::unordered_map<size_t, SpMusic>; | 		using MusicMap = Map<size_t, SpMusic>; | ||||||
| 
 | 
 | ||||||
| 	public: | 	public: | ||||||
| 		Player(); | 		Player(); | ||||||
| 
 | 
 | ||||||
| 		~Player(); | 		~Player(); | ||||||
| 
 | 
 | ||||||
| 		// 预加载音乐资源
 |  | ||||||
| 		bool Load( |  | ||||||
| 			std::wstring const& file_path	/* 音乐文件路径 */ |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		// 播放音乐
 |  | ||||||
| 		bool Play( |  | ||||||
| 			std::wstring const& file_path,	/* 音乐文件路径 */ |  | ||||||
| 			int loop_count = 0				/* 播放循环次数 (-1 为循环播放) */ |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		// 暂停音乐
 |  | ||||||
| 		void Pause( |  | ||||||
| 			std::wstring const& file_path	/* 音乐文件路径 */ |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		// 继续播放音乐
 |  | ||||||
| 		void Resume( |  | ||||||
| 			std::wstring const& file_path	/* 音乐文件路径 */ |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		// 停止音乐
 |  | ||||||
| 		void Stop( |  | ||||||
| 			std::wstring const& file_path	/* 音乐文件路径 */ |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		// 获取音乐播放状态
 |  | ||||||
| 		bool IsPlaying( |  | ||||||
| 			std::wstring const& file_path	/* 音乐文件路径 */ |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		// 渡속潼稜있栗都
 | 		// 渡속潼稜있栗都
 | ||||||
| 		bool Load( | 		bool Load( | ||||||
| 			Resource const& res			/* 稜있栗都 */ | 			Resource const& res			/* 稜있栗都 */ | ||||||
|  |  | ||||||
|  | @ -76,12 +76,13 @@ namespace easy2d | ||||||
| 		SmartPointer<IMFByteStream> byte_stream; | 		SmartPointer<IMFByteStream> byte_stream; | ||||||
| 		SmartPointer<IMFSourceReader> reader; | 		SmartPointer<IMFSourceReader> reader; | ||||||
| 
 | 
 | ||||||
| 		ResourceData buffer; | 		LPVOID buffer; | ||||||
| 		if (!res.Load(&buffer)) { return false; } | 		DWORD buffer_size; | ||||||
|  | 		if (!res.Load(buffer, buffer_size)) { return false; } | ||||||
| 
 | 
 | ||||||
| 		stream = modules::Shlwapi{}.SHCreateMemStream( | 		stream = modules::Shlwapi{}.SHCreateMemStream( | ||||||
| 			static_cast<const BYTE*>(buffer.buffer), | 			static_cast<const BYTE*>(buffer), | ||||||
| 			static_cast<UINT>(buffer.buffer_size) | 			static_cast<UINT>(buffer_size) | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		if (stream == nullptr) | 		if (stream == nullptr) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue