cocos2dx 3D战斗类游戏制作:【二】——3D运动模式小准备

cocos2dx 3D战斗类游戏制作:【二】——3D运动模式小准备,第1张

概述上章讲了构建一个游戏的数据库基础,基于数据库,我们已经可以实现按照指定的灯光、摄像机位置、3D模型文件、3D模型位置等等构建起一个场景和其中的精灵。 作为一个游戏,让这些场景中的精灵动起来是必须的,然后你就会发现一个有趣的现象——cocos的demo里面(cpp-test),3D精灵展示用的是平面相机(2D)而不是投影相机(3D)。 继而你会发现一个蛋疼的事实——cocos 2D即便到3.3RC0

上章讲了构建一个游戏的数据库基础,基于数据库,我们已经可以实现按照指定的灯光、摄像机位置、3D模型文件、3D模型位置等等构建起一个场景和其中的精灵。


作为一个游戏,让这些场景中的精灵动起来是必须的,然后你就会发现一个有趣的现象——cocos的demo里面(cpp-test),3D精灵展示用的是平面相机(2D)而不是投影相机(3D)。


继而你会发现一个蛋疼的事实——cocos 2D即便到3.3RC0目前最新版本,也没有给你封装一个3D的移动方法。还是2D的moveto,moveBy那些,呵呵,只有XY轴的运动


想象2D使用moveto一样,把精灵在XYZ轴都动起来怎么办??


方法有很多,先说一个更改引擎的方法,给自己的引擎加一个MoveBy3D和Moveto3D的方法。嘿嘿。


首先,打开“盘符:\cocos目录\cocos2d\cocos\2d”下的CCActionInterval.h,添加如下代码:


//dark添加开始***********************************************************************************************************class CC_DLL MoveBy3D : public ActionInterval{public:	/** creates the action */	static MoveBy3D* create(float duration,const Vec3& deltaposition);	//	// OverrIDes	//	virtual MoveBy3D* clone() const overrIDe;	virtual MoveBy3D* reverse(voID) const  overrIDe;	virtual voID startWithTarget(Node *target) overrIDe;	virtual voID update(float time) overrIDe;CC_CONSTRUCTOR_ACCESS:	MoveBy3D() {}	virtual ~MoveBy3D() {}	/** initializes the action */	bool initWithDuration(float duration,const Vec3& deltaposition);protected:	Vec3 _positionDelta;	Vec3 _startposition;	Vec3 _prevIoUsposition;private:	CC_disALLOW_copY_AND_ASSIGN(MoveBy3D);};/** Moves a Node object to the position x,y. x and y are absolute coordinates by modifying it's position attribute.Several Moveto3D actions can be concurrently called,and the resultingmovement will be the sum of indivIDual movements.@since v2.1beta2-custom*/class CC_DLL Moveto3D : public MoveBy3D{public:	/** creates the action */	static Moveto3D* create(float duration,const Vec3& position);	//	// OverrIDes	//	virtual Moveto3D* clone() const overrIDe;	virtual voID startWithTarget(Node *target) overrIDe;CC_CONSTRUCTOR_ACCESS:	Moveto3D() {}	virtual ~Moveto3D() {}	/** initializes the action */	bool initWithDuration(float duration,const Vec3& position);protected:	Vec3 _endposition;private:	CC_disALLOW_copY_AND_ASSIGN(Moveto3D);};//dark添加到此***********************************************************************************************************



其次,打开“盘符:\cocos目录\cocos2d\cocos\2d”下的CCActionInterval.cpp,添加如下代码:


//dark添加*************************************************************************************//// MoveBy3D//MoveBy3D* MoveBy3D::create(float duration,const Vec3& deltaposition){	MoveBy3D *ret = new (std::nothrow) MoveBy3D();	ret->initWithDuration(duration,deltaposition);	ret->autorelease();	return ret;}bool MoveBy3D::initWithDuration(float duration,const Vec3& deltaposition){	if (ActionInterval::initWithDuration(duration))	{		_positionDelta = deltaposition;		return true;	}	return false;}MoveBy3D* MoveBy3D::clone() const{	// no copy constructor	auto a = new (std::nothrow) MoveBy3D();	a->initWithDuration(_duration,_positionDelta);	a->autorelease();	return a;}voID MoveBy3D::startWithTarget(Node *target){	ActionInterval::startWithTarget(target);	_prevIoUsposition = _startposition = target->getposition3D();}MoveBy3D* MoveBy3D::reverse() const{	return MoveBy3D::create(_duration,Vec3(-_positionDelta.x,-_positionDelta.y,-_positionDelta.z));}voID MoveBy3D::update(float t){	if (_target)	{#if CC_ENABLE_STACKABLE_ACTIONS		Vec3 currentPos = _target->getposition3D();		Vec3 diff = currentPos - _prevIoUsposition;		_startposition = _startposition + diff;		Vec3 newPos = _startposition + (_positionDelta * t);		_target->setposition3D(newPos);		_prevIoUsposition = newPos;#else		_target->setposition3D(_startposition + _positionDelta * t);#endif // CC_ENABLE_STACKABLE_ACTIONS	}}////Moveto3D//Moveto3D* Moveto3D::create(float duration,const Vec3& position){	Moveto3D *ret = new (std::nothrow) Moveto3D();	ret->initWithDuration(duration,position);	ret->autorelease();	return ret;}bool Moveto3D::initWithDuration(float duration,const Vec3& position){	if (ActionInterval::initWithDuration(duration))	{		_endposition = position;		return true;	}	return false;}Moveto3D* Moveto3D::clone() const{	// no copy constructor	auto a = new (std::nothrow) Moveto3D();	a->initWithDuration(_duration,_endposition);	a->autorelease();	return a;}voID Moveto3D::startWithTarget(Node *target){	MoveBy3D::startWithTarget(target);	_positionDelta = _endposition - target->getposition3D();}//dark添加到此***********************************************************************************************************

好了,搞定。


现在你就可以在程序任意地方,直接象使用Moveto方法一样,使用Moveto3D方法。不过注意了,Moveto是2D的,传入给它的参数是Vec2(x,y),而Moveto3D,你应该给它传入Vec3(x,y,z)


当然了,把3D的运动方法加在2D目录的CCActionInterval,是有点怪怪的,最好是在cocos的3D目录下建立一个单独的3D方法类来做,不过那样涉及的事情比较多,我就懒得去介绍了,呵呵。

这一章,希望让您能感受到——啊,原来参与到Cocos引擎的开发升级就是这么简单啊
不知道看完文章,您有没有这个感受,呵呵,只支持2D运动的cocos变可以支持3D运动的cocos定制版,也就是给引擎加一点代码的事情。
说点题外话,呵呵,很多程序员,把学熟一个引擎作为几乎唯一的任务,很注重的是引擎原有封装好的东西可以怎么用。这没错,不过,有时,跳出框框,想想自己能在引擎的级别做点什么,而不是一味地学怎么用,不是更好么?
引擎对于程序员,其实就像鱼、葱、油、盐、姜。非要按菜谱来,没酱油没醋没料酒没糖,前面四道原料几乎没法做菜了。但是,如果只是考虑做一道好吃的菜,而不是一定要按菜谱怎么怎么样,那么鱼、葱、油、盐、姜可蒸可煎可炸,已经可以做若干种口味的鱼了啊。

总结

以上是内存溢出为你收集整理的cocos2dx 3D战斗类游戏制作:【二】——3D运动模式小准备全部内容,希望文章能够帮你解决cocos2dx 3D战斗类游戏制作:【二】——3D运动模式小准备所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1016907.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存