add Animation sample
This commit is contained in:
		
							parent
							
								
									4e3a32ec15
								
							
						
					
					
						commit
						5f31b12ee2
					
				|  | @ -1150,7 +1150,7 @@ static void ShowDemoWindowWidgets() | |||
|         ImGui::TreePop(); | ||||
|     } | ||||
| 
 | ||||
|     if (ImGui::TreeNode("Data Types")) | ||||
|     if (ImGui::TreeNode("DataUtil Types")) | ||||
|     { | ||||
|         // The DragScalar/InputScalar/SliderScalar functions allow various data types: signed/unsigned int/long long and float/double
 | ||||
|         // To avoid polluting the public API with all possible combinations, we use the ImGuiDataType enum to pass the type,
 | ||||
|  |  | |||
|  | @ -32,7 +32,7 @@ namespace easy2d | |||
| 
 | ||||
| 		Animation( | ||||
| 			Duration duration,			/* 动画时长 */ | ||||
| 			FramesPtr const& frames,	/* Ö¡¼¯ºÏ */ | ||||
| 			FramesPtr const& frames,	/* ÐòÁÐÖ¡ */ | ||||
| 			EaseFunc func = nullptr		/* 速度变化 */ | ||||
| 		); | ||||
| 
 | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ | |||
| 
 | ||||
| namespace easy2d | ||||
| { | ||||
| 	// 帧集合
 | ||||
| 	// ÐòÁÐÖ¡
 | ||||
| 	class E2D_API Frames | ||||
| 		: public virtual Object | ||||
| 	{ | ||||
|  | @ -31,7 +31,7 @@ namespace easy2d | |||
| 		Frames(); | ||||
| 
 | ||||
| 		explicit Frames( | ||||
| 			Array<ImagePtr> const& frames	/* 关键帧数组 */ | ||||
| 			Array<ImagePtr> const& frames	/* ÐòÁÐÖ¡ */ | ||||
| 		); | ||||
| 
 | ||||
| 		virtual ~Frames(); | ||||
|  |  | |||
|  | @ -1203,14 +1203,14 @@ namespace std | |||
| 	template<> | ||||
| 	struct hash<::easy2d::String> | ||||
| 	{ | ||||
| 		size_t operator()(const easy2d::String& key) const | ||||
| 		inline size_t operator()(const easy2d::String& key) const | ||||
| 		{ | ||||
| 			return key.hash(); | ||||
| 		} | ||||
| 	}; | ||||
| 
 | ||||
| 	template<> | ||||
| 	void swap<::easy2d::String>(::easy2d::String& lhs, ::easy2d::String& rhs) | ||||
| 	inline void swap<::easy2d::String>(::easy2d::String& lhs, ::easy2d::String& rhs) | ||||
| 	{ | ||||
| 		lhs.swap(rhs); | ||||
| 	} | ||||
|  |  | |||
|  | @ -106,7 +106,7 @@ | |||
| //
 | ||||
| 
 | ||||
| #include "utils/Path.h" | ||||
| #include "utils/Data.h" | ||||
| #include "utils/DataUtil.h" | ||||
| #include "utils/File.h" | ||||
| #include "utils/ResLoader.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,20 +3,21 @@ | |||
| #pragma once | ||||
| #include "common.h" | ||||
| 
 | ||||
| E2D_DECLARE_SMART_PTR(Man); | ||||
| class Man | ||||
| // 怪物
 | ||||
| E2D_DECLARE_SMART_PTR(Monster); | ||||
| class Monster | ||||
| 	: public Sprite | ||||
| { | ||||
| public: | ||||
| 	Man() | ||||
| 	Monster() | ||||
| 	{ | ||||
| 		// 加载图片
 | ||||
| 		Load(L"res/man.png"); | ||||
| 		Load(L"res/akushu.png"); | ||||
| 		// 缩小图片
 | ||||
| 		SetScale(0.5f); | ||||
| 		SetScale(0.7f); | ||||
| 	} | ||||
| 
 | ||||
| 	// 每帧更新时
 | ||||
| 	// 每帧渲染前执行 OnUpdate
 | ||||
| 	void OnUpdate(Duration dt) override | ||||
| 	{ | ||||
| 		// 获取输入设备
 | ||||
|  | @ -41,7 +42,7 @@ public: | |||
| 			this->Move(0, 2); | ||||
| 		} | ||||
| 
 | ||||
| 		// 按下鼠标左键,顺时针旋转小人
 | ||||
| 		// 按下鼠标左键,顺时针旋转怪物
 | ||||
| 		if (input.IsDown(MouseButton::Left)) | ||||
| 		{ | ||||
| 			// 获取当前旋转角度
 | ||||
|  | @ -50,7 +51,7 @@ public: | |||
| 			this->SetRotation(rotation + 2); | ||||
| 		} | ||||
| 
 | ||||
| 		// 点击鼠标右键,隐藏或显示小人
 | ||||
| 		// 点击鼠标右键,隐藏或显示怪物
 | ||||
| 		if (input.WasPressed(MouseButton::Right)) | ||||
| 		{ | ||||
| 			// 获取当前显示状态
 | ||||
|  | @ -72,11 +73,11 @@ public: | |||
| 
 | ||||
| 	Demo2() | ||||
| 	{ | ||||
| 		// 创建人物
 | ||||
| 		ManPtr man = new Man; | ||||
| 		// 创建怪物
 | ||||
| 		MonsterPtr monster = new Monster; | ||||
| 		// 在屏幕上居中显示
 | ||||
| 		man->SetAnchor(0.5f, 0.5f); | ||||
| 		man->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2); | ||||
| 		monster->SetAnchor(0.5f, 0.5f); | ||||
| 		monster->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2); | ||||
| 
 | ||||
| 		// 创建说明文字
 | ||||
| 		TextPtr text = new Text(L"按上下左右键移动\n按鼠标左键旋转\n点击鼠标右键隐藏"); | ||||
|  | @ -88,7 +89,7 @@ public: | |||
| 		text->SetAlignment(TextAlign::Center); | ||||
| 
 | ||||
| 		// 添加到场景
 | ||||
| 		this->AddChild(man); | ||||
| 		this->AddChild(monster); | ||||
| 		this->AddChild(text); | ||||
| 	} | ||||
| }; | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ public: | |||
| 	{ | ||||
| 		// 속潼稜있
 | ||||
| 		music = new Music; | ||||
| 		if (!music->Load(L"res/music.wav")) | ||||
| 		if (!music->Load(L"res/splash.mp3")) | ||||
| 		{ | ||||
| 			music = nullptr; | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,192 @@ | |||
| // Copyright (C) 2019 Nomango
 | ||||
| 
 | ||||
| #pragma once | ||||
| #include "common.h" | ||||
| 
 | ||||
| // 老虎
 | ||||
| E2D_DECLARE_SMART_PTR(Tiger); | ||||
| class Tiger | ||||
| 	: public Sprite | ||||
| { | ||||
| 	FramesPtr run_frames;			// 跑步序列帧
 | ||||
| 	FramesPtr stand_frames;			// 站立序列帧
 | ||||
| 	bool facing_left;				// 面朝左或面朝右
 | ||||
| 	bool running;					// 是否正在跑步
 | ||||
| 	Direction running_direction;	// 跑步方向
 | ||||
| 
 | ||||
| public: | ||||
| 	Tiger() | ||||
| 	{ | ||||
| 		// 获取图片原始大小
 | ||||
| 		ImagePtr image = new Image(L"res/tiger.png"); | ||||
| 		Size source_size = image->GetSize(); | ||||
| 		// 计算每帧图片大小
 | ||||
| 		Size frame_size = { source_size.x / 5, source_size.y / 3 }; | ||||
| 
 | ||||
| 		// 加载帧动画
 | ||||
| 		run_frames = new Frames; | ||||
| 		for (int i = 0; i < 6; ++i) | ||||
| 		{ | ||||
| 			Point pos = { (i % 5) * frame_size.x, (i / 5) * frame_size.y }; | ||||
| 			ImagePtr frame = new Image(L"res/tiger.png", Rect{ pos, frame_size }); | ||||
| 			run_frames->Add(frame); | ||||
| 		} | ||||
| 
 | ||||
| 		stand_frames = new Frames; | ||||
| 		for (int i = 0; i < 6; ++i) | ||||
| 		{ | ||||
| 			Point pos = { ((i + 1) % 5) * frame_size.x, ((i + 1) / 5 + 1) * frame_size.y }; | ||||
| 			ImagePtr frame = new Image(L"res/tiger.png", Rect{ pos, frame_size }); | ||||
| 			stand_frames->Add(frame); | ||||
| 		} | ||||
| 
 | ||||
| 		// 执行动画
 | ||||
| 		AddAction( | ||||
| 			Tween::Animation(stand_frames) | ||||
| 			.SetDuration(1000) | ||||
| 			.SetLoops(-1) | ||||
| 		); | ||||
| 
 | ||||
| 		// 添加按键监听
 | ||||
| 		AddListener(Event::KeyDown, Closure(this, &Tiger::OnKeyDown)); | ||||
| 		AddListener(Event::KeyUp, Closure(this, &Tiger::OnKeyUp)); | ||||
| 
 | ||||
| 		// 默认方向为 Left
 | ||||
| 		facing_left = true; | ||||
| 		running = false; | ||||
| 
 | ||||
| 		// 设置锚点
 | ||||
| 		SetAnchor(0.5f, 0.5f); | ||||
| 	} | ||||
| 
 | ||||
| 	void OnKeyDown(Event const& e) | ||||
| 	{ | ||||
| 		if (e.key.code == KeyCode::Left) | ||||
| 			Run(Direction::Left); | ||||
| 		else if (e.key.code == KeyCode::Right) | ||||
| 			Run(Direction::Right); | ||||
| 		else if (e.key.code == KeyCode::Up) | ||||
| 			Run(Direction::Up); | ||||
| 		else if (e.key.code == KeyCode::Down) | ||||
| 			Run(Direction::Down); | ||||
| 	} | ||||
| 
 | ||||
| 	void OnKeyUp(Event const& e) | ||||
| 	{ | ||||
| 		switch (e.key.code) | ||||
| 		{ | ||||
| 		case KeyCode::Left: | ||||
| 		case KeyCode::Right: | ||||
| 		case KeyCode::Up: | ||||
| 		case KeyCode::Down: | ||||
| 			StopRun(); | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	void Run(Direction d) | ||||
| 	{ | ||||
| 		if (!running) | ||||
| 		{ | ||||
| 			running = true; | ||||
| 			StopAllActions(); | ||||
| 
 | ||||
| 			// 执行跑步动画
 | ||||
| 			AddAction( | ||||
| 				Tween::Animation(run_frames) | ||||
| 				.SetDuration(500) | ||||
| 				.SetLoops(-1) | ||||
| 			); | ||||
| 		} | ||||
| 
 | ||||
| 		running_direction = d; | ||||
| 		if (running_direction == Direction::Left) | ||||
| 		{ | ||||
| 			facing_left = true; | ||||
| 		} | ||||
| 		else if (running_direction == Direction::Right) | ||||
| 		{ | ||||
| 			facing_left = false; | ||||
| 		} | ||||
| 
 | ||||
| 		// 缩放可以调整图片显示方向
 | ||||
| 		// 缩放至 -1 图片会反转
 | ||||
| 		SetScaleX(facing_left ? 1.0f : -1.0f); | ||||
| 	} | ||||
| 
 | ||||
| 	void StopRun() | ||||
| 	{ | ||||
| 		if (running) | ||||
| 		{ | ||||
| 			running = false; | ||||
| 			StopAllActions(); | ||||
| 
 | ||||
| 			// 执行站立动画
 | ||||
| 			AddAction( | ||||
| 				Tween::Animation(stand_frames) | ||||
| 				.SetDuration(1000) | ||||
| 				.SetLoops(-1) | ||||
| 			); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	void OnUpdate(Duration dt) | ||||
| 	{ | ||||
| 		if (running) | ||||
| 		{ | ||||
| 			// 计算移动距离
 | ||||
| 			// OnUpdate 并不是一个稳定间隔执行的函数, 如果想实现稳定
 | ||||
| 			// 每秒移动 150 像素, 应根据 dt 参数计算移动距离
 | ||||
| 			const float moving_per_sec = 150; | ||||
| 			const float distance = moving_per_sec * dt.Seconds(); | ||||
| 
 | ||||
| 			switch (running_direction) | ||||
| 			{ | ||||
| 			case Direction::Up: | ||||
| 				Move(0, -distance); | ||||
| 				break; | ||||
| 			case Direction::Down: | ||||
| 				Move(0, distance); | ||||
| 				break; | ||||
| 			case Direction::Left: | ||||
| 				Move(-distance, 0); | ||||
| 				break; | ||||
| 			case Direction::Right: | ||||
| 				Move(distance, 0); | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| class Demo4 | ||||
| 	: public Scene | ||||
| { | ||||
| public: | ||||
| 	static ScenePtr Create() | ||||
| 	{ | ||||
| 		return new Demo4; | ||||
| 	} | ||||
| 
 | ||||
| 	Demo4() | ||||
| 	{ | ||||
| 		// 创建老虎
 | ||||
| 		TigerPtr tiger = new Tiger; | ||||
| 		// 在屏幕上居中显示
 | ||||
| 		tiger->SetAnchor(0.5f, 0.5f); | ||||
| 		tiger->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2); | ||||
| 
 | ||||
| 		// 创建说明文字
 | ||||
| 		TextPtr text = new Text(L"按上下左右键移动"); | ||||
| 		// 设置节点大小为文字布局大小
 | ||||
| 		text->SetSize(text->GetLayoutSize()); | ||||
| 		// 设置文字位置
 | ||||
| 		text->SetAnchor(0.5f, 0.5f); | ||||
| 		text->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT - 80); | ||||
| 		text->SetAlignment(TextAlign::Center); | ||||
| 
 | ||||
| 		// 添加到场景
 | ||||
| 		this->AddChild(tiger); | ||||
| 		this->AddChild(text); | ||||
| 	} | ||||
| }; | ||||
|  | @ -140,6 +140,7 @@ | |||
|     <ClInclude Include="Demo1.h" /> | ||||
|     <ClInclude Include="Demo2.h" /> | ||||
|     <ClInclude Include="Demo3.h" /> | ||||
|     <ClInclude Include="Demo4.h" /> | ||||
|     <ClInclude Include="include-forwards.h" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|  |  | |||
|  | @ -9,5 +9,6 @@ | |||
|     <ClInclude Include="common.h" /> | ||||
|     <ClInclude Include="Demo2.h" /> | ||||
|     <ClInclude Include="Demo3.h" /> | ||||
|     <ClInclude Include="Demo4.h" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
|  | @ -5,3 +5,4 @@ | |||
| #include "Demo1.h" | ||||
| #include "Demo2.h" | ||||
| #include "Demo3.h" | ||||
| #include "Demo4.h" | ||||
|  |  | |||
|  | @ -14,6 +14,7 @@ namespace | |||
| 		{ L"动画示例", Demo1::Create }, | ||||
| 		{ L"输入示例", Demo2::Create }, | ||||
| 		{ L"音频播放示例", Demo3::Create }, | ||||
| 		{ L"帧动画示例", Demo4::Create }, | ||||
| 	}; | ||||
| 	int s_DemoIndex = 0; | ||||
| 	int s_DemoNum = sizeof(s_Demos) / sizeof(Demo); | ||||
|  | @ -25,6 +26,7 @@ class DemoApp | |||
| public: | ||||
| 	DemoApp() | ||||
| 	{ | ||||
| 		ShowConsole(); | ||||
| 		// 使用 Audio 组件
 | ||||
| 		Use(&Audio::Instance()); | ||||
| 
 | ||||
|  | @ -39,7 +41,8 @@ public: | |||
| 
 | ||||
| 	void ChangeDemoScene() | ||||
| 	{ | ||||
| 		GetWindow()->SetTitle(s_Demos[s_DemoIndex].title); | ||||
| 		String title = s_Demos[s_DemoIndex].title; | ||||
| 		GetWindow()->SetTitle(title); | ||||
| 
 | ||||
| 		ScenePtr scene = s_Demos[s_DemoIndex].Create(); | ||||
| 		EnterScene(scene); | ||||
|  | @ -48,8 +51,10 @@ public: | |||
| 		scene->AddListener(Event::KeyUp, Closure(this, &DemoApp::KeyPressed)); | ||||
| 
 | ||||
| 		// 显示提示文字
 | ||||
| 		TextPtr intro = new Text(L"Key 1~3 to select demo"); | ||||
| 		String intro_str = format_wstring(L"按键 1~%d 可切换示例\n", s_DemoNum); | ||||
| 		TextPtr intro = new Text(intro_str + title); | ||||
| 		intro->SetFontSize(16.f); | ||||
| 		intro->SetPosition(10, 10); | ||||
| 		scene->AddChild(intro); | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 81 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 702 KiB | 
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 28 KiB | 
		Loading…
	
		Reference in New Issue