zoukankan      html  css  js  c++  java
  • cocos2d-x 显示触摸操作(单击显示效果浪潮,对于视频演示)-绩效转型

    http://blog.csdn.net/hitwhylz/article/details/26042751

    首先是显示触摸操作

    在文章最后。对性能进行一些提升改造。

    由于要演示我们的作品。使用试玩过程中, 假设没办法显示我们的触摸操作(像录制视频一样, 点击了屏幕某点, 出现红点或者水波荡漾这种效果), 那样的话演示效果不好。观众就无法直观的了解我们的游戏。

    所以考虑增加这个功能。

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

    非越狱iPhone是没有这个功能的。

    于是乎, 自己写呗。

    详细效果例如以下:



    实现非常easy,主要用到了一个粒子效果。

    详细过程例如以下:

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

    1.开启触摸

    2.在ccTouchBegan中获取触摸点

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


    好了。

    以下给出详细代码。

    当然, 也能够去我的Github中下载源代码:

    https://github.com/colin1994/showClickTest


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

    HelloWorld.h

    1. #ifndef __HELLOWORLD_SCENE_H__  
    2. #define __HELLOWORLD_SCENE_H__  
    3.   
    4. #include "cocos2d.h"  
    5. using namespace cocos2d;  
    6.   
    7. class HelloWorld : public cocos2d::CCLayer  
    8. {  
    9. public:  
    10.     // Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)  
    11.     virtual bool init();  
    12.   
    13.     // there's no 'id' in cpp, so we recommend to return the class instance pointer  
    14.     static cocos2d::CCScene* scene();  
    15.       
    16.     // a selector callback  
    17.     void menuCloseCallback(CCObject* pSender);  
    18.   
    19.     // preprocessor macro for "static create()" constructor ( node() deprecated )  
    20.     CREATE_FUNC(HelloWorld);  
    21.       
    22.       
    23.     //进入, 退出响应  
    24.     virtual void onEnter();  
    25.     virtual void onExit();  
    26.       
    27.     //触屏逻辑函数  
    28.     virtual void registerWithTouchDispatcher(void);  
    29.     virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);  
    30. };  
    31.   
    32. #endif // __HELLOWORLD_SCENE_H__  

    HelloWorld.m

    1. #include "HelloWorldScene.h"  
    2. #include "SimpleAudioEngine.h"  
    3.   
    4. using namespace cocos2d;  
    5. using namespace CocosDenshion;  
    6.   
    7. CCScene* HelloWorld::scene()  
    8. {  
    9.     // 'scene' is an autorelease object  
    10.     CCScene *scene = CCScene::create();  
    11.       
    12.     // 'layer' is an autorelease object  
    13.     HelloWorld *layer = HelloWorld::create();  
    14.   
    15.     // add layer as a child to scene  
    16.     scene->addChild(layer);  
    17.   
    18.     // return the scene  
    19.     return scene;  
    20. }  
    21.   
    22.   
    23. // on "init" you need to initialize your instance  
    24. bool HelloWorld::init()  
    25. {  
    26.     //////////////////////////////  
    27.     // 1. super init first  
    28.     if ( !CCLayer::init() )  
    29.     {  
    30.         return false;  
    31.     }  
    32.   
    33.       
    34.     return true;  
    35. }  
    36.   
    37. void HelloWorld::menuCloseCallback(CCObject* pSender)  
    38. {  
    39.     CCDirector::sharedDirector()->end();  
    40.   
    41. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)  
    42.     exit(0);  
    43. #endif  
    44. }  
    45.   
    46.   
    47. #pragma mark - enter,exit  
    48. //进入响应函数  
    49. void HelloWorld::onEnter()  
    50. {  
    51.     CCLayer::onEnter();  
    52.     //进入开启触摸  
    53.     this->setTouchEnabled(true);  
    54. }  
    55. //退出响应函数  
    56. void HelloWorld::onExit()  
    57. {  
    58.     CCLayer::onExit();  
    59. }  
    60.   
    61. #pragma mark - 触摸事件  
    62.   
    63. void HelloWorld::registerWithTouchDispatcher()  
    64. {  
    65.     //kCCMenuHandlerPriority=-128,将这个值设置为-128的二倍。能够比下边的层的优先级高  
    66.     //并且ccTouchBegan的返回值为true,说明其它的层将接受不到这个触摸消息了,仅仅有这个层上边的  
    67.     //菜单的优先级比他还要打,所以它上边的菜单是能够接收到触摸消息的  
    68.     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,  
    69.                                                                             kCCMenuHandlerPriority*2,true);  
    70. }  
    71. //触摸事件  
    72. bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)  
    73. {  
    74.     //获得触摸点坐标  
    75.     CCPoint touchLocation = pTouch->getLocation();  
    76.       
    77.     CCParticleSystemQuad *mParticle =  CCParticleSystemQuad::create("showClick.plist");  
    78.     mParticle->setScale(0.5f);  
    79.     mParticle->setPosition(touchLocation);  
    80.     //假设不设置,粒子播放后内存不释放  
    81.     mParticle->setAutoRemoveOnFinish(true);  
    82.     this->addChild(mParticle);  
    83.       
    84.     return false;  
    85. }  

    =============
    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;  
    }  
  • 相关阅读:
    分享8个超棒的免费高质量图标搜索引擎
    分享25个几何元素在网页设计中的应用案例
    推荐16个国外的源码下载网站
    分享20佳好玩的 jQuery 游戏
    快手基于 Flink 的持续优化与实践
    我的2007
    安装GPhone SDK
    asp.net如何取得纯客户端控件的值
    1111
    .NET与java的MVC模式(2):struts2核心工作流程与原理
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4622029.html
Copyright © 2011-2022 走看看