cocos2d-x中封装CCMenuItem等相关按钮,但是有些时候需要自己封装按钮,这样能够更加灵活的实现对应功能。

自定义Button,需要重写OnEnter()和onExit()函数,并在对应函数中添加注册和取消注册。

BaseButton.h内容

 #ifndef BaseButton_H_H
#define BaseButton_H_H #include "cocos2d.h"
using namespace cocos2d; typedef SEL_CallFunc v_callback; class BaseButton : public CCNodeRGBA, public CCTargetedTouchDelegate
{
public:
BaseButton() : sprite1(NULL), sprite2(NULL), curSprite(NULL), downCallback(NULL), moveCallback(NULL), upCallback(NULL) {}
static BaseButton* create(const char* pszFileName1, const char* pszFileName2, v_callback upCallback0);
virtual bool initWithFile(const char* pszFileName1, const char* pszFileName2, v_callback upCallback0); virtual void onEnter();
virtual void onExit(); virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
//virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); void downHand(); virtual void update(); private:
CCSprite *sprite1, *sprite2, *curSprite;
//vCallback downCallback, moveCallback, upCallback;
//void (*downCallback)(void);
void (*moveCallback)(void);
//void (*upCallback)(void);
v_callback downCallback;
v_callback upCallback;
}; #endif

BaseButton.cpp内容

 #include "BaseButton.h"

 BaseButton* BaseButton::create(const char* pszFileName1, const char* pszFileName2, v_callback upCallback0)
{
BaseButton *button = new BaseButton();
if(button && button->initWithFile(pszFileName1, pszFileName2, upCallback0)){
button->autorelease();
return button;
}
CC_SAFE_DELETE(button);
return NULL;
} bool BaseButton::initWithFile(const char* pszFileName1, const char* pszFileName2, v_callback upCallback0)
{
if( !CCNodeRGBA::init() ){
return false;
}
if(pszFileName1 == NULL){
return false;
} sprite1 = CCSprite::create( pszFileName1 );
CCSize size = sprite1->getContentSize();
if(pszFileName2 != NULL){
sprite2 = CCSprite::create( pszFileName2 );
}
else{
sprite2 = CCSprite::create( pszFileName1 );
sprite2->setColor( ccc3(, , ) );
sprite2->setOpacity( (GLubyte)(*0.7) );
}
sprite2->setVisible(false);
sprite2->setScaleX(size.width/sprite2->getContentSize().width);
sprite2->setScaleY(size.height/sprite2->getContentSize().height);
addChild(sprite1);
addChild(sprite2);
curSprite = sprite1; downCallback = (SEL_CallFunc)(&BaseButton::downHand);
upCallback = upCallback0; scheduleUpdate(); return true;
} void BaseButton::onEnter()
{
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, , true);
} void BaseButton::onExit()
{
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
} bool BaseButton::ccTouchBegan(CCTouch* pTouch, CCEvent *pEvent)
{
//CCPoint point = pTouch->getLocation();
CCPoint point = this->convertTouchToNodeSpaceAR(pTouch);
if( sprite1->boundingBox().containsPoint(point) ){
if(downCallback != NULL){
(this->*downCallback)();
}
return true;
}
return false;
} void BaseButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
if(moveCallback != NULL){
moveCallback();
}
} void BaseButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
sprite2->setVisible(false);
sprite1->setVisible(true);
if(upCallback != NULL){
//upCallback();
(this->*upCallback)();
}
//CCMessageBox("Up", "Info");
} void BaseButton::downHand()
{
sprite1->setVisible(false);
sprite2->setVisible(true);
} void BaseButton::update()
{ }

MyScene.h内容

 #ifndef MyScene_H_H
#define MyScene_H_H #include "cocos2d.h"
using namespace cocos2d; class MyScene : public CCLayer
{
public:
static CCScene* createScene();
virtual bool init();
CREATE_FUNC( MyScene ); void upCallback(); private:
}; #endif

MyScene.cpp内容

 #include "MyScene.h"
#include "BaseButton.h" CCScene* MyScene::createScene()
{
CCScene *scene = CCScene::create();
MyScene *layer = MyScene::create();
scene->addChild(layer);
return scene;
}; bool MyScene::init()
{
if( !CCLayer::init() ){
return false;
} CCSize size = CCDirector::sharedDirector()->getWinSize(); BaseButton *button = BaseButton::create("pal_2.png", "pal_3.png", (v_callback)(&MyScene::upCallback1) );
button->setAnchorPoint(ccp(0.5, 0.5));
button->setPosition(, size.height/);
button->setScale(0.25f);
addChild(button); BaseButton *button2 = BaseButton::create("pal_2.png", "pal_3.png", (v_callback)(&MyScene::upCallback2) );
button2->setAnchorPoint(ccp(0.5, 0.5));
button2->setPosition(, size.height/);
button2->setScale(0.25f);
addChild(button2); return true;
} void MyScene::upCallback1()
{
CCMessageBox("Up1", "Info");
} void MyScene::upCallback2()
{
CCMessageBox("Up2", "Info");
}

运行结果:

这里的button响应函数使用的是成员函数指针,需要通过对象进行使用,如(this->*upCallback)()。

而普通的函数指针则需要是static函数,成员函数则会出现错误。

cocos2d-x学习记录6——自定义Button的更多相关文章

  1. jQuery Moblile Demos学习记录Theming、Button、Icons图标,脑子真的不好使。

    jQuery Moblile Demos学习记录Theming.Button.Icons图标,脑子真的不好使. 06. 二 / Jquery Mobile 前端 / 没有评论   本文来源于www.i ...

  2. Yii2的相关学习记录,自定义gii模板和引用vendor中的js、css(四)

    上文中后台模板框架已经搭建起来了,但还是有些不协调,像是有两个User标题,或者我们想自己在gii生成时添加或删除些公用的东西.这就需要我们定义自己的gii模板. 我们以CRUD的模板为例,默认的gi ...

  3. 中级实训Android学习记录——Toast、AlertDialog、ProgressBar

    学习记录 2020/11/22 Toast Toast Toast是一个消息提示组件 我们可以设置其显示的位置 自定义其显示的内容 对Toast的简单封装可以达到不同的目的 Toast的默认用法 To ...

  4. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  5. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  6. UWP学习记录6-设计和UI之控件和模式3

    UWP学习记录6-设计和UI之控件和模式3 1.按钮 按钮,响应用户输入和引发 Click 事件的控件. 使用<Button>就能创建一个按钮控件了.按钮是 ContentControl, ...

  7. UWP学习记录3-设计和UI之样式

    UWP学习记录3-设计和UI之样式 1.颜色 在系统的“设置”>“个性化”>“颜色”里,提供了主题色选择.选定主题色后,会根据颜色亮度的 HSB 值创建浅色和深色的主题色. 应用可使用阴影 ...

  8. UWP学习记录2-设计和UI之布局

    UWP学习记录2-设计和UI之布局 1.导航基础知识 应用里,多个页面会有层次关系或者对等关系.这两种关系,通常在一个复杂应用里都会存在,而关系的选定依据: 对于对等导航,一般用选项卡(tabs)或者 ...

  9. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

随机推荐

  1. Python+Selenium笔记(十七):操作cookie

    (一)方法 方法 简单说明 add_cookie(cookie_dict) 在当前会话中添加cookie信息 cookie_dict:字典,name和value是必须的 delete_all_cook ...

  2. (转)在.net中检索HTTP请求

    原文转载:https://www.west-wind.com/presentations/dotnetWebRequest/dotnetWebRequest.htm HTTP内容检索是应用程序的重要组 ...

  3. jquery实现显示textarea输入字符数

    起初会想到使用keyup.keydown.keypress或者是onchange事件,onchange需要失去焦点才触发, 其它三个有些对按住键盘某个键不放不生效,有些对使用中文输入法正在输入时统计不 ...

  4. js拼接table查询信息部分

    其一: $("#datagrid").empty(); var a=0; <order-rows> a++; $("#datagrid").appe ...

  5. jmeter教程--简单的做压力测试

    Jmeter是一个非常好用的压力测试工具.  Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好. 什么是压力测试 顾名思义:压力测试,就是  被测试的系统,在 ...

  6. ln 硬链接介绍

    硬链接:在linux文件系统中多个文件名指向同一个索引节点(Inode)是正常允许的.硬链接文件就相当于文件的另一个入口. 硬链接的作用:允许一个文件拥有多个有效路径(多个入口),这样用户就可以建立硬 ...

  7. 匿名访问windows server 2008 R2 文件服务器的共享

    匿名访问windows server 2008 R2 文件服务器的共享 匿名访问windows 2008 R2 文件服务器的共享,七步:第一步 取消简单文件共享:第二步 设置需要共享的文件夹every ...

  8. js常见执行方法window.onload = function (){},$(document).ready()

    1. window.onload = function(){}; 当页面DOM对象加载完毕,web浏览器能够运行JS时,此方法即被触发. 2. $(document).ready();当web页面以及 ...

  9. [技术] OIer的C++标准库 : STL入门

    注: 本文主要摘取STL在OI中的常用技巧应用, 所以可能会重点说明容器部分和算法部分, 且不会讨论所有支持的函数/操作并主要讨论 C++11 前支持的特性. 如果需要详细完整的介绍请自行查阅标准文档 ...

  10. 51nod 1636 教育改革

    题目链接 令f[i][j][k]为第i天选择的课程为j,设置作业为a[j]+k时的最大作业量. 那么f[i][j][k]可以由哪些状态转移而来?先把课程按复杂度排序,那么可以转移来的课程是f[i-1] ...