cocos2d-x 新手引导

新手引导是游戏开发过程中必须要有的模块。以下的代码实现了整个游戏界面只有一个按钮可以点击,这刚好是做新手引导所必须的功能。

首先自定义一个按钮,这个按钮的参数有优先级,方法实现的代理,优先级等:

//
//  B_Button.h
//  HelloCpp
//
//  Created by blary on 14-8-16.
//
//

#ifndef __HelloCpp__B_Button__
#define __HelloCpp__B_Button__

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

class B_Button : public CCLayer, public CCTargetedTouchDelegate
{
public:
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
    bool initWithImageAndMethodAndPriority(const char* normal, const char* selected, int n, void(*f)(int), CCObject* tar, int priority = kCCMenuHandlerPriority);
private:
    CCSprite* normalS;
    CCSprite* selectedS;
    CCObject* target;
    int pid;
    void (*handler)(int);
};

#endif /* defined(__HelloCpp__B_Button__) */

下面是实现部分:

//
//  B_Button.cpp
//  HelloCpp
//
//  Created by blary on 14-8-16.
//
//

#include "B_Button.h"

bool B_Button::initWithImageAndMethodAndPriority(const char* normal, const char* selected, int n, void(*f)(int), CCObject* tar, int priority)
{
    if (!CCLayer::init()) {
        return false;
    }
    normalS = CCSprite::create(normal);
    selectedS = CCSprite::create(selected);
    target = tar;
    pid = n;

    normalS->setVisible(true);
    selectedS->setVisible(false);
    this->addChild(normalS,1);
    this->addChild(selectedS,1);
    handler=f;
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate((CCTargetedTouchDelegate*)this, priority, true);
    return true;
}

bool B_Button::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    CCPoint p = pTouch->getLocation();
    p = CCDirector::sharedDirector()->convertToUI(p);
    CCRect  r = selectedS->boundingBox();
    CCRect rect(r.origin.x+this->getPositionX(),r.origin.y+this->getPositionY(),r.size.width,r.size.height);
    if (rect.containsPoint(p))
    {
        normalS->setVisible(false);
        selectedS->setVisible(true);
    }

    return true;
}

void B_Button::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    if (normalS->isVisible()==false&&selectedS->isVisible()==true)
    {
        normalS->setVisible(false);
        selectedS->setVisible(true);
    }
    CCPoint p = pTouch->getLocation();
    p = CCDirector::sharedDirector()->convertToUI(p);
    CCRect  r = selectedS->boundingBox();
    CCRect rect(r.origin.x+this->getPositionX(),r.origin.y+this->getPositionY(),r.size.width,r.size.height);
    if (rect.containsPoint(p)) {
        (handler)(pid);
        normalS->setVisible(true);
        selectedS->setVisible(false);
    }
}

下面是如何使用的部分:

#pragma once

#include "cocos2d.h"

class HelloWorld : public cocos2d::CCLayer
{
public:
	virtual bool init();  

    static cocos2d::CCScene* scene();

    CREATE_FUNC(HelloWorld);
};

#ifdef __cplusplus
extern "C" {
#endif

    void shutdownGame(int a);

#ifdef __cplusplus
}
#endif
#include "HelloWorldScene.h"
#include "B_Button.h"
using namespace cocos2d;

// 枚举值定义 一般都是layer名称+作用
enum {
    HELLO_LAYER_BOTTON_A,
    HELLO_LAYER_BUTTON_AA,
    HELLO_LAYER_BUTTON_B,
    HELLO_LAYER_BUTTON_BB,
};

CCScene* HelloWorld::scene()
{
CCScene * scene = NULL;
do  {
scene = CCScene::create();
HelloWorld *layer = HelloWorld::create();
scene->addChild(layer);
} while (0);
return scene;
}

bool HelloWorld::init()
{
    if (!CCLayer::init()) {
        return false;
    }
    CCSize win = CCDirector::sharedDirector()->getWinSize();
    // 使用自定义按钮 你可以使用默认的优先级按钮

    B_Button* a = new B_Button;
    a->initWithImageAndMethodAndPriority("CloseNormal.png", "CloseSelected.png", HELLO_LAYER_BOTTON_A, shutdownGame, this, 0);
    a->setPosition(CCPoint(win.width/2, win.height/2));
    this->addChild(a, 1);
    a->autorelease();

    B_Button* b = new B_Button;
    b->initWithImageAndMethodAndPriority("CloseNormal.png", "CloseSelected.png", HELLO_LAYER_BUTTON_B, shutdownGame, this, 1);
    b->setPosition(CCPoint(win.width/2, win.height/2));
    this->addChild(b, 1);
    b->autorelease();

    B_Button* aa = new B_Button;
    aa->initWithImageAndMethodAndPriority("CloseNormal.png", "CloseSelected.png", HELLO_LAYER_BUTTON_AA, shutdownGame, this, 0);
    aa->setPosition(CCPoint(win.width/2 + 100, win.height/2));
    this->addChild(aa, 2);
    aa->autorelease();

    B_Button* bb = new B_Button;
    bb->initWithImageAndMethodAndPriority("CloseNormal.png", "CloseSelected.png", HELLO_LAYER_BUTTON_BB, shutdownGame, this, 1);
    bb->setPosition(CCPoint(win.width/2 + 100, win.height/2));
    this->addChild(bb, 2);
    bb->autorelease();

    return true;
}

#ifdef __cplusplus
extern "C" {
#endif
    void shutdownGame(int a)
    {
        switch (a) {
            case HELLO_LAYER_BUTTON_BB:
            {
                printf(" BB !\n");
            }
                break;
            case HELLO_LAYER_BUTTON_B:
            {
                printf(" B !\n");
            }
                break;
            case HELLO_LAYER_BUTTON_AA:
            {
                printf(" AA !\n");
            }
                break;
            case HELLO_LAYER_BOTTON_A:
            {
                printf(" A !\n");
            }
                break;
            default:
                break;
        }
    }
#ifdef __cplusplus
}
#endif

这样总是只能保证只有一个按钮相应事件,即使他们的优先级相同。基于上面的实现,我们可以很方便的实现新手引导模块的开发。

时间: 2024-10-23 07:01:59

cocos2d-x 新手引导的相关文章

cocos2d-x新手引导遮罩CCClippingNode裁剪区域

废话不多说,我直接封装了一个类,是个layer,需要的时候直接添加layer就行  //白白原创 头文件 #pragma once #include "cocos2d.h" USING_NS_CC; const int kTagBackground=0; const int kTagClipNode=1; const int kTagTip=2; class TestLayer : public CCLayer { public: CREATE_FUNC(TestLayer); vir

使用cocos2d-js制作游戏新手引导(二)

本文上接前我一篇博文<使用cocos2d-js制作游戏新手引导(一)> 一.定位器的实现 定位器的目的是实现对场景树中的节点精确定位,获取对象实例,从而获取节点在界面中的位置.矩形大小等信息. 定位器:在cocos2d(js)游戏引擎中用于精确描述场景树中的某一节点的字符串,其实现方式借鉴了css(层叠样式表)选择器设计思路,以下我们将实现一个简单的从定位器字符串解析到节点定位的整个过程. 1.定位符规则 在cocos2d中可以通过节点名字.节点tag值来表示一个节点,在js中还可以使用对象的

cocos2d::Vector

v3.0 beta加入 定义在"COCOS2DX_ROOT/cocos/base"的"CCVector.h"头文件中. template<class T>class CC_DLL Vector; cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器. cocos2d::Vector<T>中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector. 在Cocos2d-x v3.

Cocos2D中Action的进阶使用技巧(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 大家对Cocos2d中动作的使用大概都非常清楚了,事实上本身action的概念也不复杂. 可是在某些情况下,一般的动作不能满足我们需求的时候,我们就必须使用更高级的Action方法来解决这个问题. 比方,串行化(不是序列化哦,这是两个全然不同的概念)不同Action的执行-有些童鞋可能会说非常easy,直接用CCActionSequence不就结了,可是等等我

如何简单的实现新手引导之UGUI篇

一个完整的游戏项目肯定是要做新手引导的,而引导做的好坏可能会影响玩家的留存.那么怎么简单的实现个简有效的引导呢!先不说废话,先看看效果,这是一个基于UGUI做的一个简单的引导! 怎么样,看着是那么回事吧?看起来确实有点丑,如果给按钮边缘加上缩放或者流光特效,那么逼格瞬间就上去了,可惜,没找到资源.最重要的是实现起来灰常简单,就一个函数搞定. 1,如何实现引导: 1,首先创建一个Mask遮罩,保证任意地方接受不到点击,适当的调整下Alpha. 2,将要点击的按钮高亮,保证引导按钮可以响应到点击事件

Cocos2d入门--3-- 向量的应用

 Cocos2d入门--3-- 向量的应用 小球向一个方向持续运动的Demo HelloWorldScene.h ...... //设置一个protected的属性 protected: cocos2d::Vec2 _vec; ...... HelloWorldScene.cpp //这个是通过随机数设置向量的方向 _vec.set(random(-0.1f, 1.0f), random(-1.0f, 1.0f)); //通过normalize这个标准化函数,能够使得向量的大小为1 _vec.n

Cocos2d入门--1-- 初涉相关属性或代码

 Cocos2d入门--1-- 初涉相关属性或代码 Cocos2d vision:  cocos2d-x-3.8.1 万丈高楼,起于累土.对于一个游戏框架的学习,其实在于框架功能的使用积累,学会了如何在cocos2d游戏引擎的基础上使用它提供的各种功能,并灵活运用, 以及学会查阅Cocos2d官方提供的API文档.相信自己也能开发出自己喜爱或者让别人羡慕的游戏. 目录: 1>认识origin和visibleSize以及cocos2d的基础绘画类DrawNode的简单实用 2>认识 CCLOG(

UITableViewController 滚动引起的cocos2d动画暂停问题的解决

UITableViewController 滚动引起的cocos2d动画暂停问题的解决 之前在使用UITableViewController进行滚动时,cocos2d的动画会暂停,直至滚动完毕才会继续动画. 后来发现可以这样解决,想要了解更多,请查阅NSRunLoop相关知识. // .h NSTimer* m_timer; // .m- (void)updateCCDirector { [[CCDirector sharedDirector] drawScene]; if (!self.tab

IOSAPP之新手引导

1.在Main.storyboard中找到,ScrollView和PageControl. 2.在ScrollView中添加ImageView,新手引导页有几个图片就添加几个,然后设置ImageView的image,就是准备好的图片. 3.要设置好ScrollViewscroll View中的Left和View中的Width,使其等于图片的大小,还有就是图片大小的起始位置,第一张为(0,0),第二张的起始位置应该是(屏幕的宽度,0),以此类推. 4.添加PageControl,这个的起始位置要手