您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x 显示触摸操作(显示水波点击效果,用于视频演示)-性能改造

2014-05-25 03:54 471 查看
http://blog.csdn.net/hitwhylz/article/details/26042751

首先是显示触摸操作在文章最后,对性能进行一些提升改造。

因为要演示我们的作品。使用试玩过程中, 如果没办法显示我们的触摸操作(像录制视频一样, 点击了屏幕某点, 出现红点或者水波荡漾这样的效果), 那样的话演示效果不好。观众就无法直观的了解我们的游戏。所以考虑加入这个功能。

之后, 走了点弯路。一直在考虑手机本身有没有这个功能,后来找了很久。非越狱iPhone是没有这个功能的。

于是乎, 自己写呗。

具体效果如下:



实现很简单,主要用到了一个粒子效果。

具体步骤如下:

0.导入粒子效果文件. showClick.png + showClick.plist(可在我给出的demo中下载)

1.开启触摸

2.在ccTouchBegan中获取触摸点

3.在该触摸点中添加粒子效果

好了。下面给出具体代码。

当然, 也可以去我的Github中下载源码:

https://github.com/colin1994/showClickTest

代码如下:(注意:在头文件添加 USING_NS_CC;亦可但是必须添加)

HelloWorld.h

[cpp] view
plaincopy





#ifndef __HELLOWORLD_SCENE_H__

#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

using namespace cocos2d;

class HelloWorld : public cocos2d::CCLayer

{

public:

// Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)

virtual bool init();

// there's no 'id' in cpp, so we recommend to return the class instance pointer

static cocos2d::CCScene* scene();

// a selector callback

void menuCloseCallback(CCObject* pSender);

// preprocessor macro for "static create()" constructor ( node() deprecated )

CREATE_FUNC(HelloWorld);

//进入, 退出响应

virtual void onEnter();

virtual void onExit();

//触屏逻辑函数

virtual void registerWithTouchDispatcher(void);

virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

};

#endif // __HELLOWORLD_SCENE_H__

HelloWorld.m

[cpp] view
plaincopy





#include "HelloWorldScene.h"

#include "SimpleAudioEngine.h"

using namespace cocos2d;

using namespace CocosDenshion;

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()

{

//////////////////////////////

// 1. super init first

if ( !CCLayer::init() )

{

return false;

}

return true;

}

void HelloWorld::menuCloseCallback(CCObject* pSender)

{

CCDirector::sharedDirector()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

exit(0);

#endif

}

#pragma mark - enter,exit

//进入响应函数

void HelloWorld::onEnter()

{

CCLayer::onEnter();

//进入开启触摸

this->setTouchEnabled(true);

}

//退出响应函数

void HelloWorld::onExit()

{

CCLayer::onExit();

}

#pragma mark - 触摸事件

void HelloWorld::registerWithTouchDispatcher()

{

//kCCMenuHandlerPriority=-128,将这个值设置为-128的二倍,可以比下边的层的优先级高

//而且ccTouchBegan的返回值为true,说明其他的层将接受不到这个触摸消息了,只有这个层上边的

//菜单的优先级比他还要打,所以它上边的菜单是可以接收到触摸消息的

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,

kCCMenuHandlerPriority*2,true);

}

//触摸事件

bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)

{

//获得触摸点坐标

CCPoint touchLocation = pTouch->getLocation();

CCParticleSystemQuad *mParticle = CCParticleSystemQuad::create("showClick.plist");

mParticle->setScale(0.5f);

mParticle->setPosition(touchLocation);

//如果不设置,粒子播放后内存不释放

mParticle->setAutoRemoveOnFinish(true);

this->addChild(mParticle);

return false;

}

=============

2次改造性能提升

ParticleBatchNode可以引用且只可以引用1个texture(一个图片文件,一个texture图集),增加到SpriteBatchNode中的ParticleSystem都是在OpenGL ES调用绘图函数时绘制的。

如果ParticleSystem没有增加到ParticleBatchNode中,OpenGL ES会调用每个粒子系统的绘图函数,这样做效率会比较低。
bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)

{

//获得触摸点坐标

CCPoint touchLocation = pTouch->getLocation();

CCParticleSystemQuad *mParticle = CCParticleSystemQuad::create("showClick.plist");

mParticle->setScale(0.5f);

mParticle->setPosition(touchLocation);

//添加ParticleBatchNode

mParticle->retain();

CCParticleBatchNode *batch = CCParticleBatchNode::createWithTexture(mParticle->getTexture());

batch->addChild(mParticle);

this->addChild(batch);

mParticle->release();

return false;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐