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;  
    }  
  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4622029.html
Copyright © 2011-2022 走看看