`
xuela_net
  • 浏览: 525673 次
文章分类
社区版块
存档分类
最新评论

Cocos2dx 之 ButtonSprite

 
阅读更多

Cocos2dx下,自己封装的一个按钮

typedef  void  (CCObject::*ButtonClick_Func)();
typedef  void  (CCObject::*ButtonClick_FuncN)(CCObject* obj);
typedef  void  (CCObject::*ButtonClick_FuncND)(CCObject* obj,void* param);


#define click_selector(_SELECTOR) (ButtonClick_Func)(&_SELECTOR)
#define click_selectorN(_SELECTOR) (ButtonClick_FuncN)(&_SELECTOR)
#define click_selectorND(_SELECTOR) (ButtonClick_FuncND)(&_SELECTOR)

//
//  ButtonSprite.h
//  Zuma_V4
//
//  Created by user on 13-1-28.
//
//

#ifndef __Zuma_V4__ButtonSprite__
#define __Zuma_V4__ButtonSprite__

#include <iostream>
#include "CallBack.h"
#include "cocos2d.h"
using namespace cocos2d;

class ButtonSprite : public CCSprite,public CCTouchDelegate
{
    // touch 事件优先级
    int m_touchPriority;
    
    bool m_isDown;
    
    // update  2013-02-17
    // click handle
    ButtonClick_Func m_BtnClick_Func;

//    int param;
public:
    ButtonSprite();
    virtual ~ButtonSprite();
       
    //
    // update  2013-02-17
    // 调整按钮的默认优先级,设置为最高优先级
    static ButtonSprite* createButtonSprite(const char* fileName,int tPriority = kCCMenuHandlerPriority);
    
    static ButtonSprite* createButtonSpriteWithSpriteFrame(CCSpriteFrame *pSpriteFrame,int tPriority = kCCMenuHandlerPriority);
    
    /* 触摸相关 */
    virtual void onEnter();
    virtual void onExit();
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    // optional
    
    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
    
    
    //update  2013-02-17
    void clicked();
    
    void setOnClickListener(ButtonClick_Func tBtnClickFunc);
};




#endif /* defined(__Zuma_V4__ButtonSprite__) */

//
//  ButtonSprite.cpp
//  Zuma_V4
//
//  Created by user on 13-1-28.
//
//

#include "ButtonSprite.h"

/**********************************************
            构造函数和析构函数
 **********************************************/
ButtonSprite::ButtonSprite():m_isDown(false)
{
    m_touchPriority = 0;
    m_BtnClick_Func = 0;
}
ButtonSprite::~ButtonSprite(){};


void ButtonSprite::onEnter(){
    CCSprite::onEnter();
    
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,m_touchPriority, true);
};
void ButtonSprite::onExit(){
    CCSprite::onExit();
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
};


bool ButtonSprite::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){
    CCPoint touchPoint = getParent()->convertTouchToNodeSpace(pTouch);
    if (boundingBox().containsPoint(touchPoint) && !m_isDown) {
        m_isDown = true;
        return true;
    }
    
    return false;
};
// optional

void ButtonSprite::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){
    
    CCPoint touchPoint = getParent()->convertTouchToNodeSpace(pTouch);

    float deltaX = pTouch->getDelta().x;
    
    deltaX = deltaX > 0 ? deltaX : -deltaX;
    
    if (!boundingBox().containsPoint(touchPoint)  || !m_isDown || deltaX > 15) {
        m_isDown = false;
        return;
    }
    
};
void ButtonSprite::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){
    CCPoint touchPoint = getParent()->convertTouchToNodeSpace(pTouch);
    if (boundingBox().containsPoint(touchPoint) && m_isDown) {
        /* 相当于产生了click事件 */
        if (m_BtnClick_Func) {
            //来个点击效果
            CCActionInterval* sAction = CCScaleTo::create(0.1, 1.2);
            CCActionInterval* sAction2 = CCScaleTo::create(0.1, 1);
            CCCallFunc*  callFun = CCCallFunc::create(this,callfunc_selector(ButtonSprite::clicked));
            runAction(CCSequence::create(sAction,sAction2,callFun,NULL));

        }
        m_isDown = false;
    }
};


void ButtonSprite::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent){
    m_isDown = false;
};

ButtonSprite* ButtonSprite::createButtonSprite(const char* fileName,int tPriority)
{
    ButtonSprite* button  = new ButtonSprite();
    button->m_touchPriority = tPriority;
    if (button && button->initWithFile(fileName)) {
        button->autorelease();
        return button;
    }
    CC_SAFE_DELETE(button);
    return button;
}


ButtonSprite* ButtonSprite::createButtonSpriteWithSpriteFrame(CCSpriteFrame *pSpriteFrame,int tPriority)
{
    ButtonSprite *pobSprite = new ButtonSprite();
    pobSprite->m_touchPriority = tPriority;
    if (pSpriteFrame && pobSprite && pobSprite->initWithSpriteFrame(pSpriteFrame))
    {
        pobSprite->autorelease();
        return pobSprite;
    }
    CC_SAFE_DELETE(pobSprite);
    return NULL;
}

//
// update
void ButtonSprite::setOnClickListener(ButtonClick_Func tBtnClickFunc)
{
    m_BtnClick_Func = tBtnClickFunc;
}

void ButtonSprite::clicked()
{
    (this->*m_BtnClick_Func)();
}

使用方式:

void MainMenu::onEnter()
{
    CCLayer::onEnter();
    
    ButtonSprite* playBtn = ButtonSprite::createButtonSprite("play.png");
    playBtn->setPosition(ccp(240, 400));
    
    playBtn->setOnClickListener(click_selector(MainMenu::btnCall));
    
    addChild(playBtn);
}

void MainMenu::btnCall()
{
    CCLog("[MainMenu::btnCall()]");
}


分享到:
评论
1 楼 fireDragonpzy 2013-07-05  
封装的很棒 mark
typedef  void  (CCObject::*ButtonClick_FuncND)(CCObject* obj,void* param); 
#define click_selector(_SELECTOR) (ButtonClick_Func)(&_SELECTOR)
不大理解,可否给解释下?
http://www.firedragonpzy.com.cn可以从这里留言或http://bbs.firedragonpzy.com.cn 这个iteye不大来。。。。万分感谢……

相关推荐

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    cocos2d-x-cocos2d-x-2.2.2.zip

    此外,cocos2d-x的事件系统也是其核心特性之一。它允许开发者方便地处理触摸、键盘、鼠标等各种输入事件,构建出响应性强的交互界面。同时,它的动作(Actions)和动画(Animations)系统,让开发者能够轻松实现复杂...

    cocos2d-android jar包全套.zip

    Cocos2d是一款开源的游戏开发框架,被广泛用于创建2D游戏、演示程序和其他互动内容。在Android平台上,Cocos2d-x是一个基于C++的版本,提供了原生的编程接口,同时也支持Java API,方便Android开发者使用。"cocos2d-...

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    《Cocos2d-x实战 JS卷 Cocos2d-JS开发》是一本深入探讨Cocos2d-x游戏引擎JavaScript版本使用的专业书籍。Cocos2d-x是全球范围内广泛采用的游戏开发框架,尤其适用于2D游戏的制作,而Cocos2d-JS则是其JavaScript接口...

    cocos2d-android.jar.zip_CoCos2d_android jar_android game_cocos2d

    cocos2d-android游戏引擎是著名游戏引擎cocos2d游戏引擎的Android版。cocos2d-android游戏引擎性能优越、易学、可以进行纯java编程、具有极高的研 究价值、大大的降低了开发者的学习成本。您只需要一台普通配置的...

    cocos2d-x API中文文档

    【cocos2d-x API中文文档】是一份详尽的资料,主要涵盖了cocos2d-x游戏引擎的API,这份文档适用于2015年的最新版本。cocos2d-x是一个基于MIT许可证的开源游戏引擎,它以快速、简单且功能强大的特性闻名,允许开发者...

    cocos2d-x_v3.16安装及环境变量配置文档

    cocos2d-x 是一个开源的游戏开发框架,使用 C++ 语言编写,支持多平台发布,包括 iOS、Android、Windows、macOS、Linux 和 Web。cocos2d-x v3.16 是该框架的一个版本号,本文档主要介绍了该版本的安装流程以及环境...

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    《cocos2d-x 3.8:经典游戏引擎源码解析》 cocos2d-x 是一个跨平台的游戏开发框架,它基于C++,同时提供了Lua和JavaScript的绑定,让开发者可以方便地在多种操作系统上创建2D游戏、演示程序和其他图形交互应用。这...

    Cocos2d-x实战:C++卷(2版)源代码

    《Cocos2d-x实战:C++卷(2版)源代码》这本书是关于使用Cocos2d-x游戏引擎进行游戏开发的专业指南。Cocos2d-x是一个开源的、跨平台的游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言...

    cocos2d-x json字符串与cocos2d::Value转换工具

    该资源主要用于cocos2d-x中Value与json字符串的相互转换,提供从json文件读取为cocos2d::Value,cocos2d::Value写入到文件,cocos2d::Value转换为json字符串,json字符串转换为cocos2d::Value。json字符串转换成cocos...

    cocos2d-x windows vs2010配置

    "cocos2d-x windows vs2010 配置详解" 本文将详细介绍如何在 Windows 环境下使用 Visual Studio 2010 配置 Cocos2d-x 游戏引擎。Cocos2d-x 是一个跨平台的游戏引擎,可以在多种平台上运行,包括 Windows、Mac OS X...

    cocos2d-x 3.0

    《cocos2d-x 3.0:游戏开发中的角色移动技术详解》 在游戏开发领域,cocos2d-x是一款广泛使用的开源2D游戏引擎,尤其在移动平台上的应用非常广泛。cocos2d-x 3.0版本带来了许多性能优化和新特性,使得开发者能够更...

    cocos2d-iphone~cocos2d-html5移植之旅

    ### cocos2d-iphone至cocos2d-html5移植之旅:深入解析与实践指南 #### 引言 在数字化时代,跨平台游戏开发成为了一种趋势,尤其在移动设备和网页端之间的转换变得日益频繁。《cocos2d-iphone至cocos2d-html5移植...

    Cocos2d-x实战C++卷关东升著完整版pdf

    《Cocos2d-x实战C++卷》是关东升所著的一本深入探讨Cocos2d-x游戏引擎开发的专业书籍。Cocos2d-x是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言为主要编程...

    cocos2d-html5-v2.2.3.zip

    Cocos2d是一个开源的游戏开发框架,而Cocos2d-x是它的C++版本,主要应用于移动设备。本文将深入探讨Cocos2d-html5,它是一个基于HTML5的版本,允许开发者使用JavaScript进行游戏开发,非常适合那些希望从其他领域...

    Cocos2d-x 3.x游戏开发实战pdf含目录

    《Cocos2d-x 3.x游戏开发实战》是一本深度探讨Cocos2d-x 3.x框架的游戏开发书籍,适合对游戏编程有兴趣的开发者学习。Cocos2d-x 是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多平台的...

    cocos2d-x-3.1.zip

    Cocos2d-x是一个开源的游戏开发框架,广泛用于2D游戏、实时渲染应用程序和其他互动内容的制作。这个压缩包“cocos2d-x-3.1.zip”包含了Cocos2d-x框架的3.1版本,这是一个经典且相对旧的版本,可能对于那些寻找历史...

    Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整

    标题中提到了"Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整",这里面包含了几个关键知识点: 1. Cocos2d-x:是一个开源的游戏开发框架,它主要用于开发跨平台的游戏和应用程序,支持iOS、...

    cocos2d-x-3.13.1 spine3.6.zip

    《Cocos2d-x 3.13.1与Spine 3.6集成详解》 Cocos2d-x是一个广泛使用的开源游戏开发框架,它基于C++,同时支持Lua和JavaScript等多种脚本语言,为开发者提供了高效、跨平台的游戏开发解决方案。在3.13.1版本中,...

    Cocos2d-x实战 JS卷

    《Cocos2d-x实战 JS卷》是一本深入探讨Cocos2d-x游戏开发的专著,主要聚焦于使用JavaScript语言进行游戏编程。Cocos2d-x是一个开源的游戏开发框架,广泛应用于移动设备和桌面平台,支持iOS、Android、Windows等多...

Global site tag (gtag.js) - Google Analytics