您的位置:首页 > 编程语言

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

2014-09-17 23:33 337 查看
我先大致介绍一下,关于这个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;
}
这个功能就完成了,可能由于我分的层比较多,导致代码有点乱,如果有那个说的不对的地方,请指教,我现在也是学习阶段。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐