| 
									
										
										
										
											2019-03-18 15:00:58 +08:00
										 |  |  |  | // Copyright (C) 2019 Nomango
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #pragma once
 | 
					
						
							|  |  |  |  | #include "common.h"
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // <20>ϻ<EFBFBD>
 | 
					
						
							|  |  |  |  | E2D_DECLARE_SMART_PTR(Tiger); | 
					
						
							|  |  |  |  | class Tiger | 
					
						
							|  |  |  |  | 	: public Sprite | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	FramesPtr run_frames;			// <20>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD>֡
 | 
					
						
							|  |  |  |  | 	FramesPtr stand_frames;			// վ<><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
 | 
					
						
							|  |  |  |  | 	bool facing_left;				// <20>泯<EFBFBD><E6B3AF><EFBFBD><EFBFBD><EFBFBD>泯<EFBFBD><E6B3AF>
 | 
					
						
							|  |  |  |  | 	bool running;					// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD>
 | 
					
						
							|  |  |  |  | 	Direction running_direction;	// <20>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | public: | 
					
						
							|  |  |  |  | 	Tiger() | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// <20><>ȡͼƬԭʼ<D4AD><CABC>С
 | 
					
						
							|  |  |  |  | 		ImagePtr image = new Image(L"res/tiger.png"); | 
					
						
							|  |  |  |  | 		Size source_size = image->GetSize(); | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD>ÿ֡ͼƬ<CDBC><C6AC>С
 | 
					
						
							|  |  |  |  | 		Size frame_size = { source_size.x / 5, source_size.y / 3 }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 		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); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// ִ<>ж<EFBFBD><D0B6><EFBFBD>
 | 
					
						
							|  |  |  |  | 		AddAction( | 
					
						
							|  |  |  |  | 			Tween::Animation(stand_frames) | 
					
						
							|  |  |  |  | 			.SetDuration(1000) | 
					
						
							|  |  |  |  | 			.SetLoops(-1) | 
					
						
							|  |  |  |  | 		); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2019-04-08 14:15:27 +08:00
										 |  |  |  | 		AddListener(Event::KeyDown, MakeClosure(this, &Tiger::OnKeyDown)); | 
					
						
							|  |  |  |  | 		AddListener(Event::KeyUp, MakeClosure(this, &Tiger::OnKeyUp)); | 
					
						
							| 
									
										
										
										
											2019-03-18 15:00:58 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// Ĭ<>Ϸ<EFBFBD><CFB7><EFBFBD>Ϊ Left
 | 
					
						
							|  |  |  |  | 		facing_left = true; | 
					
						
							|  |  |  |  | 		running = false; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA>
 | 
					
						
							|  |  |  |  | 		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(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			// ִ<><D6B4><EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 			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; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD>ſ<EFBFBD><C5BF>Ե<EFBFBD><D4B5><EFBFBD>ͼƬ<CDBC><C6AC>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1 ͼƬ<CDBC>ᷴת
 | 
					
						
							|  |  |  |  | 		SetScaleX(facing_left ? 1.0f : -1.0f); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	void StopRun() | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (running) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			running = false; | 
					
						
							|  |  |  |  | 			StopAllActions(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			// ִ<><D6B4>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 			AddAction( | 
					
						
							|  |  |  |  | 				Tween::Animation(stand_frames) | 
					
						
							|  |  |  |  | 				.SetDuration(1000) | 
					
						
							|  |  |  |  | 				.SetLoops(-1) | 
					
						
							|  |  |  |  | 			); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	void OnUpdate(Duration dt) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (running) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			// <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 			// OnUpdate <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>еĺ<D0B5><C4BA><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ȶ<EFBFBD>
 | 
					
						
							|  |  |  |  | 			// ÿ<><C3BF><EFBFBD>ƶ<EFBFBD> 150 <20><><EFBFBD><EFBFBD>, Ӧ<><D3A6><EFBFBD><EFBFBD> dt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 			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() | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD><EFBFBD>ϻ<EFBFBD>
 | 
					
						
							|  |  |  |  | 		TigerPtr tiger = new Tiger; | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>Ͼ<EFBFBD><CFBE><EFBFBD><EFBFBD><EFBFBD>ʾ
 | 
					
						
							|  |  |  |  | 		tiger->SetAnchor(0.5f, 0.5f); | 
					
						
							|  |  |  |  | 		tiger->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 		TextPtr text = new Text(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD><EFBFBD>ƶ<EFBFBD>"); | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD>СΪ<D0A1><CEAA><EFBFBD>ֲ<EFBFBD><D6B2>ִ<EFBFBD>С
 | 
					
						
							|  |  |  |  | 		text->SetSize(text->GetLayoutSize()); | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
 | 
					
						
							|  |  |  |  | 		text->SetAnchor(0.5f, 0.5f); | 
					
						
							|  |  |  |  | 		text->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT - 80); | 
					
						
							|  |  |  |  | 		text->SetAlignment(TextAlign::Center); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 		this->AddChild(tiger); | 
					
						
							|  |  |  |  | 		this->AddChild(text); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | }; |