大佬教程收集整理的这篇文章主要介绍了【Cocos2dx】精灵触摸跳跃功能,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
用户触摸屏幕,然后游戏主角跳跃,或者你让它做其它的事情等,这也是在手游中极其常见的动作。
再Cocos2dx实现起来其实就是《【Cocos2dx】触摸事件》(点击打开链接)与《【Cocos2dx】基本动作、动作序列与动作合并》(点击打开链接)两者的结合,相当简单的。
下面用一个小例子说明这个制作过程:
触摸(点击)屏幕,我们的关闭按钮会上升一段距离,同时,在其“跳跃”的过程不会出现违反常规的2段跳,N段跳,当然你后续改改代码也可以实现2段跳之类的特效。
具体制作过程如下:
0、首先利用(cocos2d-x-2.2.6安装目录).\tools\project-creator下的create_project.py创建一个TouchJump的Cocos2dx工程,之后打开其中的proj.win32中的HelloCpp.sln利用vs2010进行编辑,先在AppDelegate.h关闭调试信息,设置窗口大小。这些简单的创建Cocos2dx工程步骤,我就不再赘述了。
1、之后由于要在HelloWorldScene.h声明触摸事件,精灵等属于Cocos2dx东西,因此要在此文件的开始声明使用COcos2dx的命名空间。同时注意在头文件类中不可以对任何一个变量进行初始化,因为C++要求只有静态常量整型数据成员才可以在类中初始化,删去HelloWorldScene.h中的无用的,自带关闭按钮回调函数声明,HelloWorldScene.h修改之后的代码如下:
#ifndef __HelLOWORLD_SCENE_H__ #define __HelLOWORLD_SCENE_H__ #include "cocos2d.h" using namespace cocos2d; class HelloWorld : public cocos2d::CCLayer { public: // Here's a difference. Method 'init' in cocos2d-x returns bool,instead of returning 'id' in cocos2d-iphone virtual bool init(); // there's no 'id' in cpp,so we recommend returning the class instance pointer static cocos2d::CCScene* scene(); //触摸事件的函数声明 void ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent);//开始触摸 //声明跳跃结束的回调函数 void jumpEnd(); // implement the "static node()" method manually CREATE_FUNC(HelloWorld); private: CCSprite* sprite1;//精灵1 bool isJumping;//是否跳跃的flag }; #endif // __HelLOWORLD_SCENE_H__
否则,先将跳跃的flag设置为true,让精灵跳跃后,如同《【Cocos2dx】动作监听》(点击打开链接)一样,监听此动作结束之后,将跳跃的flag重新设置为false。
#include "HelloWorldScene.h" USING_NS_Cc; CCScene* HelloWorld::scene() { // 'scene' is an autorelease object CCScene *scene = CCScene::create(); // 'layer' is an autorelease object HelloWorld *layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene; } // on "init" you need to initialize your instance bool HelloWorld::init() { //获取用于屏幕的尺寸等 CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); //声明这个场景是存在触摸事件的 this->setTouchEnabled(true); //添加一只 关闭按钮 的精灵 sprite1 = CCSprite::create("CloseSELEcted.png"); sprite1->setPosition(ccp(visibleSize.width / 2,visibleSize.height / 6)); this->addChild(sprite1); //开始精灵处于未跳跃的状态,由于头文件中“只有静态常量整型数据成员才可以在类中初始化”,因此在这里初始化声明变量 isJumping=false; return true; } //开始触摸 void HelloWorld::ccTouchesBegan(cocos2d::CCSet *pTouches,cocos2d::CCEvent *pEvent){ //获取屏幕的尺寸、位置信息等 CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); //如果主角还在跳跃中,则不重复执行 if(isJumping) { return; } //标记主角为跳跃状态 isJumping = true; //在2.0秒内,先跳起 屏幕尺寸的1/2 再落下0px,该动作重复1次 CCJumpBy* jump = CCJumpBy::create(2.0f,ccp(0,0),visibleSize.height / 2,1); //创建回调函数,声明跳跃结束后调用jumpEnd函数 CCCallFunc* callFunc = CCCallFunc::create(this,callfunc_SELEctor(HelloWorld::jumpEnd)); //将回调函数与跳跃动作结合起来 CCActionInterval* jumpActions = CCSequence::create(jump,callFunc,null); //执行动作 sprite1->runAction(jumpActions); /*错误示范 sprite1->runAction(jump); isJumping = false; */ }; void HelloWorld::jumpEnd() { isJumping = false; }
这个不行,因为你在跳跃之后,将flag秒改成false,跳跃才刚开始呢!根本没有一个等待跳跃动作结束之后才将flag改成false的过程。
以上是大佬教程为你收集整理的【Cocos2dx】精灵触摸跳跃功能全部内容,希望文章能够帮你解决【Cocos2dx】精灵触摸跳跃功能所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。