实现一个类似于CCTableView的功能的代码

我先大致介绍一下,关于这个Demo实现的只要功能,通过滑动屏幕,来实现page页的显示,适用于与做有关卡的的游戏,通过不同page页,进入不同的关卡和场景。

首先:ThemeBaseLayer层,这个文件主要实现的加载,将一些都page页中都用的画面等放入本层,最后在让需要的page页层进行继承他就可以了啊

.h也就是也写声明文件,继承的CCLayer

ThemeBaseLayer.cpp

#include "ThemeBaseLayer.h"
using namespace cocos2d;

bool ThemeBaseLayer::init()
{
    if(!CCLayer::init())
    {
        return false;
    }
    CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("Themes/scene/themescene1-hd.plist","Themes/scene/themescene1-hd.pvr.ccz");
    CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("Themes/scene/themescene2-hd.plist","Themes/scene/themescene2-hd.pvr.ccz");
    CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("Themes/scene/themescene3-hd.plist","Themes/scene/themescene3-hd.pvr.ccz");
    
    //背景图
    CCSprite* background = CCSprite::createWithSpriteFrameName("theme_bg.png");
    //background->setAnchorPoint(ccp(0,1));
    background->setPosition(ccp(960/2,640/2));
    // background->setScaleX(wSize.width/background->getContentSize().width);
    this->addChild(background,0);
    //关卡标题
    CCSprite* app = CCSprite::createWithSpriteFrameName("theme_bg_CN.png");
    app->setPosition(ccp(960/2,640/2));
    this->addChild(app);
    
    return true;
}
上面这个类写成一个通用的,为了方便程序中多处使用。

下面这个类主要实现关卡中那个每一关的按钮的,这个类也是一个通用的类,也就是通过不同的图片和tag值来进行判断你选择的是那一关活那个场景。

ThemeSelectPage.h 关于文件的声明
#ifndef __Tower__ThemeSelectPage__
#define __Tower__ThemeSelectPage__

#include <iostream>
#include <cocos2d.h>
class ThemeSelectPage:public cocos2d::CCNode
{
public:
    bool init(const char* bgName ,int tag);
    static ThemeSelectPage* create(const char* bgName ,int tag);
    //
    virtual void menuCallBack(CCObject* obj);
};
#endif /* defined(__Tower__ThemeSelectPage__) */


#include "ThemeSelectPage.h"
#include "ManagerScene.h"
using namespace cocos2d;

bool ThemeSelectPage::init(const char* bgName ,int tag)
{
    if(!CCNode::init())
    {
        return false;
    }
    
    CCSprite* sprite1 = CCSprite::createWithSpriteFrameName(bgName);
    CCSprite* sprite2 = CCSprite::createWithSpriteFrameName(bgName);
    CCMenuItemSprite * menuImage = CCMenuItemSprite::create(sprite1,sprite2,this,menu_selector(ThemeSelectPage::menuCallBack));
    CCMenu* menu = CCMenu::create(menuImage,NULL);
    menuImage->setTag(tag);
    this->addChild(menu);
    return true;
}
//重写了create方法,为了传参。
 ThemeSelectPage* ThemeSelectPage::create(const char* bgName ,int tag)
{
    ThemeSelectPage* theme = new ThemeSelectPage();
    if(theme && theme->init(bgName,tag))
    {
        theme->autorelease();
        return theme;
    }
    CC_SAFE_DELETE(theme);
    theme = NULL;
    return NULL;
}
void ThemeSelectPage::menuCallBack(CCObject* obj)
{
    CCMenuItemSprite * menus = (CCMenuItemSprite *)obj;
    CCLOG("%d",menus->getTag());
    ManagerScene::getInstansce()->setThemeTag(menus->getTag());
    ManagerScene::getInstansce()->setScenestates(SceneLevel);
}



下面这个类主要实现触摸事件和设定滑动的页,实现的过程,我会在代码中添加注释来进行解析,

#include "ThemeSelectLayer.h"
using namespace cocos2d;
#define wSize CCDirector::sharedDirector()->getVisibleSize()
ThemeSelectLayer::ThemeSelectLayer()
{
//初始化
 this->pageNode = 0;
    this->CurPage = 0;
}
ThemeSelectLayer::~ThemeSelectLayer()
{
    
}
bool ThemeSelectLayer::init()
{
    if(!CCLayer::init())
    {
        return false;
    }
    return true;
}
//这个是为了将每个按钮页添加到场景中
 void ThemeSelectLayer::addNode(CCNode *level)
{
    if(level)
    {
        level->setContentSize(CCSize(wSize.width, wSize.height));//设置传过来图片的大小
        level->setPosition(CCPoint(wSize.width * pageNode, 0));//设置位置
        this->addChild(level);//添加到场景中
        pageNode++;//每添加一个计数器加一
    }
}
//同过onEnter()和onexit()方法来进行注册触摸事件和移除触摸事件
void ThemeSelectLayer::onEnter()
{
    CCLayer::onEnter();
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, NULL);
}
void ThemeSelectLayer::onExit()
{
    CCLayer::onExit();
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}

bool ThemeSelectLayer::ccTouchBegan(cocos2d::CCTouch* ptouch,cocos2d::CCEvent* event)
{
//获取按下的点,并径它赋予touchCurPoint(当前点)     
    touchDownPoint = ptouch->getLocation();
    touchCurPoint = touchDownPoint;
    return true;
}
void ThemeSelectLayer::ccTouchMoved(cocos2d::CCTouch* ptouch,cocos2d::CCEvent* event)
{
//获取移动中的点,
    CCPoint touchPoint = ptouch->getLocation();
    float curx = this->getPositionX() + touchPoint.x - touchCurPoint.x;//
    CCPoint posPoint = CCPointMake(curx, getPositionY());//设置滑动点的位置
    float dis = fabsf(touchPoint.x-touchDownPoint.x);
    if(dis >= SHORTEST)
    {
        this->setPosition(posPoint);
    }
    touchCurPoint = touchPoint;
}
void ThemeSelectLayer::ccTouchEnded(cocos2d::CCTouch* ptouch,cocos2d::CCEvent* event)
{
//获取抬起的点的位置
    touchUpPoint = ptouch->getLocation();
    float dis = touchUpPoint.getDistance(touchDownPoint);//获取按下到抬起之间的距离
    if(dis >=SHORTEST) //判断如果之间的距离大于预计的距离就显示上一页或者下一页,运行一个动作,也就是下面调用的moveToCurNode().
    {
        if(touchDownPoint.x<touchUpPoint.x) //向左滑动
        {
            if(CurPage>0)
            {
                --CurPage;
            }
        }else if(touchDownPoint.x > touchUpPoint.x){//向右滑动
            if(CurPage<(pageNode-1))
            {
                ++CurPage;
            }
        }
        moveToCurNode();
    }
}
void ThemeSelectLayer::moveToCurNode()
{
    this->runAction(CCMoveTo::create(0.5f,CCPointMake(-CurPage*960, 0)));
}
最后将这个在实现一个ThemeSelectScene,它继承ThemeBaseLayer,因为这个层才主场景层,具体的实现如下:

#ifndef __Tower__ThemeSelectScene__
#define __Tower__ThemeSelectScene__

#include <iostream>
#include "ThemeBaseLayer.h"
class ThemeSelectScene:public ThemeBaseLayer
{
public:
    virtual bool init();
    static cocos2d::CCScene * createScene();
    CREATE_FUNC(ThemeSelectScene);
    void homeBtnClicket(cocos2d::CCObject obj);
};
#endif /* defined(__Tower__ThemeSelectScene__) */

#include "ThemeSelectScene.h"
#include "ThemeSelectLayer.h"
#include "ThemeSelectPage.h"
using namespace cocos2d;

bool ThemeSelectScene::init()
{
    if(!ThemeBaseLayer::init())
    {
        return false;
    }
    ThemeSelectLayer* themeLayer = ThemeSelectLayer::create();//创建一个对象
    
    for (int i=1; i<=6; ++i) {
        ThemeSelectPage* page = ThemeSelectPage::create(CCString::createWithFormat("theme_pack0%d.png",i)->getCString(),i);//调用ThemeSelectPage中的create方法来进行添加按钮,并赋予tag值
        page->setTag(i);
        themeLayer->addNode(page);//将ThemeSelectPage层添加到ThemeSelectLayer层上
    }
    this->addChild(themeLayer);
    return true;
}
CCScene * ThemeSelectScene::createScene()
{
    CCScene* scene = CCScene::create();
    CCLayer* layer = ThemeSelectScene::create();
    scene->addChild(layer);
    return scene;
}
这个功能就完成了,可能由于我分的层比较多,导致代码有点乱,如果有那个说的不对的地方,请指教,我现在也是学习阶段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值