实现一个类似于CCTableView的功能的代码
2014-09-17 23:33
337 查看
我先大致介绍一下,关于这个Demo实现的只要功能,通过滑动屏幕,来实现page页的显示,适用于与做有关卡的的游戏,通过不同page页,进入不同的关卡和场景。
首先:ThemeBaseLayer层,这个文件主要实现的加载,将一些都page页中都用的画面等放入本层,最后在让需要的page页层进行继承他就可以了啊
.h也就是也写声明文件,继承的CCLayer
ThemeBaseLayer.cpp
下面这个类主要实现关卡中那个每一关的按钮的,这个类也是一个通用的类,也就是通过不同的图片和tag值来进行判断你选择的是那一关活那个场景。
下面这个类主要实现触摸事件和设定滑动的页,实现的过程,我会在代码中添加注释来进行解析,
首先: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; }这个功能就完成了,可能由于我分的层比较多,导致代码有点乱,如果有那个说的不对的地方,请指教,我现在也是学习阶段。
相关文章推荐
- [导入]分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)
- 分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)
- USTCOJ代码查看功能的实现(我的第一个Chrome插件,UstcOjSourceView)
- 一个实现图片上传/产生缩略图/在上传图片上写字功能的完整页面代码
- 分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)
- 【IOS】扩展UIImageViewEx实现:手势移动,旋转,缩放(附带一个收缩的文字标签功能)
- 一个能实现收银功能的小代码
- 分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)
- 分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)
- 请编写实现malloc()内存分配函数功能一样的代码。给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
- [转]Remoting的一个代码示例(借助Remoting实现发送信息功能)
- 一个比较实用的sql实现代码功能
- iOS: 在UITableView中实现搜索功能关键代码
- 用两个栈实现一个队列的功能 && 两个队列实现一个栈的功能 && 代码实例
- JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
- 分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)
- hchxxzx--》一个实现图片上传/产生缩略图/在上传图片上写字功能的完整页面代码