cocos2d-x学习记录6——自定义Button
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的更多相关文章
- jQuery Moblile Demos学习记录Theming、Button、Icons图标,脑子真的不好使。
jQuery Moblile Demos学习记录Theming.Button.Icons图标,脑子真的不好使. 06. 二 / Jquery Mobile 前端 / 没有评论 本文来源于www.i ...
- Yii2的相关学习记录,自定义gii模板和引用vendor中的js、css(四)
上文中后台模板框架已经搭建起来了,但还是有些不协调,像是有两个User标题,或者我们想自己在gii生成时添加或删除些公用的东西.这就需要我们定义自己的gii模板. 我们以CRUD的模板为例,默认的gi ...
- 中级实训Android学习记录——Toast、AlertDialog、ProgressBar
学习记录 2020/11/22 Toast Toast Toast是一个消息提示组件 我们可以设置其显示的位置 自定义其显示的内容 对Toast的简单封装可以达到不同的目的 Toast的默认用法 To ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
- UWP学习记录6-设计和UI之控件和模式3
UWP学习记录6-设计和UI之控件和模式3 1.按钮 按钮,响应用户输入和引发 Click 事件的控件. 使用<Button>就能创建一个按钮控件了.按钮是 ContentControl, ...
- UWP学习记录3-设计和UI之样式
UWP学习记录3-设计和UI之样式 1.颜色 在系统的“设置”>“个性化”>“颜色”里,提供了主题色选择.选定主题色后,会根据颜色亮度的 HSB 值创建浅色和深色的主题色. 应用可使用阴影 ...
- UWP学习记录2-设计和UI之布局
UWP学习记录2-设计和UI之布局 1.导航基础知识 应用里,多个页面会有层次关系或者对等关系.这两种关系,通常在一个复杂应用里都会存在,而关系的选定依据: 对于对等导航,一般用选项卡(tabs)或者 ...
- Python学习记录day5
title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...
随机推荐
- Python数据类型之list和tuple
list是一种有序的集合,可以随时添加和删除其中的元素. 用len()函数可以获得list元素的个数. 用索引来访问list中每一个位置的元素,索引是从0开始的.如果要取最后一个元素,除了计算索引位置 ...
- Oracle EBS AR 贷项通知单核销取值
SELECT cm.trx_number ,fnd_flex_ext.get_segs('SQLGL', 'GL#', gcc.chart_of_accounts_id, ad.code_combin ...
- 将目录结构输出为json格式(zTree)
# -*- coding: UTF-8 -*- import json,os path = 'E:\\BACKUP' #返回空目录 def path_to_dict(path): d = {'name ...
- xml 注意事项
<?xml version="1.0" encoding="GB2312"?> xml区分大小写,只能有一个根元素,属性值必须放在引号中,空格不 ...
- 【C语言】 8421BCD码与二进制的转换
#define BCD2TODEC(bcd) (bcd) = ((bcd) & 0x0f)+ ((bcd)>>4)*10 #define BIN2BCD(bcd) (bcd) = ...
- 设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。
设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”,则抛出一个异常信息“This is a XYZ”,如果从命令行输入 ABC,则没有抛出异常.(只有 ...
- 数值分析 最小二乘 matlab
1. 已知函数在下列各点的值为 -1 -0.75 -0.5 0 0.25 0.5 0.75 1.00 0.8125 0.75 1.00 1.3125 1.75 2.3125 分别用一次.二次. ...
- 2018.09.01 09:22 Exodus
Be careful when writing in the blog garden. Sometimes you accidentally write something wrong, and yo ...
- PyQt5--QCheckBox
1 # -*- coding:utf-8 -*- ''' Created on Sep 20, 2018 @author: SaShuangYiBing Comment: ''' import sys ...
- ES6中变量解构的用途—遍历Map结构