`
lizaochengwen
  • 浏览: 665372 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

cocos2d-x添加触摸层阻止后端事件

 
阅读更多
     由于cocos2d-x中的优先级小的,先响应触摸事件,这是,我们只需要设置新添加的cclayer层的优先级即可,但由于ccmenu的优先级较高,所以,很有可能透过我们添加的触摸层,响应之前的绑定的button事件,而如果我们设置此触摸层优先级比button的低时,又导致在这层添加的button按钮的触摸事件不能触发,导致本层应该触摸的事件也不能响应,这样也达不到我们理想的效果:弹出一个层,屏蔽后面的事件,在当层可以有一些按钮,让我们进行不同的选择,比如确定,or 取消。
     自从cocos2d-x2.0版本后,添加了一个CCControlButton,这个优先级为0,比默认的button高,因此,我们可以在当前层添加CCControlButton,在弹出的层设置layer的优先级比0小,这样,在弹出的层添加menu就能够响应,也不会影响后面的事件。当然,由于CCControlButton的优先级是可以自动设置的,所以,我们也可以设置弹出的层为-128(或者更小),然后设置CCControlButton的优先级更小就可以了。

具体代码如下:

BlockTouchLayer *block = BlockTouchLayer::create();
this->addChild(block);

BlockTouchLayer的声明文件:
#ifndef __test__BlockTouchLayer__
#define __test__BlockTouchLayer__

#include <iostream>
#include "cocos2d.h"
#include "cocos-ext.h"
using namespace cocos2d;
class BlockTouchLayer :public CCLayerColor
{
public:
    virtual bool init();
    void initData();
    
    virtual void registerWithTouchDispatcher();  //重写触摸事件,阻止后端事件响应
    virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
    virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
    virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
    
    void callBack(CCObject *pSender);
    
    CREATE_FUNC(BlockTouchLayer);
    
};
#endif

BlockTouchLayer的具体实现文件:
#include "BlockTouchLayer.h"
USING_NS_CC_EXT;

bool BlockTouchLayer::init()
{
    ccColor4B color = {0,0,0,125};  //设置面板颜色及透明度
    if (!CCLayerColor::initWithColor(color))
    {
        return false;
    }
    initData();
    setTouchEnabled(true);   //开启触摸事件
    return true;
}
void BlockTouchLayer::initData()
{
    CCSize winsize = CCDirector::sharedDirector()->getWinSize();
    CCSprite *sp = CCSprite::create("Icon.png");
    this->addChild(sp);
    sp->setPosition(ccp(winsize.width/2,winsize.height/2));
    
    CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();
    cache->addSpriteFramesWithFile("load.plist", "load.png");
    
    CCSprite *sprite1 = CCSprite::createWithSpriteFrameName("loading1.png");
    sprite1->setPosition(ccp(winsize.width/2, winsize.height/2));
    //this->addChild(sprite1);
    
    CCSpriteBatchNode *batchNode = CCSpriteBatchNode::create("load.png");
    batchNode->addChild(sprite1);
    this->addChild(batchNode);   // 可以起到一定的优化作用,最好不要直接添加精灵
    
    CCArray *spriteArray = CCArray::create();
    char str[100] = {0};
    for (int i=1; i <= 14; i++)
    {
        sprintf(str, "loading%d.png", i);
        CCSpriteFrame *frame = cache->spriteFrameByName(str);
        spriteArray->addObject(frame);
    }
    CCAnimation *animation = CCAnimation::createWithSpriteFrames(spriteArray,0.5);
    sprite1->runAction(CCRepeatForever::create(CCAnimate::create(animation)));
    
    cocos2d::extension::CCScale9Sprite *sprite9 = cocos2d::extension::CCScale9Sprite::create("btn_blackblue.png");
    CCLabelTTF *label = CCLabelTTF::create("click me", "", 22);
    cocos2d::extension::CCControlButton *controlButton = cocos2d::extension::CCControlButton::create(label, sprite9);
    controlButton->addTargetWithActionForControlEvents(this, cccontrol_selector(BlockTouchLayer::callBack), cocos2d::extension::CCControlEventTouchDown);
    this->addChild(controlButton);
    controlButton->setPosition(ccp(winsize.width/3, winsize.height/2));
    controlButton->setTouchPriority(-200);   //设置CCControlButton的优先级
    //controlButton->setZoomOnTouchDown(true);
    
    
    
}
void BlockTouchLayer::callBack(cocos2d::CCObject *pSender)
{
    //CCNotificationCenter::sharedNotificationCenter()->postNotification("click",this);
    BlockTouchLayer *tmplayer = (BlockTouchLayer *)((CCMenu *)(pSender))->getParent();
    tmplayer->removeFromParentAndCleanup(true);    //点击按钮后,移除弹出的面板
}
void BlockTouchLayer::registerWithTouchDispatcher()
{
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -128, true);  //注册并设置当前面板触摸的优先级
}
bool BlockTouchLayer::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    return true;       // 吞噬掉后面的响应
}
void BlockTouchLayer::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    
}
void BlockTouchLayer::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    
}


原文:
http://blog.csdn.net/somestill/article/details/12752739
分享到:
评论

相关推荐

    斗地主代码,前端cocos2d,后端nodejs

    3. 事件处理:Cocos2d支持触摸事件、键盘事件等,使得玩家可以通过手势或按键进行游戏操作。 4. 游戏逻辑:Cocos2d提供的脚本语言(如Lua)可以编写游戏逻辑,如玩家出牌规则、得分计算等。 二、Node.js后端开发 ...

    legend.rar

    cocos2d-js是Cocos2d-x引擎的JavaScript版本,它提供了强大的2D游戏开发能力。该框架支持多种平台,包括浏览器、微信小程序等,让开发者能够快速构建跨平台的游戏应用。cocos2d-js的核心特性包括: 1. **丰富的图形...

    coco2d源码PandaRunDemo(熊猫快跑)

    根据提供的标题、描述以及部分可见内容,我们可以了解到这是一份关于Cocos2D框架下的一个示例项目——“PandaRunDemo(熊猫快跑)”的相关资源分享。下面将从几个方面来详细解析这个项目的背景知识和技术要点。 ###...

    网络游戏前后端(java,cocos).zip

    1. **图形渲染**:Cocos2d-x使用OpenGL ES进行图形渲染,支持丰富的2D动画效果和3D场景构建。 2. **物理引擎**:内置Box2D或Chipmunk物理引擎,用于模拟真实世界的碰撞检测和物体运动。 3. **资源管理**:Cocos...

    Node.js-一个可以使用重力感应或触摸手势控制的贪食蛇游戏.

    虽然标题中提到的是Android开发,但考虑到游戏特性,这里可能使用了一个轻量级的游戏引擎,比如Cocos2d-x或Unity,它们都支持跨平台开发,包括Android,并且可以方便地集成重力感应和触摸控制。 【Worm-master】 这...

    小小西游源码

    "小小西游"很可能使用了特定的游戏引擎来构建,可能是Unity、Cocos2d-x等。游戏引擎是游戏开发的基础,它包含了渲染、物理、音频、输入处理等多种功能模块,使得开发者可以专注于游戏逻辑而不是底层技术实现。 ...

    计算机毕业论文题目大全.pdf

    - 游戏引擎:Unity、Unreal Engine、Cocos2d-x等。 - 物理引擎:碰撞检测、动画处理。 - AI算法:路径规划、游戏AI行为。 7. **移动应用开发**: - J2ME:Java Micro Edition,用于开发移动设备应用。 - 移动...

    开发文档1

    Cocos2d-x是一个广泛使用的2D游戏开发引擎,提供了一系列的API,用于创建游戏场景、精灵、动画、物理引擎、触摸事件处理等功能。开发者可以基于这些类构建自己的游戏逻辑。 2. **music**:音乐类模块主要负责游戏的...

    Cocos Creator 笔记

    Cocos Creator是一款强大的2D和2.5D游戏开发工具,它集成了图形编辑器、脚本系统以及项目管理功能,让开发者能够高效地创建游戏并进行跨平台发布。这款工具支持JavaScript和TypeScript作为主要的编程语言,并且可以...

    node.js实现的军棋游戏.zip

    在本项目中,Cocos2d用于构建游戏界面,展示棋盘和棋子,并处理用户的触摸输入,将玩家的操作转化为网络消息发送到服务器。 游戏逻辑的实现是项目的核心部分。在Node.js服务器端,需要维护每场游戏的状态,包括棋盘...

    【大秦online端游】大秦全套游戏源码--战争策略角色扮演游戏

    2. 跨平台框架:使用如Unity或Cocos2d-x这样的跨平台游戏引擎,可以方便地将游戏移植到多个平台。 3. 同步机制:确保PC和移动端的数据同步,包括用户账号、游戏进度等,这需要后端提供相应的接口支持。 总之,...

    网页游戏开发秘笈

    常见的网页游戏引擎有Unity、Phaser、Cocos2d-x、Three.js等。这些引擎提供了丰富的功能,如2D/3D渲染、物理模拟、动画控制等。选择引擎时要考虑性能、跨平台支持、学习曲线和社区资源等因素。同时,辅助工具如...

    立项建议书:基于Android系统的小游戏---连连看

    2. **游戏引擎**:可能使用Unity3D或者Cocos2d-x等跨平台游戏引擎,以简化开发流程和提高效率。 3. **图形界面**:使用XML布局文件设计用户界面,结合Java或Kotlin实现动态效果,如动画和触摸事件处理。 4. **网络...

    安卓手游-趣味休闲-梦行者世界中文版 v1.1.zip

    1. **游戏引擎**:开发这款游戏可能使用了Unity或Cocos2d-x等主流游戏引擎,它们支持跨平台开发,能够实现高质量的图形渲染和流畅的游戏体验。 2. **编程语言**:游戏的后端逻辑可能使用Java或Kotlin编写,因为这是...

    美丽的圣诞雪花,很适合圣诞、雪花、礼物小程序,讨女生欢心哦!(这标题长了也不好说啊...)

    2. **动画效果**:圣诞雪花的动态效果是吸引用户的重要因素,可能需要使用到2D或3D图形库,如Unity3D或Cocos2d-x,来实现雪花飘落的逼真动画。 3. **交互体验**:为了使小程序更具吸引力,开发者需要考虑如何让用户...

    swyp:滑动游戏

    尽管滑动游戏的前端通常由更适合图形渲染和触摸交互的语言(如Unity、Cocos2d-x或React Native)编写,但PHP在构建游戏的后端基础设施方面具有广泛的应用。一个完整的滑动游戏开发流程会结合多种技术,包括前端的UI...

    哥们扔

    1. **图形用户界面(GUI)**:使用游戏引擎(如Unity或Cocos2d-x)或自定义UI组件创建游戏界面,确保视觉效果吸引人并且易于操作。 2. **物理引擎**:为了模拟真实的抛物线运动,游戏可能使用了物理引擎,如Box2D,...

Global site tag (gtag.js) - Google Analytics