zoukankan      html  css  js  c++  java
  • cocos2d-x 显示触摸操作(显示水波点击效果,用于视频演示)

    昨天刚刚參加玩游戏设计大赛, 积累了一些东西。

    接下去将会逐个分享出来。


    首先是显示触摸操作

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

    观众就无法直观的了解我们的游戏。所以考虑加入这个功能。

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

    于是乎, 自己写呗。

    详细效果例如以下:



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

    详细过程例如以下:

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

    1.开启触摸

    2.在ccTouchBegan中获取触摸点

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


    好了。以下给出详细代码。

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

    https://github.com/colin1994/showClickTest


    代码例如以下:

    HelloWorld.h

    #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

    #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;
    }


    学习的路上, 与君共勉。

  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6939648.html
Copyright © 2011-2022 走看看