ObjectManager改为GC类
This commit is contained in:
		
							parent
							
								
									ec1cbaec13
								
							
						
					
					
						commit
						29f7d35844
					
				|  | @ -15,12 +15,12 @@ e2d::Animate::Animate(Animation * animation) | ||||||
| 
 | 
 | ||||||
| e2d::Animate * e2d::Animate::create() | e2d::Animate * e2d::Animate::create() | ||||||
| { | { | ||||||
| 	return Create<Animate>(); | 	return GC::create<Animate>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Animate * e2d::Animate::create(Animation * animation) | e2d::Animate * e2d::Animate::create(Animation * animation) | ||||||
| { | { | ||||||
| 	return Create<Animate>(animation); | 	return GC::create<Animate>(animation); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Animate::~Animate() | e2d::Animate::~Animate() | ||||||
|  | @ -36,7 +36,7 @@ void e2d::Animate::setAnimation(Animation * animation) | ||||||
| { | { | ||||||
| 	if (animation && animation != _animation) | 	if (animation && animation != _animation) | ||||||
| 	{ | 	{ | ||||||
| 		SafeRelease(_animation); | 		GC::release(_animation); | ||||||
| 		_animation = animation; | 		_animation = animation; | ||||||
| 		_animation->retain(); | 		_animation->retain(); | ||||||
| 	} | 	} | ||||||
|  | @ -100,14 +100,14 @@ void e2d::Animate::reset() | ||||||
| void e2d::Animate::onDestroy() | void e2d::Animate::onDestroy() | ||||||
| { | { | ||||||
| 	Action::onDestroy(); | 	Action::onDestroy(); | ||||||
| 	SafeRelease(_animation); | 	GC::release(_animation); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Animate * e2d::Animate::clone() const | e2d::Animate * e2d::Animate::clone() const | ||||||
| { | { | ||||||
| 	if (_animation) | 	if (_animation) | ||||||
| 	{ | 	{ | ||||||
| 		return Create<Animate>(_animation); | 		return GC::create<Animate>(_animation); | ||||||
| 	} | 	} | ||||||
| 	return nullptr; | 	return nullptr; | ||||||
| } | } | ||||||
|  | @ -131,10 +131,10 @@ e2d::Animate * e2d::Animate::reverse() const | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		auto animation = Create<Animation>(_animation->getInterval(), frames); | 		auto animation = GC::create<Animation>(_animation->getInterval(), frames); | ||||||
| 		if (animation) | 		if (animation) | ||||||
| 		{ | 		{ | ||||||
| 			return Create<Animate>(animation); | 			return GC::create<Animate>(animation); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return nullptr; | 	return nullptr; | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| #include "..\e2dcommon.h" | #include "..\e2daction.h" | ||||||
| 
 | 
 | ||||||
| e2d::Animation::Animation() | e2d::Animation::Animation() | ||||||
| 	: _interval(1) | 	: _interval(1) | ||||||
|  | @ -24,22 +24,22 @@ e2d::Animation::Animation(double interval, const std::vector<Image*>& frames) | ||||||
| 
 | 
 | ||||||
| e2d::Animation * e2d::Animation::create() | e2d::Animation * e2d::Animation::create() | ||||||
| { | { | ||||||
| 	return Create<Animation>(); | 	return GC::create<Animation>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Animation * e2d::Animation::create(const std::vector<Image*>& frames) | e2d::Animation * e2d::Animation::create(const std::vector<Image*>& frames) | ||||||
| { | { | ||||||
| 	return Create<Animation>(frames); | 	return GC::create<Animation>(frames); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Animation * e2d::Animation::create(double interval) | e2d::Animation * e2d::Animation::create(double interval) | ||||||
| { | { | ||||||
| 	return Create<Animation>(interval); | 	return GC::create<Animation>(interval); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Animation * e2d::Animation::create(double interval, const std::vector<Image*>& frames) | e2d::Animation * e2d::Animation::create(double interval, const std::vector<Image*>& frames) | ||||||
| { | { | ||||||
| 	return Create<Animation>(interval, frames); | 	return GC::create<Animation>(interval, frames); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Animation::~Animation() | e2d::Animation::~Animation() | ||||||
|  | @ -55,7 +55,7 @@ void e2d::Animation::onDestroy() | ||||||
| { | { | ||||||
| 	for (auto frame : _frames) | 	for (auto frame : _frames) | ||||||
| 	{ | 	{ | ||||||
| 		SafeRelease(frame); | 		GC::release(frame); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -88,7 +88,7 @@ const std::vector<e2d::Image*>& e2d::Animation::getFrames() const | ||||||
| 
 | 
 | ||||||
| e2d::Animation * e2d::Animation::clone() const | e2d::Animation * e2d::Animation::clone() const | ||||||
| { | { | ||||||
| 	auto animation = Create<Animation>(_interval); | 	auto animation = GC::create<Animation>(_interval); | ||||||
| 	for (auto frame : _frames) | 	for (auto frame : _frames) | ||||||
| 	{ | 	{ | ||||||
| 		animation->add(frame); | 		animation->add(frame); | ||||||
|  | @ -7,17 +7,17 @@ e2d::CallFunc::CallFunc(const Function& func) : | ||||||
| 
 | 
 | ||||||
| e2d::CallFunc * e2d::CallFunc::create(const Function & func) | e2d::CallFunc * e2d::CallFunc::create(const Function & func) | ||||||
| { | { | ||||||
| 	return Create<CallFunc>(func); | 	return GC::create<CallFunc>(func); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::CallFunc * e2d::CallFunc::clone() const | e2d::CallFunc * e2d::CallFunc::clone() const | ||||||
| { | { | ||||||
| 	return Create<CallFunc>(_func); | 	return GC::create<CallFunc>(_func); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::CallFunc * e2d::CallFunc::reverse() const | e2d::CallFunc * e2d::CallFunc::reverse() const | ||||||
| { | { | ||||||
| 	return Create<CallFunc>(_func); | 	return GC::create<CallFunc>(_func); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::CallFunc::_init() | void e2d::CallFunc::_init() | ||||||
|  |  | ||||||
|  | @ -8,17 +8,17 @@ e2d::Delay::Delay(double duration) | ||||||
| 
 | 
 | ||||||
| e2d::Delay * e2d::Delay::create(double duration) | e2d::Delay * e2d::Delay::create(double duration) | ||||||
| { | { | ||||||
| 	return Create<Delay>(duration); | 	return GC::create<Delay>(duration); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Delay * e2d::Delay::clone() const | e2d::Delay * e2d::Delay::clone() const | ||||||
| { | { | ||||||
| 	return Create<Delay>(_delay); | 	return GC::create<Delay>(_delay); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Delay * e2d::Delay::reverse() const | e2d::Delay * e2d::Delay::reverse() const | ||||||
| { | { | ||||||
| 	return Create<Delay>(_delay); | 	return GC::create<Delay>(_delay); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Delay::reset() | void e2d::Delay::reset() | ||||||
|  |  | ||||||
|  | @ -10,17 +10,17 @@ e2d::JumpBy::JumpBy(double duration, const Vector & vec, double height, int jump | ||||||
| 
 | 
 | ||||||
| e2d::JumpBy * e2d::JumpBy::create(double duration, const Vector & vec, double height, int jumps) | e2d::JumpBy * e2d::JumpBy::create(double duration, const Vector & vec, double height, int jumps) | ||||||
| { | { | ||||||
| 	return Create<JumpBy>(duration, vec, height, jumps); | 	return GC::create<JumpBy>(duration, vec, height, jumps); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::JumpBy * e2d::JumpBy::clone() const | e2d::JumpBy * e2d::JumpBy::clone() const | ||||||
| { | { | ||||||
| 	return Create<JumpBy>(_duration, _deltaPos, _height, _jumps); | 	return GC::create<JumpBy>(_duration, _deltaPos, _height, _jumps); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::JumpBy * e2d::JumpBy::reverse() const | e2d::JumpBy * e2d::JumpBy::reverse() const | ||||||
| { | { | ||||||
| 	return Create<JumpBy>(_duration, -_deltaPos, _height, _jumps); | 	return GC::create<JumpBy>(_duration, -_deltaPos, _height, _jumps); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::JumpBy::_init() | void e2d::JumpBy::_init() | ||||||
|  |  | ||||||
|  | @ -8,12 +8,12 @@ e2d::JumpTo::JumpTo(double duration, const Point & pos, double height, int jumps | ||||||
| 
 | 
 | ||||||
| e2d::JumpTo * e2d::JumpTo::create(double duration, const Point & pos, double height, int jumps) | e2d::JumpTo * e2d::JumpTo::create(double duration, const Point & pos, double height, int jumps) | ||||||
| { | { | ||||||
| 	return Create<JumpTo>(duration, pos, height, jumps); | 	return GC::create<JumpTo>(duration, pos, height, jumps); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::JumpTo * e2d::JumpTo::clone() const | e2d::JumpTo * e2d::JumpTo::clone() const | ||||||
| { | { | ||||||
| 	return Create<JumpTo>(_duration, _endPos, _height, _jumps); | 	return GC::create<JumpTo>(_duration, _endPos, _height, _jumps); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::JumpTo::_init() | void e2d::JumpTo::_init() | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ e2d::Loop::Loop(Action * action, int times /* = -1 */) | ||||||
| 
 | 
 | ||||||
| e2d::Loop * e2d::Loop::create(Action * action, int times) | e2d::Loop * e2d::Loop::create(Action * action, int times) | ||||||
| { | { | ||||||
| 	return Create<Loop>(action, times); | 	return GC::create<Loop>(action, times); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Loop::~Loop() | e2d::Loop::~Loop() | ||||||
|  | @ -28,7 +28,7 @@ e2d::Loop * e2d::Loop::clone() const | ||||||
| { | { | ||||||
| 	if (_action) | 	if (_action) | ||||||
| 	{ | 	{ | ||||||
| 		return Create<Loop>(_action->clone()); | 		return GC::create<Loop>(_action->clone()); | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
|  | @ -38,7 +38,7 @@ e2d::Loop * e2d::Loop::clone() const | ||||||
| 
 | 
 | ||||||
| e2d::Loop * e2d::Loop::reverse() const | e2d::Loop * e2d::Loop::reverse() const | ||||||
| { | { | ||||||
| 	return Create<Loop>(_action); | 	return GC::create<Loop>(_action); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Loop::_init() | void e2d::Loop::_init() | ||||||
|  | @ -91,7 +91,7 @@ void e2d::Loop::reset() | ||||||
| void e2d::Loop::onDestroy() | void e2d::Loop::onDestroy() | ||||||
| { | { | ||||||
| 	Action::onDestroy(); | 	Action::onDestroy(); | ||||||
| 	SafeRelease(_action); | 	GC::release(_action); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Loop::_resetTime() | void e2d::Loop::_resetTime() | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ e2d::MoveBy::MoveBy(double duration, Vector vector) | ||||||
| 
 | 
 | ||||||
| e2d::MoveBy * e2d::MoveBy::create(double duration, Vector vector) | e2d::MoveBy * e2d::MoveBy::create(double duration, Vector vector) | ||||||
| { | { | ||||||
| 	return Create<MoveBy>(duration, vector); | 	return GC::create<MoveBy>(duration, vector); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::MoveBy::_init() | void e2d::MoveBy::_init() | ||||||
|  | @ -34,10 +34,10 @@ void e2d::MoveBy::_update() | ||||||
| 
 | 
 | ||||||
| e2d::MoveBy * e2d::MoveBy::clone() const | e2d::MoveBy * e2d::MoveBy::clone() const | ||||||
| { | { | ||||||
| 	return Create<MoveBy>(_duration, _deltaPos); | 	return GC::create<MoveBy>(_duration, _deltaPos); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::MoveBy * e2d::MoveBy::reverse() const | e2d::MoveBy * e2d::MoveBy::reverse() const | ||||||
| { | { | ||||||
| 	return Create<MoveBy>(_duration, -_deltaPos); | 	return GC::create<MoveBy>(_duration, -_deltaPos); | ||||||
| } | } | ||||||
|  | @ -8,12 +8,12 @@ e2d::MoveTo::MoveTo(double duration, Point pos) | ||||||
| 
 | 
 | ||||||
| e2d::MoveTo * e2d::MoveTo::create(double duration, Point pos) | e2d::MoveTo * e2d::MoveTo::create(double duration, Point pos) | ||||||
| { | { | ||||||
| 	return Create<MoveTo>(duration, pos); | 	return GC::create<MoveTo>(duration, pos); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::MoveTo * e2d::MoveTo::clone() const | e2d::MoveTo * e2d::MoveTo::clone() const | ||||||
| { | { | ||||||
| 	return Create<MoveTo>(_duration, _endPos); | 	return GC::create<MoveTo>(_duration, _endPos); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::MoveTo::_init() | void e2d::MoveTo::_init() | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ e2d::OpacityBy::OpacityBy(double duration, double opacity) | ||||||
| 
 | 
 | ||||||
| e2d::OpacityBy * e2d::OpacityBy::create(double duration, double opacity) | e2d::OpacityBy * e2d::OpacityBy::create(double duration, double opacity) | ||||||
| { | { | ||||||
| 	return Create<OpacityBy>(duration, opacity); | 	return GC::create<OpacityBy>(duration, opacity); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::OpacityBy::_init() | void e2d::OpacityBy::_init() | ||||||
|  | @ -34,10 +34,10 @@ void e2d::OpacityBy::_update() | ||||||
| 
 | 
 | ||||||
| e2d::OpacityBy * e2d::OpacityBy::clone() const | e2d::OpacityBy * e2d::OpacityBy::clone() const | ||||||
| { | { | ||||||
| 	return Create<OpacityBy>(_duration, _deltaVal); | 	return GC::create<OpacityBy>(_duration, _deltaVal); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::OpacityBy * e2d::OpacityBy::reverse() const | e2d::OpacityBy * e2d::OpacityBy::reverse() const | ||||||
| { | { | ||||||
| 	return Create<OpacityBy>(_duration, -_deltaVal); | 	return GC::create<OpacityBy>(_duration, -_deltaVal); | ||||||
| } | } | ||||||
|  | @ -9,12 +9,12 @@ e2d::OpacityTo::OpacityTo(double duration, double opacity) | ||||||
| 
 | 
 | ||||||
| e2d::OpacityTo * e2d::OpacityTo::create(double duration, double opacity) | e2d::OpacityTo * e2d::OpacityTo::create(double duration, double opacity) | ||||||
| { | { | ||||||
| 	return Create<OpacityTo>(duration, opacity); | 	return GC::create<OpacityTo>(duration, opacity); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::OpacityTo * e2d::OpacityTo::clone() const | e2d::OpacityTo * e2d::OpacityTo::clone() const | ||||||
| { | { | ||||||
| 	return Create<OpacityTo>(_duration, _endVal); | 	return GC::create<OpacityTo>(_duration, _endVal); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::OpacityTo::_init() | void e2d::OpacityTo::_init() | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ e2d::RotateBy::RotateBy(double duration, double rotation) | ||||||
| 
 | 
 | ||||||
| e2d::RotateBy * e2d::RotateBy::create(double duration, double rotation) | e2d::RotateBy * e2d::RotateBy::create(double duration, double rotation) | ||||||
| { | { | ||||||
| 	return Create<RotateBy>(duration, rotation); | 	return GC::create<RotateBy>(duration, rotation); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::RotateBy::_init() | void e2d::RotateBy::_init() | ||||||
|  | @ -34,10 +34,10 @@ void e2d::RotateBy::_update() | ||||||
| 
 | 
 | ||||||
| e2d::RotateBy * e2d::RotateBy::clone() const | e2d::RotateBy * e2d::RotateBy::clone() const | ||||||
| { | { | ||||||
| 	return Create<RotateBy>(_duration, _deltaVal); | 	return GC::create<RotateBy>(_duration, _deltaVal); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::RotateBy * e2d::RotateBy::reverse() const | e2d::RotateBy * e2d::RotateBy::reverse() const | ||||||
| { | { | ||||||
| 	return Create<RotateBy>(_duration, -_deltaVal); | 	return GC::create<RotateBy>(_duration, -_deltaVal); | ||||||
| } | } | ||||||
|  | @ -9,12 +9,12 @@ e2d::RotateTo::RotateTo(double duration, double rotation) | ||||||
| 
 | 
 | ||||||
| e2d::RotateTo * e2d::RotateTo::create(double duration, double rotation) | e2d::RotateTo * e2d::RotateTo::create(double duration, double rotation) | ||||||
| { | { | ||||||
| 	return Create<RotateTo>(duration, rotation); | 	return GC::create<RotateTo>(duration, rotation); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::RotateTo * e2d::RotateTo::clone() const | e2d::RotateTo * e2d::RotateTo::clone() const | ||||||
| { | { | ||||||
| 	return Create<RotateTo>(_duration, _endVal); | 	return GC::create<RotateTo>(_duration, _endVal); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::RotateTo::_init() | void e2d::RotateTo::_init() | ||||||
|  |  | ||||||
|  | @ -17,12 +17,12 @@ e2d::ScaleBy::ScaleBy(double duration, double scaleX, double scaleY) | ||||||
| 
 | 
 | ||||||
| e2d::ScaleBy * e2d::ScaleBy::create(double duration, double scale) | e2d::ScaleBy * e2d::ScaleBy::create(double duration, double scale) | ||||||
| { | { | ||||||
| 	return Create<ScaleBy>(duration, scale); | 	return GC::create<ScaleBy>(duration, scale); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ScaleBy * e2d::ScaleBy::create(double duration, double scaleX, double scaleY) | e2d::ScaleBy * e2d::ScaleBy::create(double duration, double scaleX, double scaleY) | ||||||
| { | { | ||||||
| 	return Create<ScaleBy>(duration, scaleX, scaleY); | 	return GC::create<ScaleBy>(duration, scaleX, scaleY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ScaleBy::_init() | void e2d::ScaleBy::_init() | ||||||
|  | @ -48,10 +48,10 @@ void e2d::ScaleBy::_update() | ||||||
| 
 | 
 | ||||||
| e2d::ScaleBy * e2d::ScaleBy::clone() const | e2d::ScaleBy * e2d::ScaleBy::clone() const | ||||||
| { | { | ||||||
| 	return Create<ScaleBy>(_duration, _deltaX, _deltaY); | 	return GC::create<ScaleBy>(_duration, _deltaX, _deltaY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ScaleBy * e2d::ScaleBy::reverse() const | e2d::ScaleBy * e2d::ScaleBy::reverse() const | ||||||
| { | { | ||||||
| 	return Create<ScaleBy>(_duration, -_deltaX, -_deltaY); | 	return GC::create<ScaleBy>(_duration, -_deltaX, -_deltaY); | ||||||
| } | } | ||||||
|  | @ -16,17 +16,17 @@ e2d::ScaleTo::ScaleTo(double duration, double scaleX, double scaleY) | ||||||
| 
 | 
 | ||||||
| e2d::ScaleTo * e2d::ScaleTo::create(double duration, double scale) | e2d::ScaleTo * e2d::ScaleTo::create(double duration, double scale) | ||||||
| { | { | ||||||
| 	return Create<ScaleTo>(duration, scale); | 	return GC::create<ScaleTo>(duration, scale); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ScaleTo * e2d::ScaleTo::create(double duration, double scaleX, double scaleY) | e2d::ScaleTo * e2d::ScaleTo::create(double duration, double scaleX, double scaleY) | ||||||
| { | { | ||||||
| 	return Create<ScaleTo>(duration, scaleX, scaleY); | 	return GC::create<ScaleTo>(duration, scaleX, scaleY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ScaleTo * e2d::ScaleTo::clone() const | e2d::ScaleTo * e2d::ScaleTo::clone() const | ||||||
| { | { | ||||||
| 	return Create<ScaleTo>(_duration, _endScaleX, _endScaleY); | 	return GC::create<ScaleTo>(_duration, _endScaleX, _endScaleY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ScaleTo::_init() | void e2d::ScaleTo::_init() | ||||||
|  |  | ||||||
|  | @ -13,12 +13,12 @@ e2d::Sequence::Sequence(const std::vector<Action*>& actions) | ||||||
| 
 | 
 | ||||||
| e2d::Sequence * e2d::Sequence::create() | e2d::Sequence * e2d::Sequence::create() | ||||||
| { | { | ||||||
| 	return Create<Sequence>(); | 	return GC::create<Sequence>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Sequence * e2d::Sequence::create(const std::vector<Action*>& actions) | e2d::Sequence * e2d::Sequence::create(const std::vector<Action*>& actions) | ||||||
| { | { | ||||||
| 	return Create<Sequence>(actions); | 	return GC::create<Sequence>(actions); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Sequence::~Sequence() | e2d::Sequence::~Sequence() | ||||||
|  | @ -45,7 +45,7 @@ void e2d::Sequence::onDestroy() | ||||||
| 	Action::onDestroy(); | 	Action::onDestroy(); | ||||||
| 	for (auto action : _actions) | 	for (auto action : _actions) | ||||||
| 	{ | 	{ | ||||||
| 		SafeRelease(action); | 		GC::release(action); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -107,7 +107,7 @@ void e2d::Sequence::add(const std::vector<Action*>& actions) | ||||||
| 
 | 
 | ||||||
| e2d::Sequence * e2d::Sequence::clone() const | e2d::Sequence * e2d::Sequence::clone() const | ||||||
| { | { | ||||||
| 	auto sequence = Create<Sequence>(); | 	auto sequence = GC::create<Sequence>(); | ||||||
| 	for (const auto& action : _actions) | 	for (const auto& action : _actions) | ||||||
| 	{ | 	{ | ||||||
| 		if (action) | 		if (action) | ||||||
|  | @ -120,7 +120,7 @@ e2d::Sequence * e2d::Sequence::clone() const | ||||||
| 
 | 
 | ||||||
| e2d::Sequence * e2d::Sequence::reverse() const | e2d::Sequence * e2d::Sequence::reverse() const | ||||||
| { | { | ||||||
| 	auto sequence = Create<Sequence>(); | 	auto sequence = GC::create<Sequence>(); | ||||||
| 	if (!_actions.empty()) | 	if (!_actions.empty()) | ||||||
| 	{ | 	{ | ||||||
| 		std::vector<Action*> newActions(_actions.size()); | 		std::vector<Action*> newActions(_actions.size()); | ||||||
|  |  | ||||||
|  | @ -11,12 +11,12 @@ e2d::Spawn::Spawn(const std::vector<Action*>& actions) | ||||||
| 
 | 
 | ||||||
| e2d::Spawn * e2d::Spawn::create() | e2d::Spawn * e2d::Spawn::create() | ||||||
| { | { | ||||||
| 	return Create<Spawn>(); | 	return GC::create<Spawn>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Spawn * e2d::Spawn::create(const std::vector<Action*>& actions) | e2d::Spawn * e2d::Spawn::create(const std::vector<Action*>& actions) | ||||||
| { | { | ||||||
| 	return Create<Spawn>(actions); | 	return GC::create<Spawn>(actions); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Spawn::~Spawn() | e2d::Spawn::~Spawn() | ||||||
|  | @ -42,7 +42,7 @@ void e2d::Spawn::onDestroy() | ||||||
| 	Action::onDestroy(); | 	Action::onDestroy(); | ||||||
| 	for (auto action : _actions) | 	for (auto action : _actions) | ||||||
| 	{ | 	{ | ||||||
| 		SafeRelease(action); | 		GC::release(action); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -105,7 +105,7 @@ void e2d::Spawn::add(const std::vector<Action*>& actions) | ||||||
| 
 | 
 | ||||||
| e2d::Spawn * e2d::Spawn::clone() const | e2d::Spawn * e2d::Spawn::clone() const | ||||||
| { | { | ||||||
| 	auto spawn = Create<Spawn>(); | 	auto spawn = GC::create<Spawn>(); | ||||||
| 	for (const auto& action : _actions) | 	for (const auto& action : _actions) | ||||||
| 	{ | 	{ | ||||||
| 		if (action) | 		if (action) | ||||||
|  | @ -118,7 +118,7 @@ e2d::Spawn * e2d::Spawn::clone() const | ||||||
| 
 | 
 | ||||||
| e2d::Spawn * e2d::Spawn::reverse() const | e2d::Spawn * e2d::Spawn::reverse() const | ||||||
| { | { | ||||||
| 	auto spawn = Create<Spawn>(); | 	auto spawn = GC::create<Spawn>(); | ||||||
| 	if (!_actions.empty()) | 	if (!_actions.empty()) | ||||||
| 	{ | 	{ | ||||||
| 		std::vector<Action*> newActions(_actions.size()); | 		std::vector<Action*> newActions(_actions.size()); | ||||||
|  |  | ||||||
|  | @ -1,9 +1,8 @@ | ||||||
| #include "..\e2dmanager.h" |  | ||||||
| #include "..\e2dbase.h" | #include "..\e2dbase.h" | ||||||
| 
 | 
 | ||||||
| // ObjectManager 释放池的实现机制:
 | // GC 释放池的实现机制:
 | ||||||
| // Object 类中的引用计数(_nRefCount)在一定程度上保证了指针的使用安全
 | // Object 类中的引用计数(_refCount)在一定程度上防止了内存泄漏
 | ||||||
| // 它记录了对象被使用的次数,当计数为 0 时,ObjectManager 会自动释放这个对象
 | // 它记录了对象被使用的次数,当计数为 0 时,GC 会自动释放这个对象
 | ||||||
| // 所有的 Object 对象都应在被使用时(例如 Text 添加到了场景中)
 | // 所有的 Object 对象都应在被使用时(例如 Text 添加到了场景中)
 | ||||||
| // 调用 retain 函数保证该对象不被删除,并在不再使用时调用 release 函数
 | // 调用 retain 函数保证该对象不被删除,并在不再使用时调用 release 函数
 | ||||||
| 
 | 
 | ||||||
|  | @ -12,7 +11,7 @@ static std::set<e2d::Object*> s_vObjectPool; | ||||||
| // 标志释放池执行状态
 | // 标志释放池执行状态
 | ||||||
| static bool s_bNotifyed = false; | static bool s_bNotifyed = false; | ||||||
| 
 | 
 | ||||||
| void e2d::ObjectManager::__update() | void e2d::GC::__update() | ||||||
| { | { | ||||||
| 	if (!s_bNotifyed) return; | 	if (!s_bNotifyed) return; | ||||||
| 
 | 
 | ||||||
|  | @ -32,7 +31,7 @@ void e2d::ObjectManager::__update() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ObjectManager::__clear() | void e2d::GC::__clear() | ||||||
| { | { | ||||||
| 	for (auto pObj : s_vObjectPool) | 	for (auto pObj : s_vObjectPool) | ||||||
| 	{ | 	{ | ||||||
|  | @ -41,7 +40,7 @@ void e2d::ObjectManager::__clear() | ||||||
| 	s_vObjectPool.clear(); | 	s_vObjectPool.clear(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ObjectManager::__add(e2d::Object * pObject) | void e2d::GC::__add(e2d::Object * pObject) | ||||||
| { | { | ||||||
| 	if (pObject) | 	if (pObject) | ||||||
| 	{ | 	{ | ||||||
|  | @ -49,7 +48,13 @@ void e2d::ObjectManager::__add(e2d::Object * pObject) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::ObjectManager::flush() | void e2d::GC::notify() | ||||||
| { | { | ||||||
| 	s_bNotifyed = true; | 	s_bNotifyed = true; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | void e2d::GC::flush() | ||||||
|  | { | ||||||
|  | 	GC::notify(); | ||||||
|  | 	GC::__update(); | ||||||
|  | } | ||||||
|  | @ -145,7 +145,7 @@ int e2d::Game::start(bool autoRelease/* true */) | ||||||
| 				Time::__updateLast();		// 刷新时间信息
 | 				Time::__updateLast();		// 刷新时间信息
 | ||||||
| 			} | 			} | ||||||
| 			Renderer::__render();			// 渲染游戏画面
 | 			Renderer::__render();			// 渲染游戏画面
 | ||||||
| 			ObjectManager::__update();		// 刷新内存池
 | 			GC::__update();		// 刷新内存池
 | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| 		{ | 		{ | ||||||
|  | @ -206,7 +206,7 @@ void e2d::Game::destroy() | ||||||
| 	// 回收音乐播放器资源
 | 	// 回收音乐播放器资源
 | ||||||
| 	Player::__uninit(); | 	Player::__uninit(); | ||||||
| 	// 删除所有对象
 | 	// 删除所有对象
 | ||||||
| 	ObjectManager::__clear(); | 	GC::__clear(); | ||||||
| 	// 清空图片缓存
 | 	// 清空图片缓存
 | ||||||
| 	Image::clearCache(); | 	Image::clearCache(); | ||||||
| 	// 回收音乐相关资源
 | 	// 回收音乐相关资源
 | ||||||
|  |  | ||||||
|  | @ -28,17 +28,17 @@ e2d::ColliderCircle::ColliderCircle(Node * node) | ||||||
| 
 | 
 | ||||||
| e2d::ColliderCircle * e2d::ColliderCircle::create() | e2d::ColliderCircle * e2d::ColliderCircle::create() | ||||||
| { | { | ||||||
| 	return Create<ColliderCircle>(); | 	return GC::create<ColliderCircle>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ColliderCircle * e2d::ColliderCircle::create(Point center, double radius) | e2d::ColliderCircle * e2d::ColliderCircle::create(Point center, double radius) | ||||||
| { | { | ||||||
| 	return Create<ColliderCircle>(center, radius); | 	return GC::create<ColliderCircle>(center, radius); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ColliderCircle * e2d::ColliderCircle::create(Node * node) | e2d::ColliderCircle * e2d::ColliderCircle::create(Node * node) | ||||||
| { | { | ||||||
| 	return Create<ColliderCircle>(node); | 	return GC::create<ColliderCircle>(node); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ColliderCircle::~ColliderCircle() | e2d::ColliderCircle::~ColliderCircle() | ||||||
|  |  | ||||||
|  | @ -28,17 +28,17 @@ e2d::ColliderEllipse::ColliderEllipse(Node * node) | ||||||
| 
 | 
 | ||||||
| e2d::ColliderEllipse * e2d::ColliderEllipse::create() | e2d::ColliderEllipse * e2d::ColliderEllipse::create() | ||||||
| { | { | ||||||
| 	return Create<ColliderEllipse>(); | 	return GC::create<ColliderEllipse>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ColliderEllipse * e2d::ColliderEllipse::create(Point center, double radiusX, double radiusY) | e2d::ColliderEllipse * e2d::ColliderEllipse::create(Point center, double radiusX, double radiusY) | ||||||
| { | { | ||||||
| 	return Create<ColliderEllipse>(center, radiusX, radiusY); | 	return GC::create<ColliderEllipse>(center, radiusX, radiusY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ColliderEllipse * e2d::ColliderEllipse::create(Node * node) | e2d::ColliderEllipse * e2d::ColliderEllipse::create(Node * node) | ||||||
| { | { | ||||||
| 	return Create<ColliderEllipse>(node); | 	return GC::create<ColliderEllipse>(node); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ColliderEllipse::~ColliderEllipse() | e2d::ColliderEllipse::~ColliderEllipse() | ||||||
|  |  | ||||||
|  | @ -21,17 +21,17 @@ e2d::ColliderRect::ColliderRect(Node * node) | ||||||
| 
 | 
 | ||||||
| e2d::ColliderRect * e2d::ColliderRect::create() | e2d::ColliderRect * e2d::ColliderRect::create() | ||||||
| { | { | ||||||
| 	return Create<ColliderRect>(); | 	return GC::create<ColliderRect>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ColliderRect * e2d::ColliderRect::create(double x, double y, double width, double height) | e2d::ColliderRect * e2d::ColliderRect::create(double x, double y, double width, double height) | ||||||
| { | { | ||||||
| 	return Create<ColliderRect>(x, y, width, height); | 	return GC::create<ColliderRect>(x, y, width, height); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ColliderRect * e2d::ColliderRect::create(Node * node) | e2d::ColliderRect * e2d::ColliderRect::create(Node * node) | ||||||
| { | { | ||||||
| 	return Create<ColliderRect>(node); | 	return GC::create<ColliderRect>(node); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ColliderRect::~ColliderRect() | e2d::ColliderRect::~ColliderRect() | ||||||
|  |  | ||||||
|  | @ -44,27 +44,27 @@ e2d::Image::Image(int resNameId, const String& resType, double cropX, double cro | ||||||
| 
 | 
 | ||||||
| e2d::Image * e2d::Image::create() | e2d::Image * e2d::Image::create() | ||||||
| { | { | ||||||
| 	return Create<Image>(); | 	return GC::create<Image>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Image * e2d::Image::create(const String & filePath) | e2d::Image * e2d::Image::create(const String & filePath) | ||||||
| { | { | ||||||
| 	return Create<Image>(filePath); | 	return GC::create<Image>(filePath); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Image * e2d::Image::create(int resNameId, const String & resType) | e2d::Image * e2d::Image::create(int resNameId, const String & resType) | ||||||
| { | { | ||||||
| 	return Create<Image>(resNameId, resType); | 	return GC::create<Image>(resNameId, resType); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Image * e2d::Image::create(const String & filePath, double cropX, double cropY, double cropWidth, double cropHeight) | e2d::Image * e2d::Image::create(const String & filePath, double cropX, double cropY, double cropWidth, double cropHeight) | ||||||
| { | { | ||||||
| 	return Create<Image>(filePath, cropX, cropY, cropWidth, cropHeight); | 	return GC::create<Image>(filePath, cropX, cropY, cropWidth, cropHeight); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Image * e2d::Image::create(int resNameId, const String & resType, double cropX, double cropY, double cropWidth, double cropHeight) | e2d::Image * e2d::Image::create(int resNameId, const String & resType, double cropX, double cropY, double cropWidth, double cropHeight) | ||||||
| { | { | ||||||
| 	return Create<Image>(resNameId, resType, cropX, cropY, cropWidth, cropHeight); | 	return GC::create<Image>(resNameId, resType, cropX, cropY, cropWidth, cropHeight); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Image::~Image() | e2d::Image::~Image() | ||||||
|  |  | ||||||
|  | @ -13,7 +13,7 @@ e2d::Object::~Object() | ||||||
| 
 | 
 | ||||||
| void e2d::Object::autorelease() | void e2d::Object::autorelease() | ||||||
| { | { | ||||||
| 	ObjectManager::__add(this); | 	GC::__add(this); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Object::retain() | void e2d::Object::retain() | ||||||
|  | @ -24,7 +24,7 @@ void e2d::Object::retain() | ||||||
| void e2d::Object::release() | void e2d::Object::release() | ||||||
| { | { | ||||||
| 	_refCount--; | 	_refCount--; | ||||||
| 	ObjectManager::flush(); | 	GC::notify(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int e2d::Object::getRefCount() const | int e2d::Object::getRefCount() const | ||||||
|  |  | ||||||
|  | @ -21,7 +21,7 @@ e2d::Scene::Scene() | ||||||
| 
 | 
 | ||||||
| e2d::Scene * e2d::Scene::create() | e2d::Scene * e2d::Scene::create() | ||||||
| { | { | ||||||
| 	return Create<Scene>(); | 	return GC::create<Scene>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Scene::~Scene() | e2d::Scene::~Scene() | ||||||
|  | @ -102,5 +102,5 @@ void e2d::Scene::showCollider(bool visiable) | ||||||
| 
 | 
 | ||||||
| void e2d::Scene::onDestroy() | void e2d::Scene::onDestroy() | ||||||
| { | { | ||||||
| 	SafeRelease(_root); | 	GC::release(_root); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -166,7 +166,7 @@ void e2d::ActionManager::__clearAllBindedWith(Node * target) | ||||||
| 			auto a = s_vRunningActions[i]; | 			auto a = s_vRunningActions[i]; | ||||||
| 			if (a->getTarget() == target) | 			if (a->getTarget() == target) | ||||||
| 			{ | 			{ | ||||||
| 				SafeRelease(a); | 				GC::release(a); | ||||||
| 				s_vRunningActions.erase(s_vRunningActions.begin() + i); | 				s_vRunningActions.erase(s_vRunningActions.begin() + i); | ||||||
| 			} | 			} | ||||||
| 			else | 			else | ||||||
|  | @ -181,7 +181,7 @@ void e2d::ActionManager::__uninit() | ||||||
| { | { | ||||||
| 	for (auto action : s_vRunningActions) | 	for (auto action : s_vRunningActions) | ||||||
| 	{ | 	{ | ||||||
| 		SafeRelease(action); | 		GC::release(action); | ||||||
| 	} | 	} | ||||||
| 	s_vActions.clear(); | 	s_vActions.clear(); | ||||||
| 	s_vRunningActions.clear(); | 	s_vRunningActions.clear(); | ||||||
|  |  | ||||||
|  | @ -212,7 +212,7 @@ void e2d::ColliderManager::__removeCollider(Collider * pCollider) | ||||||
| 		{ | 		{ | ||||||
| 			if (s_vColliders[i] == pCollider) | 			if (s_vColliders[i] == pCollider) | ||||||
| 			{ | 			{ | ||||||
| 				SafeRelease(pCollider); | 				GC::release(pCollider); | ||||||
| 				s_vColliders.erase(s_vColliders.begin() + i); | 				s_vColliders.erase(s_vColliders.begin() + i); | ||||||
| 				return; | 				return; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | @ -68,7 +68,7 @@ void e2d::SceneManager::clear() | ||||||
| 	while (s_SceneStack.size()) | 	while (s_SceneStack.size()) | ||||||
| 	{ | 	{ | ||||||
| 		auto temp = s_SceneStack.top(); | 		auto temp = s_SceneStack.top(); | ||||||
| 		SafeRelease(temp); | 		GC::release(temp); | ||||||
| 		s_SceneStack.pop(); | 		s_SceneStack.pop(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -127,7 +127,7 @@ void e2d::SceneManager::__update() | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| 		{ | 		{ | ||||||
| 			SafeRelease(s_pCurrScene); | 			GC::release(s_pCurrScene); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// 执行下一场景的 onEnter 函数
 | 		// 执行下一场景的 onEnter 函数
 | ||||||
|  | @ -172,8 +172,8 @@ bool e2d::SceneManager::__init() | ||||||
| 
 | 
 | ||||||
| void e2d::SceneManager::__uninit() | void e2d::SceneManager::__uninit() | ||||||
| { | { | ||||||
| 	SafeRelease(s_pCurrScene); | 	GC::release(s_pCurrScene); | ||||||
| 	SafeRelease(s_pNextScene); | 	GC::release(s_pNextScene); | ||||||
| 	SafeRelease(s_pTransition); | 	GC::release(s_pTransition); | ||||||
| 	SceneManager::clear(); | 	SceneManager::clear(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -80,27 +80,27 @@ e2d::Button::Button(Node * normal, Node * mouseover, Node * selected, Node * dis | ||||||
| 
 | 
 | ||||||
| e2d::Button * e2d::Button::create() | e2d::Button * e2d::Button::create() | ||||||
| { | { | ||||||
| 	return Create<Button>(); | 	return GC::create<Button>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Button * e2d::Button::create(Node * normal, const Function & func) | e2d::Button * e2d::Button::create(Node * normal, const Function & func) | ||||||
| { | { | ||||||
| 	return Create<Button>(normal, func); | 	return GC::create<Button>(normal, func); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Button * e2d::Button::create(Node * normal, Node * selected, const Function & func) | e2d::Button * e2d::Button::create(Node * normal, Node * selected, const Function & func) | ||||||
| { | { | ||||||
| 	return Create<Button>(normal, selected, func); | 	return GC::create<Button>(normal, selected, func); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Button * e2d::Button::create(Node * normal, Node * mouseover, Node * selected, const Function & func) | e2d::Button * e2d::Button::create(Node * normal, Node * mouseover, Node * selected, const Function & func) | ||||||
| { | { | ||||||
| 	return Create<Button>(normal, mouseover, selected, func); | 	return GC::create<Button>(normal, mouseover, selected, func); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Button * e2d::Button::create(Node * normal, Node * mouseover, Node * selected, Node * disabled, const Function & func) | e2d::Button * e2d::Button::create(Node * normal, Node * mouseover, Node * selected, Node * disabled, const Function & func) | ||||||
| { | { | ||||||
| 	return Create<Button>(normal, mouseover, selected, disabled, func); | 	return GC::create<Button>(normal, mouseover, selected, disabled, func); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::Button::isEnable() const | bool e2d::Button::isEnable() const | ||||||
|  |  | ||||||
|  | @ -76,27 +76,27 @@ e2d::ButtonToggle::ButtonToggle(Node * toggleOnNormal, Node * toggleOffNormal, N | ||||||
| 
 | 
 | ||||||
| e2d::ButtonToggle * e2d::ButtonToggle::create() | e2d::ButtonToggle * e2d::ButtonToggle::create() | ||||||
| { | { | ||||||
| 	return Create<ButtonToggle>(); | 	return GC::create<ButtonToggle>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ButtonToggle * e2d::ButtonToggle::create(Node * onNormal, Node * offNormal, const Function & func) | e2d::ButtonToggle * e2d::ButtonToggle::create(Node * onNormal, Node * offNormal, const Function & func) | ||||||
| { | { | ||||||
| 	return Create<ButtonToggle>(onNormal, offNormal, func); | 	return GC::create<ButtonToggle>(onNormal, offNormal, func); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ButtonToggle * e2d::ButtonToggle::create(Node * onNormal, Node * offNormal, Node * onSelected, Node * offSelected, const Function & func) | e2d::ButtonToggle * e2d::ButtonToggle::create(Node * onNormal, Node * offNormal, Node * onSelected, Node * offSelected, const Function & func) | ||||||
| { | { | ||||||
| 	return Create<ButtonToggle>(onNormal, offNormal, onSelected, offSelected, func); | 	return GC::create<ButtonToggle>(onNormal, offNormal, onSelected, offSelected, func); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ButtonToggle * e2d::ButtonToggle::create(Node * onNormal, Node * offNormal, Node * onMouseOver, Node * offMouseOver, Node * onSelected, Node * offSelected, const Function & func) | e2d::ButtonToggle * e2d::ButtonToggle::create(Node * onNormal, Node * offNormal, Node * onMouseOver, Node * offMouseOver, Node * onSelected, Node * offSelected, const Function & func) | ||||||
| { | { | ||||||
| 	return Create<ButtonToggle>(onNormal, offNormal, onMouseOver, offMouseOver, onSelected, offSelected, func); | 	return GC::create<ButtonToggle>(onNormal, offNormal, onMouseOver, offMouseOver, onSelected, offSelected, func); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::ButtonToggle * e2d::ButtonToggle::create(Node * onNormal, Node * offNormal, Node * onMouseOver, Node * offMouseOver, Node * onSelected, Node * offSelected, Node * onDisabled, Node * offDisabled, const Function & func) | e2d::ButtonToggle * e2d::ButtonToggle::create(Node * onNormal, Node * offNormal, Node * onMouseOver, Node * offMouseOver, Node * onSelected, Node * offSelected, Node * onDisabled, Node * offDisabled, const Function & func) | ||||||
| { | { | ||||||
| 	return Create<ButtonToggle>(onNormal, offNormal, onMouseOver, offMouseOver, onSelected, offSelected, onDisabled, offDisabled, func); | 	return GC::create<ButtonToggle>(onNormal, offNormal, onMouseOver, offMouseOver, onSelected, offSelected, onDisabled, offDisabled, func); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::ButtonToggle::getState() const | bool e2d::ButtonToggle::getState() const | ||||||
|  |  | ||||||
|  | @ -16,12 +16,12 @@ e2d::Menu::Menu(const std::vector<Button*>& buttons) | ||||||
| 
 | 
 | ||||||
| e2d::Menu * e2d::Menu::create() | e2d::Menu * e2d::Menu::create() | ||||||
| { | { | ||||||
| 	return Create<Menu>(); | 	return GC::create<Menu>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Menu * e2d::Menu::create(const std::vector<Button*>& buttons) | e2d::Menu * e2d::Menu::create(const std::vector<Button*>& buttons) | ||||||
| { | { | ||||||
| 	return Create<Menu>(buttons); | 	return GC::create<Menu>(buttons); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::Menu::isEnable() const | bool e2d::Menu::isEnable() const | ||||||
|  |  | ||||||
|  | @ -37,13 +37,13 @@ e2d::Node::Node() | ||||||
| { | { | ||||||
| 	if (s_fDefaultColliderEnabled) | 	if (s_fDefaultColliderEnabled) | ||||||
| 	{ | 	{ | ||||||
| 		this->setCollider(Create<ColliderRect>(this)); | 		this->setCollider(GC::create<ColliderRect>(this)); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Node * e2d::Node::create() | e2d::Node * e2d::Node::create() | ||||||
| { | { | ||||||
| 	return Create<Node>(); | 	return GC::create<Node>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Node::~Node() | e2d::Node::~Node() | ||||||
|  | @ -549,19 +549,19 @@ void e2d::Node::setCollider(Collider::Type type) | ||||||
| 	{ | 	{ | ||||||
| 	case Collider::Type::RECT: | 	case Collider::Type::RECT: | ||||||
| 	{ | 	{ | ||||||
| 		this->setCollider(Create<ColliderRect>(this)); | 		this->setCollider(GC::create<ColliderRect>(this)); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	case Collider::Type::CIRCLE: | 	case Collider::Type::CIRCLE: | ||||||
| 	{ | 	{ | ||||||
| 		this->setCollider(Create<ColliderCircle>(this)); | 		this->setCollider(GC::create<ColliderCircle>(this)); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	case Collider::Type::ELLIPSE: | 	case Collider::Type::ELLIPSE: | ||||||
| 	{ | 	{ | ||||||
| 		this->setCollider(Create<ColliderEllipse>(this)); | 		this->setCollider(GC::create<ColliderEllipse>(this)); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -983,7 +983,7 @@ void e2d::Node::onDestroy() | ||||||
| 	ColliderManager::__removeCollider(_collider); | 	ColliderManager::__removeCollider(_collider); | ||||||
| 	for (auto child : _children) | 	for (auto child : _children) | ||||||
| 	{ | 	{ | ||||||
| 		SafeRelease(child); | 		GC::release(child); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -21,17 +21,17 @@ e2d::Circle::Circle(Point center, double radius) | ||||||
| 
 | 
 | ||||||
| e2d::Circle * e2d::Circle::create() | e2d::Circle * e2d::Circle::create() | ||||||
| { | { | ||||||
| 	return Create<Circle>(); | 	return GC::create<Circle>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Circle * e2d::Circle::create(double radius) | e2d::Circle * e2d::Circle::create(double radius) | ||||||
| { | { | ||||||
| 	return Create<Circle>(radius); | 	return GC::create<Circle>(radius); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Circle * e2d::Circle::create(Point center, double radius) | e2d::Circle * e2d::Circle::create(Point center, double radius) | ||||||
| { | { | ||||||
| 	return Create<Circle>(center, radius); | 	return GC::create<Circle>(center, radius); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Circle::~Circle() | e2d::Circle::~Circle() | ||||||
|  |  | ||||||
|  | @ -24,17 +24,17 @@ e2d::Ellipse::Ellipse(Point center, double radiusX, double radiusY) | ||||||
| 
 | 
 | ||||||
| e2d::Ellipse * e2d::Ellipse::create() | e2d::Ellipse * e2d::Ellipse::create() | ||||||
| { | { | ||||||
| 	return Create<Ellipse>(); | 	return GC::create<Ellipse>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Ellipse * e2d::Ellipse::create(double radiusX, double radiusY) | e2d::Ellipse * e2d::Ellipse::create(double radiusX, double radiusY) | ||||||
| { | { | ||||||
| 	return Create<Ellipse>(radiusX, radiusY); | 	return GC::create<Ellipse>(radiusX, radiusY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Ellipse * e2d::Ellipse::create(Point center, double radiusX, double radiusY) | e2d::Ellipse * e2d::Ellipse::create(Point center, double radiusX, double radiusY) | ||||||
| { | { | ||||||
| 	return Create<Ellipse>(center, radiusX, radiusY); | 	return GC::create<Ellipse>(center, radiusX, radiusY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Ellipse::~Ellipse() | e2d::Ellipse::~Ellipse() | ||||||
|  |  | ||||||
|  | @ -18,17 +18,17 @@ e2d::Rect::Rect(Point topLeft, Size size) | ||||||
| 
 | 
 | ||||||
| e2d::Rect * e2d::Rect::create() | e2d::Rect * e2d::Rect::create() | ||||||
| { | { | ||||||
| 	return Create<Rect>(); | 	return GC::create<Rect>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Rect * e2d::Rect::create(Size size) | e2d::Rect * e2d::Rect::create(Size size) | ||||||
| { | { | ||||||
| 	return Create<Rect>(size); | 	return GC::create<Rect>(size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Rect * e2d::Rect::create(Point topLeft, Size size) | e2d::Rect * e2d::Rect::create(Point topLeft, Size size) | ||||||
| { | { | ||||||
| 	return Create<Rect>(topLeft, size); | 	return GC::create<Rect>(topLeft, size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Rect::~Rect() | e2d::Rect::~Rect() | ||||||
|  |  | ||||||
|  | @ -24,17 +24,17 @@ e2d::RoundRect::RoundRect(Point topLeft, Size size, double radiusX, double radiu | ||||||
| 
 | 
 | ||||||
| e2d::RoundRect * e2d::RoundRect::create() | e2d::RoundRect * e2d::RoundRect::create() | ||||||
| { | { | ||||||
| 	return Create<RoundRect>(); | 	return GC::create<RoundRect>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::RoundRect * e2d::RoundRect::create(Size size, double radiusX, double radiusY) | e2d::RoundRect * e2d::RoundRect::create(Size size, double radiusX, double radiusY) | ||||||
| { | { | ||||||
| 	return Create<RoundRect>(size, radiusX, radiusY); | 	return GC::create<RoundRect>(size, radiusX, radiusY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::RoundRect * e2d::RoundRect::create(Point topLeft, Size size, double radiusX, double radiusY) | e2d::RoundRect * e2d::RoundRect::create(Point topLeft, Size size, double radiusX, double radiusY) | ||||||
| { | { | ||||||
| 	return Create<RoundRect>(topLeft, size, radiusX, radiusY); | 	return GC::create<RoundRect>(topLeft, size, radiusX, radiusY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::RoundRect::~RoundRect() | e2d::RoundRect::~RoundRect() | ||||||
|  |  | ||||||
|  | @ -40,32 +40,32 @@ e2d::Sprite::Sprite(int resNameId, const String& resType, double x, double y, do | ||||||
| 
 | 
 | ||||||
| e2d::Sprite * e2d::Sprite::create() | e2d::Sprite * e2d::Sprite::create() | ||||||
| { | { | ||||||
| 	return Create<Sprite>(); | 	return GC::create<Sprite>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Sprite * e2d::Sprite::create(Image * image) | e2d::Sprite * e2d::Sprite::create(Image * image) | ||||||
| { | { | ||||||
| 	return Create<Sprite>(image); | 	return GC::create<Sprite>(image); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Sprite * e2d::Sprite::create(const String & filePath) | e2d::Sprite * e2d::Sprite::create(const String & filePath) | ||||||
| { | { | ||||||
| 	return Create<Sprite>(filePath); | 	return GC::create<Sprite>(filePath); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Sprite * e2d::Sprite::create(int resNameId, const String & resType) | e2d::Sprite * e2d::Sprite::create(int resNameId, const String & resType) | ||||||
| { | { | ||||||
| 	return Create<Sprite>(resNameId, resType); | 	return GC::create<Sprite>(resNameId, resType); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Sprite * e2d::Sprite::create(const String & filePath, double x, double y, double width, double height) | e2d::Sprite * e2d::Sprite::create(const String & filePath, double x, double y, double width, double height) | ||||||
| { | { | ||||||
| 	return Create<Sprite>(filePath, x, y, width, height); | 	return GC::create<Sprite>(filePath, x, y, width, height); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Sprite * e2d::Sprite::create(int resNameId, const String & resType, double x, double y, double width, double height) | e2d::Sprite * e2d::Sprite::create(int resNameId, const String & resType, double x, double y, double width, double height) | ||||||
| { | { | ||||||
| 	return Create<Sprite>(resNameId, resType, x, y, width, height); | 	return GC::create<Sprite>(resNameId, resType, x, y, width, height); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Sprite::~Sprite() | e2d::Sprite::~Sprite() | ||||||
|  | @ -76,7 +76,7 @@ bool e2d::Sprite::open(Image * image) | ||||||
| { | { | ||||||
| 	if (image) | 	if (image) | ||||||
| 	{ | 	{ | ||||||
| 		SafeRelease(_image); | 		GC::release(_image); | ||||||
| 		_image = image; | 		_image = image; | ||||||
| 		_image->retain(); | 		_image->retain(); | ||||||
| 
 | 
 | ||||||
|  | @ -90,7 +90,7 @@ bool e2d::Sprite::open(const String& filePath) | ||||||
| { | { | ||||||
| 	if (!_image) | 	if (!_image) | ||||||
| 	{ | 	{ | ||||||
| 		_image = Create<Image>(); | 		_image = GC::create<Image>(); | ||||||
| 		_image->retain(); | 		_image->retain(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -106,7 +106,7 @@ bool e2d::Sprite::open(int resNameId, const String& resType) | ||||||
| { | { | ||||||
| 	if (!_image) | 	if (!_image) | ||||||
| 	{ | 	{ | ||||||
| 		_image = Create<Image>(); | 		_image = GC::create<Image>(); | ||||||
| 		_image->retain(); | 		_image->retain(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -158,5 +158,5 @@ void e2d::Sprite::onRender() | ||||||
| void e2d::Sprite::onDestroy() | void e2d::Sprite::onDestroy() | ||||||
| { | { | ||||||
| 	Node::onDestroy(); | 	Node::onDestroy(); | ||||||
| 	SafeRelease(_image); | 	GC::release(_image); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -92,12 +92,12 @@ e2d::Text::Text(const String & text, const Font & font, const Style & style) | ||||||
| 
 | 
 | ||||||
| e2d::Text * e2d::Text::create() | e2d::Text * e2d::Text::create() | ||||||
| { | { | ||||||
| 	return Create<Text>(); | 	return GC::create<Text>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Text * e2d::Text::create(const String & text, const Font & font, const Style & style) | e2d::Text * e2d::Text::create(const String & text, const Font & font, const Style & style) | ||||||
| { | { | ||||||
| 	return Create<Text>(text, font, style); | 	return GC::create<Text>(text, font, style); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Text::~Text() | e2d::Text::~Text() | ||||||
|  |  | ||||||
|  | @ -70,17 +70,17 @@ e2d::Music::~Music() | ||||||
| 
 | 
 | ||||||
| e2d::Music * e2d::Music::create() | e2d::Music * e2d::Music::create() | ||||||
| { | { | ||||||
| 	return Create<Music>(); | 	return GC::create<Music>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Music * e2d::Music::create(const e2d::String & filePath) | e2d::Music * e2d::Music::create(const e2d::String & filePath) | ||||||
| { | { | ||||||
| 	return Create<Music>(filePath); | 	return GC::create<Music>(filePath); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Music * e2d::Music::create(int resNameId, const String & resType) | e2d::Music * e2d::Music::create(int resNameId, const String & resType) | ||||||
| { | { | ||||||
| 	return Create<Music>(resNameId, resType); | 	return GC::create<Music>(resNameId, resType); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::Music::open(const e2d::String& filePath) | bool e2d::Music::open(const e2d::String& filePath) | ||||||
|  |  | ||||||
|  | @ -29,8 +29,8 @@ bool e2d::Transition::isDone() | ||||||
| 
 | 
 | ||||||
| void e2d::Transition::onDestroy() | void e2d::Transition::onDestroy() | ||||||
| { | { | ||||||
| 	SafeRelease(_outScene); | 	GC::release(_outScene); | ||||||
| 	SafeRelease(_inScene); | 	GC::release(_inScene); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Transition::_init(Scene * prev, Scene * next) | void e2d::Transition::_init(Scene * prev, Scene * next) | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ e2d::TransitionEmerge::TransitionEmerge(double duration) | ||||||
| 
 | 
 | ||||||
| e2d::TransitionEmerge * e2d::TransitionEmerge::create(double duration) | e2d::TransitionEmerge * e2d::TransitionEmerge::create(double duration) | ||||||
| { | { | ||||||
| 	return Create<TransitionEmerge>(duration); | 	return GC::create<TransitionEmerge>(duration); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::TransitionEmerge::_init(Scene * prev, Scene * next) | void e2d::TransitionEmerge::_init(Scene * prev, Scene * next) | ||||||
|  |  | ||||||
|  | @ -19,12 +19,12 @@ e2d::TransitionFade::TransitionFade(double fadeOutDuration, double fadeInDuratio | ||||||
| 
 | 
 | ||||||
| e2d::TransitionFade * e2d::TransitionFade::create(double duration) | e2d::TransitionFade * e2d::TransitionFade::create(double duration) | ||||||
| { | { | ||||||
| 	return Create<TransitionFade>(duration); | 	return GC::create<TransitionFade>(duration); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::TransitionFade * e2d::TransitionFade::create(double fadeOutDuration, double fadeInDuration) | e2d::TransitionFade * e2d::TransitionFade::create(double fadeOutDuration, double fadeInDuration) | ||||||
| { | { | ||||||
| 	return Create<TransitionFade>(fadeOutDuration, fadeInDuration); | 	return GC::create<TransitionFade>(fadeOutDuration, fadeInDuration); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::TransitionFade::_init(Scene * prev, Scene * next) | void e2d::TransitionFade::_init(Scene * prev, Scene * next) | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ e2d::TransitionMove::TransitionMove(double duration, Direction direction) | ||||||
| 
 | 
 | ||||||
| e2d::TransitionMove * e2d::TransitionMove::create(double moveDuration, Direction direction) | e2d::TransitionMove * e2d::TransitionMove::create(double moveDuration, Direction direction) | ||||||
| { | { | ||||||
| 	return Create<TransitionMove>(moveDuration, direction); | 	return GC::create<TransitionMove>(moveDuration, direction); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::TransitionMove::_init(Scene * prev, Scene * next) | void e2d::TransitionMove::_init(Scene * prev, Scene * next) | ||||||
|  |  | ||||||
|  | @ -772,6 +772,80 @@ protected: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | // 帧动画
 | ||||||
|  | class Animation : | ||||||
|  | 	public Object | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 	Animation(); | ||||||
|  | 
 | ||||||
|  | 	Animation( | ||||||
|  | 		const std::vector<Image*>& frames	/* 关键帧数组 */ | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	Animation( | ||||||
|  | 		double interval						/* 帧间隔(秒) */ | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	Animation( | ||||||
|  | 		double interval,					/* 帧间隔(秒) */ | ||||||
|  | 		const std::vector<Image*>& frames	/* 关键帧数组 */ | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 创建帧动画
 | ||||||
|  | 	static Animation * create(); | ||||||
|  | 
 | ||||||
|  | 	// 创建帧动画
 | ||||||
|  | 	static Animation * create( | ||||||
|  | 		const std::vector<Image*>& frames	/* 关键帧数组 */ | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 创建特定帧间隔的帧动画
 | ||||||
|  | 	static Animation * create( | ||||||
|  | 		double interval						/* 帧间隔(秒) */ | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 创建特定帧间隔的帧动画
 | ||||||
|  | 	static Animation * create( | ||||||
|  | 		double interval,					/* 帧间隔(秒) */ | ||||||
|  | 		const std::vector<Image*>& frames	/* 关键帧数组 */ | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	virtual ~Animation(); | ||||||
|  | 
 | ||||||
|  | 	// 添加关键帧
 | ||||||
|  | 	void add( | ||||||
|  | 		Image * frame	/* 关键帧 */ | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 添加多个关键帧
 | ||||||
|  | 	void add( | ||||||
|  | 		const std::vector<Image*>& frames	/* 关键帧列表 */ | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 获取帧间隔
 | ||||||
|  | 	double getInterval() const; | ||||||
|  | 
 | ||||||
|  | 	// 获取关键帧
 | ||||||
|  | 	const std::vector<Image*>& getFrames() const; | ||||||
|  | 
 | ||||||
|  | 	// 设置每一帧的时间间隔
 | ||||||
|  | 	void setInterval( | ||||||
|  | 		double interval		/* 帧间隔(秒) */ | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 获取动画的拷贝对象
 | ||||||
|  | 	virtual Animation * clone() const; | ||||||
|  | 
 | ||||||
|  | 	// 销毁对象
 | ||||||
|  | 	virtual void onDestroy() override; | ||||||
|  | 
 | ||||||
|  | protected: | ||||||
|  | 	double	_interval; | ||||||
|  | 	std::vector<Image*> _frames; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| // 精灵动作
 | // 精灵动作
 | ||||||
| class Animate : | class Animate : | ||||||
| 	public Action | 	public Action | ||||||
|  |  | ||||||
|  | @ -382,4 +382,65 @@ private: | ||||||
| 	static void __discardResources(); | 	static void __discardResources(); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | // 垃圾回收装置
 | ||||||
|  | class GC | ||||||
|  | { | ||||||
|  | 	friend Game; | ||||||
|  | 	friend Object; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 	// 创建可自动回收内存的对象
 | ||||||
|  | 	template <typename Type, typename... Args> | ||||||
|  | 	static inline Type * create(Args&&... args) | ||||||
|  | 	{ | ||||||
|  | 		auto newObj = new (std::nothrow) Type(std::forward<Args>(args)...); | ||||||
|  | 		if (newObj) | ||||||
|  | 		{ | ||||||
|  | 			newObj->autorelease(); | ||||||
|  | 			return newObj; | ||||||
|  | 		} | ||||||
|  | 		return nullptr; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 保留对象
 | ||||||
|  | 	template <typename Type> | ||||||
|  | 	static inline void retain(Type*& p) | ||||||
|  | 	{ | ||||||
|  | 		if (p != nullptr) | ||||||
|  | 		{ | ||||||
|  | 			p->retain(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 释放对象
 | ||||||
|  | 	template <typename Type> | ||||||
|  | 	static inline void release(Type*& p) | ||||||
|  | 	{ | ||||||
|  | 		if (p != nullptr) | ||||||
|  | 		{ | ||||||
|  | 			p->release(); | ||||||
|  | 			p = nullptr; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// 通知 GC 回收垃圾内存
 | ||||||
|  | 	static void notify(); | ||||||
|  | 
 | ||||||
|  | 	// 手动回收垃圾内存
 | ||||||
|  | 	static void flush(); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	// 将对象放入 GC
 | ||||||
|  | 	static void __add( | ||||||
|  | 		Object * pObject | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	// 更新 GC
 | ||||||
|  | 	static void __update(); | ||||||
|  | 
 | ||||||
|  | 	// 清空所有对象
 | ||||||
|  | 	static void __clear(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | @ -7,6 +7,8 @@ namespace e2d | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class ColliderManager; | ||||||
|  | 
 | ||||||
| // 碰撞事件
 | // 碰撞事件
 | ||||||
| class Collision | class Collision | ||||||
| { | { | ||||||
|  | @ -37,8 +39,6 @@ private: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ColliderManager; |  | ||||||
| 
 |  | ||||||
| // 碰撞体
 | // 碰撞体
 | ||||||
| class Collider : | class Collider : | ||||||
| 	public Object | 	public Object | ||||||
|  |  | ||||||
							
								
								
									
										101
									
								
								core/e2dcommon.h
								
								
								
								
							
							
						
						
									
										101
									
								
								core/e2dcommon.h
								
								
								
								
							|  | @ -523,80 +523,6 @@ protected: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // 帧动画
 |  | ||||||
| class Animation : |  | ||||||
| 	public Object |  | ||||||
| { |  | ||||||
| public: |  | ||||||
| 	Animation(); |  | ||||||
| 
 |  | ||||||
| 	Animation( |  | ||||||
| 		const std::vector<Image*>& frames	/* 关键帧数组 */ |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	Animation( |  | ||||||
| 		double interval						/* 帧间隔(秒) */ |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	Animation( |  | ||||||
| 		double interval,					/* 帧间隔(秒) */ |  | ||||||
| 		const std::vector<Image*>& frames	/* 关键帧数组 */ |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 创建帧动画
 |  | ||||||
| 	static Animation * create(); |  | ||||||
| 
 |  | ||||||
| 	// 创建帧动画
 |  | ||||||
| 	static Animation * create( |  | ||||||
| 		const std::vector<Image*>& frames	/* 关键帧数组 */ |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 创建特定帧间隔的帧动画
 |  | ||||||
| 	static Animation * create( |  | ||||||
| 		double interval						/* 帧间隔(秒) */ |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 创建特定帧间隔的帧动画
 |  | ||||||
| 	static Animation * create( |  | ||||||
| 		double interval,					/* 帧间隔(秒) */ |  | ||||||
| 		const std::vector<Image*>& frames	/* 关键帧数组 */ |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	virtual ~Animation(); |  | ||||||
| 
 |  | ||||||
| 	// 添加关键帧
 |  | ||||||
| 	void add( |  | ||||||
| 		Image * frame	/* 关键帧 */ |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 添加多个关键帧
 |  | ||||||
| 	void add( |  | ||||||
| 		const std::vector<Image*>& frames	/* 关键帧列表 */ |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 获取帧间隔
 |  | ||||||
| 	double getInterval() const; |  | ||||||
| 
 |  | ||||||
| 	// 获取关键帧
 |  | ||||||
| 	const std::vector<Image*>& getFrames() const; |  | ||||||
| 
 |  | ||||||
| 	// 设置每一帧的时间间隔
 |  | ||||||
| 	void setInterval( |  | ||||||
| 		double interval		/* 帧间隔(秒) */ |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 获取动画的拷贝对象
 |  | ||||||
| 	virtual Animation * clone() const; |  | ||||||
| 
 |  | ||||||
| 	// 销毁对象
 |  | ||||||
| 	virtual void onDestroy() override; |  | ||||||
| 
 |  | ||||||
| protected: |  | ||||||
| 	double	_interval; |  | ||||||
| 	std::vector<Image*> _frames; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class Node; | class Node; | ||||||
| class SceneManager; | class SceneManager; | ||||||
| class Transition; | class Transition; | ||||||
|  | @ -688,31 +614,4 @@ protected: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| template <typename Type, typename... Types> |  | ||||||
| inline Type * Create(Types&&... args) |  | ||||||
| { |  | ||||||
| 	auto newObj = new (std::nothrow) Type(std::forward<Types>(args)...); |  | ||||||
| 	if (newObj) |  | ||||||
| 	{ |  | ||||||
| 		newObj->autorelease(); |  | ||||||
| 		return newObj; |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 	{ |  | ||||||
| 		return nullptr; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| template <typename Type> |  | ||||||
| inline void SafeRelease(Type*& p) |  | ||||||
| {  |  | ||||||
| 	if (p != nullptr) |  | ||||||
| 	{  |  | ||||||
| 		p->release();  |  | ||||||
| 		p = nullptr;  |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| } | } | ||||||
|  | @ -15,29 +15,6 @@ class Player; | ||||||
| class Collider; | class Collider; | ||||||
| class Transition; | class Transition; | ||||||
| 
 | 
 | ||||||
| // 对象管理器
 |  | ||||||
| class ObjectManager |  | ||||||
| { |  | ||||||
| 	friend Game; |  | ||||||
| 	friend Object; |  | ||||||
| 
 |  | ||||||
| public: |  | ||||||
| 	// 释放垃圾对象的内存空间
 |  | ||||||
| 	static void flush(); |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
| 	// 将对象放入内存池进行管理
 |  | ||||||
| 	static void __add( |  | ||||||
| 		Object * pObject |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	// 更新对象管理器
 |  | ||||||
| 	static void __update(); |  | ||||||
| 
 |  | ||||||
| 	// 清空所有对象
 |  | ||||||
| 	static void __clear(); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| // 场景管理器
 | // 场景管理器
 | ||||||
| class SceneManager | class SceneManager | ||||||
|  |  | ||||||
|  | @ -197,6 +197,7 @@ | ||||||
|   </ItemDefinitionGroup> |   </ItemDefinitionGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClCompile Include="..\..\core\Action\Action.cpp" /> |     <ClCompile Include="..\..\core\Action\Action.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Action\Animation.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\CallFunc.cpp" /> |     <ClCompile Include="..\..\core\Action\CallFunc.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\Delay.cpp" /> |     <ClCompile Include="..\..\core\Action\Delay.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\JumpBy.cpp" /> |     <ClCompile Include="..\..\core\Action\JumpBy.cpp" /> | ||||||
|  | @ -215,6 +216,7 @@ | ||||||
|     <ClCompile Include="..\..\core\Action\ActionGradual.cpp" /> |     <ClCompile Include="..\..\core\Action\ActionGradual.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Action\Spawn.cpp" /> |     <ClCompile Include="..\..\core\Action\Spawn.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Game.cpp" /> |     <ClCompile Include="..\..\core\Base\Game.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\core\Base\GC.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Input.cpp" /> |     <ClCompile Include="..\..\core\Base\Input.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Renderer.cpp" /> |     <ClCompile Include="..\..\core\Base\Renderer.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Base\Time.cpp" /> |     <ClCompile Include="..\..\core\Base\Time.cpp" /> | ||||||
|  | @ -224,7 +226,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Collider\ColliderEllipse.cpp" /> |     <ClCompile Include="..\..\core\Collider\ColliderEllipse.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Collider\ColliderRect.cpp" /> |     <ClCompile Include="..\..\core\Collider\ColliderRect.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Collider\Collision.cpp" /> |     <ClCompile Include="..\..\core\Collider\Collision.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Animation.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Common\Color.cpp" /> |     <ClCompile Include="..\..\core\Common\Color.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Function.cpp" /> |     <ClCompile Include="..\..\core\Common\Function.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Common\Object.cpp" /> |     <ClCompile Include="..\..\core\Common\Object.cpp" /> | ||||||
|  | @ -236,7 +237,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Custom\CustomTextRenderer.cpp" /> |     <ClCompile Include="..\..\core\Custom\CustomTextRenderer.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Manager\ActionManager.cpp" /> |     <ClCompile Include="..\..\core\Manager\ActionManager.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Manager\InputManager.cpp" /> |     <ClCompile Include="..\..\core\Manager\InputManager.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Manager\ObjectManager.cpp" /> |  | ||||||
|     <ClCompile Include="..\..\core\Manager\ColliderManager.cpp" /> |     <ClCompile Include="..\..\core\Manager\ColliderManager.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Manager\SceneManager.cpp" /> |     <ClCompile Include="..\..\core\Manager\SceneManager.cpp" /> | ||||||
|     <ClCompile Include="..\..\core\Node\Button.cpp" /> |     <ClCompile Include="..\..\core\Node\Button.cpp" /> | ||||||
|  |  | ||||||
|  | @ -54,9 +54,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Manager\ActionManager.cpp"> |     <ClCompile Include="..\..\core\Manager\ActionManager.cpp"> | ||||||
|       <Filter>Manager</Filter> |       <Filter>Manager</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Manager\ObjectManager.cpp"> |  | ||||||
|       <Filter>Manager</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Node\Button.cpp"> |     <ClCompile Include="..\..\core\Node\Button.cpp"> | ||||||
|       <Filter>Node</Filter> |       <Filter>Node</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  | @ -207,9 +204,6 @@ | ||||||
|     <ClCompile Include="..\..\core\Action\Animate.cpp"> |     <ClCompile Include="..\..\core\Action\Animate.cpp"> | ||||||
|       <Filter>Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\..\core\Common\Animation.cpp"> |  | ||||||
|       <Filter>Common</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|     <ClCompile Include="..\..\core\Action\JumpBy.cpp"> |     <ClCompile Include="..\..\core\Action\JumpBy.cpp"> | ||||||
|       <Filter>Action</Filter> |       <Filter>Action</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  | @ -225,6 +219,12 @@ | ||||||
|     <ClCompile Include="..\..\core\Collider\Collision.cpp"> |     <ClCompile Include="..\..\core\Collider\Collision.cpp"> | ||||||
|       <Filter>Collider</Filter> |       <Filter>Collider</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Action\Animation.cpp"> | ||||||
|  |       <Filter>Action</Filter> | ||||||
|  |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\core\Base\GC.cpp"> | ||||||
|  |       <Filter>Base</Filter> | ||||||
|  |     </ClCompile> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClInclude Include="..\..\core\easy2d.h" /> |     <ClInclude Include="..\..\core\easy2d.h" /> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue