| 
									
										
										
										
											2018-05-10 14:03:54 +08:00
										 |  |  | #include "..\e2daction.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-24 00:58:16 +08:00
										 |  |  | #include "..\e2dnode.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-10 14:03:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | e2d::JumpBy::JumpBy(double duration, const Vector & vec, double height, int jumps) | 
					
						
							| 
									
										
										
										
											2018-05-22 22:29:42 +08:00
										 |  |  | 	: FiniteTimeAction(duration) | 
					
						
							| 
									
										
										
										
											2018-05-10 14:03:54 +08:00
										 |  |  | 	, _deltaPos(vec) | 
					
						
							|  |  |  | 	, _height(height) | 
					
						
							|  |  |  | 	, _jumps(jumps) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | e2d::JumpBy * e2d::JumpBy::clone() const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-24 22:06:14 +08:00
										 |  |  | 	return Create<JumpBy>(_duration, _deltaPos, _height, _jumps); | 
					
						
							| 
									
										
										
										
											2018-05-10 14:03:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | e2d::JumpBy * e2d::JumpBy::reverse() const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-24 22:06:14 +08:00
										 |  |  | 	return Create<JumpBy>(_duration, -_deltaPos, _height, _jumps); | 
					
						
							| 
									
										
										
										
											2018-05-10 14:03:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void e2d::JumpBy::_init() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-22 22:29:42 +08:00
										 |  |  | 	FiniteTimeAction::_init(); | 
					
						
							| 
									
										
										
										
											2018-05-10 14:03:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (_target) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		_prevPos = _startPos = _target->getPos(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void e2d::JumpBy::_update() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-05-22 22:29:42 +08:00
										 |  |  | 	FiniteTimeAction::_update(); | 
					
						
							| 
									
										
										
										
											2018-05-10 14:03:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (_target) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		double frac = fmod(_delta * _jumps, 1.0); | 
					
						
							|  |  |  | 		double x = _deltaPos.x * _delta; | 
					
						
							|  |  |  | 		double y = _height * 4 * frac * (1 - frac); | 
					
						
							|  |  |  | 		y += _deltaPos.y * _delta; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Point currentPos = _target->getPos(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Vector diff = currentPos - _prevPos; | 
					
						
							|  |  |  | 		_startPos = diff + _startPos; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Point newPos = _startPos + Vector(x, y); | 
					
						
							|  |  |  | 		_target->setPos(newPos); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		_prevPos = newPos; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |