【Cocos2dx】精灵触摸跳跃功能

【Cocos2dx】精灵触摸跳跃功能,第1张

概述用户触摸屏幕,然后游戏主角跳跃,或者你让它做其它的事情等,这也是在手游中极其常见的动作。 再Cocos2dx实现起来其实就是《【Cocos2dx】触摸事件》(点击打开链接)与《【Cocos2dx】基本动作、动作序列与动作合并》(点击打开链接)两者的结合,相当简单的。 下面用一个小例子说明这个制作过程: 触摸(点击)屏幕,我们的关闭按钮会上升一段距离,同时,在其“跳跃”的过程不会出现违反常规的2段跳

用户触摸屏幕,然后游戏主角跳跃,或者你让它做其它的事情等,这也是在手游中极其常见的动作。

再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__

2、之后的任务就是在HelloWorldScene.cpp实现这些函数、使用这些变量。修改其中的初始化函数init(),初始化中,在场景中摆一只精灵,并且将是否跳跃的flag设置为false。关键是用户触摸屏幕的事件的实现,开始先判断精灵是否在跳跃,如果是,则直接结束这个函数。

否则,先将跳跃的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 instancebool 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,跳跃才刚开始呢!根本没有一个等待跳跃动作结束之后才将flag改成false的过程。

总结

以上是内存溢出为你收集整理的【Cocos2dx】精灵触摸跳跃功能全部内容,希望文章能够帮你解决【Cocos2dx】精灵触摸跳跃功能所遇到的程序开发问题。

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

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

原文地址: https://outofmemory.cn/web/1072493.html

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

发表评论

登录后才能评论

评论列表(0条)

保存