热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[置顶]cocos2d实现类似CCMenu菜单类控件,在CCScrollView滚动,lua脚本控件

在CCScrollView中添加ccmenu实现滑动效果是不可能的,因为ccmenu的触发事件是你在touchBegan就全部捕获掉了,如果你想滑动CC

在CCScrollView中添加ccmenu实现滑动效果是不可能的,因为ccmenu的触发事件是你在touchBegan就全部捕获掉了,如果你想滑动CCScrollView取消选中这个菜单是无法实现的,.所以我们应该自己编写一个模拟ccmenu菜单的控件 ,在按下按钮后,如果不移动按钮的话,就触发触摸事件,移动的话就取消触摸事件,实现按钮在CCScrollView中的滚动效果。。。

 

开发人员:Jason's.Alex   QQ:531401335

csdn博客:http://blog.csdn.net/RuShrooM

 

 

//
// CCButtonSptite.h
// CCSpriteButton
//
// Created by jasonsalex on 13-8-6.
//
//#ifndef __CCSpriteButton__CCButtonSptite__
#define __CCSpriteButton__CCButtonSptite__#include "cocos2d.h"#define TOUCH_SENSITIVITY 20 //触摸灵敏度using namespace cocos2d;class ButtonSprite:public CCSprite,public CCTouchDelegate
{
public:ButtonSprite();virtual bool init(CCSpriteFrame *selFile,CCSpriteFrame *disFile);static ButtonSprite *create(const char *selFile,const char *disFile );static ButtonSprite *createWithSpriteFrame(CCSpriteFrame* selFrame,CCSpriteFrame *disFrame);static ButtonSprite *createWithSpriteFrameName(const char *selFile,const char * disFile);virtual ~ButtonSprite();virtual void onEnter();virtual void onExit();virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);void registerScriptTapHandler(int nHandler);void unregisterScriptTapHandler(void);private:CCSprite *selSprite; //选择的精灵CCSprite *disSprite;//不选择的精灵int m_nScriptTapHandler;//脚本函数句柄bool isEmitTouchEvent; //是否发射触摸事件CCPoint startTouchPoint; //开始的触摸坐标
};#endif /* defined(__CCSpriteButton__CCButtonSptite__) */

 

//
// CCButtonSptite.cpp
// CCSpriteButton
//
// Created by jasonsalex on 13-8-6.
//
//#include "ButtonSprite.h"
ButtonSprite * ButtonSprite::create(const char *selFile,const char *disFile )
{ButtonSprite *pRet=new ButtonSprite();if(pRet && pRet->init(CCSprite::create(selFile)->displayFrame(),CCSprite::create(disFile)->displayFrame())){pRet->autorelease();return pRet;}CC_SAFE_DELETE(pRet);return NULL;
}ButtonSprite * ButtonSprite::createWithSpriteFrame(CCSpriteFrame* selFrame,CCSpriteFrame *disFrame)
{ButtonSprite *pRet=new ButtonSprite();if(pRet && pRet->init(selFrame,disFrame)){pRet->autorelease();return pRet;}CC_SAFE_DELETE(pRet);return NULL;}ButtonSprite * ButtonSprite::createWithSpriteFrameName(const char *selFile,const char * disFile)
{ButtonSprite *pRet=new ButtonSprite();CCSpriteFrame *selFrame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(selFile);CCSpriteFrame *disFrame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(disFile);if(pRet && pRet->init(selFrame,disFrame)){pRet->autorelease();return pRet;}CC_SAFE_DELETE(pRet);return NULL;}bool ButtonSprite::init(CCSpriteFrame* selFrame,CCSpriteFrame *disFrame)
{this->disSprite=CCSprite::createWithSpriteFrame(disFrame);this->selSprite=CCSprite::createWithSpriteFrame(selFrame);this->selSprite->retain();this->disSprite->retain();if(!this->initWithSpriteFrame(selFrame))return false;return true;
}ButtonSprite::ButtonSprite():m_nScriptTapHandler(0),isEmitTouchEvent(false)
{}ButtonSprite::~ButtonSprite()
{CC_SAFE_DELETE(this->disSprite);CC_SAFE_DELETE(this->selSprite);
}void ButtonSprite::onEnter()
{CCDirector* pDirector = CCDirector::sharedDirector();pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
}void ButtonSprite::onExit()
{CCDirector* pDirector = CCDirector::sharedDirector();pDirector->getTouchDispatcher()->removeDelegate(this);}bool ButtonSprite::ccTouchBegan(CCTouch* touch, CCEvent* event)
{this->startTouchPoint = convertToNodeSpace(touch->getLocation());this->isEmitTouchEvent= this->getTextureRect().containsPoint(this->startTouchPoint);if(isEmitTouchEvent){ //如果选择了就显示禁用图像this->setDisplayFrame(disSprite->displayFrame());return true;}else {return false;}
}void ButtonSprite::ccTouchMoved(CCTouch* touch, CCEvent* event)
{float distance=this->startTouchPoint.getDistance(convertToNodeSpace(touch->getLocation()));if(abs(distance)isEmitTouchEvent=true;}else{this->isEmitTouchEvent=false;}}void ButtonSprite::ccTouchEnded(CCTouch* touch, CCEvent* event)
{if(this->isEmitTouchEvent){CCScriptEngineManager::sharedManager()->getScriptEngine()->executeEvent(this->m_nScriptTapHandler,"end"); }this->setDisplayFrame(selSprite->displayFrame()); //恢复图像
}void ButtonSprite::registerScriptTapHandler(int nHandler)
{unregisterScriptTapHandler();m_nScriptTapHandler = nHandler;
}void ButtonSprite::unregisterScriptTapHandler(void)
{if (m_nScriptTapHandler){CCScriptEngineManager::sharedManager()->getScriptEngine()->removeScriptHandler(m_nScriptTapHandler);m_nScriptTapHandler = 0;}
}


 

 

转:https://www.cnblogs.com/bbsno1/p/3268548.html



推荐阅读
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」
    android触屏处理流程,android触摸事件处理流程?FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到A ... [详细]
  •  项目地址https:github.comffmydreamWiCar界面做的很难看,美工方面实在不在行。重点是按钮触摸事件的处理,这里搬了RepeatListener项目代码,例 ... [详细]
  • 涉及的知识点-ViewGroup的测量与布局-View的测量与布局-滑动冲突的处理-VelocityTracker滑动速率跟踪-Scroller实现弹性滑动-屏幕宽高的获取等实现步 ... [详细]
  • 震惊,正儿八经的网页居然在手机上这样显示!
    本篇文章所描述的,是网页移动端开发中的一些概念,以及一些常用标签~一、像素基本知识设备物理像素:设备上的一个像素点设备无关像素࿱ ... [详细]
  • 既然HDFS是存取数据的分布式文件系统,那么对HDFS的操作,就是文件系统的基本操作,比如文件的创建、修改、删除、修改权限等,文件夹的创建、删除、重命名等。对HDFS的操作命令类似于Linux的she ... [详细]
  • linux clickhouse安装在指定目录_Centos8服务器指定目录安装配置Nginx
    1.安装前准备(1)检查是否安装过nginx(如果没有安装过可以无视)find-namenginx搜索nginx文件及其文件夹rm-rf【nginx配置地址文件及其文件夹】手动删除 ... [详细]
author-avatar
开口就笑i
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有