cocos2d-x的初步学习二十八之爱消除一
这篇文章中,我们将模仿某个游戏来实现,首页我们做首界面,这里都是一些UI元素的布局,其中会涉及到一些动画,比如贝塞尔曲线,还有cctableview来显示我们的得分,做个排行榜,OK,下面我直接上代码了:
HelloWorldScene.h
public:// Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)virtual bool init();// there's no 'id' in cpp, so we recommend to return the class instance pointerstatic cocos2d::CCScene* scene();// preprocessor macro for "static create()" constructor ( node() deprecated )CREATE_FUNC(HelloWorld);private:void initData(void);void initUI(void);void initSounds(void);void addBaoshi(void);cocos2d::CCProgressTimer *levelProgress;cocos2d::CCLabelTTF *levelLabel;cocos2d::CCLabelTTF *levelbfbLabel;cocos2d::CCLabelTTF *timeLabel;cocos2d::CCLayerColor *pauselayer;cocos2d::CCSprite *sharebgSprite;cocos2d::extension::CCTableView *phbTableView;void buyYeZi(void);void shared(void);void startGame(void);cocos2d::CCArray *yeziArray;void removeSprite(void);void createPauseLayer(void);void pauseButtonPressed(void);bool lock;void rotateAnimation(void);float rotate;
HelloWorldScene.cpp
bool HelloWorld::init()
{//// 1. super init firstif ( !CCLayer::init() ){return false;}this->initData();this->initUI();this->initSounds();this->createPauseLayer();return true;
}void HelloWorld::initData()
{CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("textures.plist");yeziArray=CCArray::create();yeziArray->retain();dataArray=CCArray::create();dataArray->retain();}void HelloWorld::initSounds()
{SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("bg1.mp3");SimpleAudioEngine::sharedEngine()->playBackgroundMusic("bg1.mp3", true);}void HelloWorld::initUI()
{//背景CCSprite *bgSprite=CCSprite::create("startbg.png");bgSprite->setAnchorPoint(ccp(0.5, 0.5));bgSprite->setPosition(ccp(wSize.width/2, wSize.height/2));this->addChild(bgSprite, 1);//宝石iconCCSprite *baoshiiconSprite=CCSprite::createWithSpriteFrameName("ruby.png");baoshiiconSprite->setAnchorPoint(ccp(0, 0));baoshiiconSprite->setPosition(ccp(50, wSize.height-200));this->addChild(baoshiiconSprite, 1);//宝石数量CCLabelTTF *bsnumsLabel=CCLabelTTF::create("100", "MarkerFelt-Thin", 35);bsnumsLabel->setAnchorPoint(ccp(0, 0));bsnumsLabel->setPosition(ccp(baoshiiconSprite->getPosition().x+baoshiiconSprite->getContentSize().width+25, wSize.height-200+15));this->addChild(bsnumsLabel, 1);//购买菜单CCSprite *addSprite=CCSprite::createWithSpriteFrameName("add.png");CCMenuItemSprite *addItem = CCMenuItemSprite::create(addSprite, addSprite, this, menu_selector(HelloWorld::addBaoshi));addItem->setAnchorPoint(ccp(0, 0));addItem->setPosition(ccp(bsnumsLabel->getPosition().x+bsnumsLabel->getContentSize().width+40, bsnumsLabel->getPosition().y-10));CCMenu* pMenu = CCMenu::create(addItem, NULL);pMenu->setPosition( CCPointZero );this->addChild(pMenu, 1);//等级进度条CCSprite *progressbgSprite=CCSprite::createWithSpriteFrameName("exp_bar_out.png");progressbgSprite->setAnchorPoint(ccp(0, 0));progressbgSprite->setPosition(ccp(440, wSize.height-190));this->addChild(progressbgSprite, 1);CCSprite *progressSprite=CCSprite::createWithSpriteFrameName("exp_bar_in.png");levelProgress=CCProgressTimer::create(progressSprite);levelProgress->setType(kCCProgressTimerTypeBar);levelProgress->setAnchorPoint(ccp(0, 0));levelProgress->setPosition(ccp(440, wSize.height-182));//进度动画运动方向,可以多试几个值,看看效果levelProgress->setMidpoint(ccp(0, 0));//进度条宽高变化levelProgress->setBarChangeRate(ccp(1, 0));levelProgress->setPercentage(67);this->addChild(levelProgress, 1);CCSprite *starSprite=CCSprite::createWithSpriteFrameName("exp_star.png");starSprite->setAnchorPoint(ccp(0, 0));starSprite->setPosition(ccp(410, wSize.height-195));this->addChild(starSprite, 1);//等级levelLabel=CCLabelTTF::create("2", "MarkerFelt-Thin", 35);levelLabel->setAnchorPoint(ccp(0, 0));levelLabel->setPosition(ccp(starSprite->getPosition().x+24, starSprite->getPosition().y+10));levelLabel->setColor(ccc3(0.5, 0.5, 0.5));this->addChild(levelLabel,1);//百分比levelbfbLabel=CCLabelTTF::create("67%", "MarkerFelt-Thin", 30);levelbfbLabel->setAnchorPoint(ccp(0, 0));levelbfbLabel->setPosition(ccp(starSprite->getPosition().x+75, starSprite->getPosition().y+12));this->addChild(levelbfbLabel,1);// CCLabelTTF *namebLabel=CCLabelTTF::create("王子大人", "MarkerFelt-Thin", 55);
//
// namebLabel->setAnchorPoint(ccp(0.5, 0.5));
// namebLabel->setPosition(ccp(wSize.width/2,140));
// this->addChild(namebLabel,1);//开始菜单CCSprite *startSprite=CCSprite::createWithSpriteFrameName("button_play.png");CCMenuItemSprite *startItem = CCMenuItemSprite::create(startSprite, startSprite, this, menu_selector(HelloWorld::startGame));startItem->setPosition(ccp(wSize.width/2,100));CCMenu* startMenu = CCMenu::create(startItem, NULL);startMenu->setPosition(CCPointZero);this->addChild(startMenu, 1);//能量,满格5个for (int i=0; i<5; i++){//空的CCSprite *energySprite=CCSprite::createWithSpriteFrameName("energy_empty.png");energySprite->setAnchorPoint(ccp(0, 0));energySprite->setPosition(ccp(55+(3+energySprite->getContentSize().width)*i, wSize.height-288));this->addChild(energySprite, 1,100+i);//满的CCSprite *energySprite2=CCSprite::createWithSpriteFrameName("energy_full.png");energySprite2->setAnchorPoint(ccp(0, 0));energySprite2->setPosition(ccp(55+(3+energySprite2->getContentSize().width)*i, wSize.height-288));this->addChild(energySprite2, 1,200+i);yeziArray->addObject(CCString::createWithFormat("%d",200+i));}//button_share_small.png//energy_empty.png//百分比timeLabel=CCLabelTTF::create("10:00", "MarkerFelt-Thin", 30);timeLabel->setAnchorPoint(ccp(0, 0));timeLabel->setPosition(ccp(355, wSize.height-280));timeLabel->setColor(ccYELLOW);this->addChild(timeLabel,1);//购买叶子CCSprite *addSprite2=CCSprite::createWithSpriteFrameName("add.png");CCMenuItemSprite *yeziItem = CCMenuItemSprite::create(addSprite2, addSprite2, this, menu_selector(HelloWorld::buyYeZi));yeziItem->setAnchorPoint(ccp(0, 0));yeziItem->setPosition(ccp(timeLabel->getPosition().x+timeLabel->getContentSize().width, timeLabel->getPosition().y-18));CCMenu* yeziMenu = CCMenu::create(yeziItem, NULL);yeziMenu->setPosition( CCPointZero );this->addChild(yeziMenu, 1);//分享背景动画sharebgSprite=CCSprite::createWithSpriteFrameName("glow.png");sharebgSprite->setAnchorPoint(ccp(0.5,0.5));sharebgSprite->setPosition(ccp(yeziItem->getPosition().x+yeziItem->getContentSize().width+42, yeziItem->getPosition().y-18+50));sharebgSprite->setScale(0.18);this->addChild(sharebgSprite, 1);//分享CCSprite *shareSprite=CCSprite::createWithSpriteFrameName("button_share_small.png");CCMenuItemSprite *shareItem = CCMenuItemSprite::create(shareSprite, shareSprite, this, menu_selector(HelloWorld::shared));shareItem->setAnchorPoint(ccp(0, 0));shareItem->setPosition(ccp(yeziItem->getPosition().x+yeziItem->getContentSize().width, yeziItem->getPosition().y+6));CCMenu* shareMenu = CCMenu::create(shareItem, NULL);shareMenu->setPosition( CCPointZero );this->addChild(shareMenu, 1);}//购买宝石
void HelloWorld::addBaoshi()
{SimpleAudioEngine::sharedEngine()->playEffect("buttonclick.mp3");}//购买叶子
void HelloWorld::buyYeZi()
{SimpleAudioEngine::sharedEngine()->playEffect("buttonclick.mp3");}//分享
void HelloWorld::shared()
{SimpleAudioEngine::sharedEngine()->playEffect("buttonclick.mp3");}//开始
void HelloWorld::startGame()
{if (yeziArray->count()==0){pauselayer->setVisible(true);return;}if (lock==false){lock=true;SimpleAudioEngine::sharedEngine()->playEffect("buttonclick.mp3");CCString *numberString=(CCString *)yeziArray->lastObject();CCSprite *sprite=(CCSprite *)this->getChildByTag(numberString->intValue());ccBezierConfig bezierConfig;bezierConfig.controlPoint_1=ccp(sprite->getPosition().x, sprite->getPosition().y);bezierConfig.controlPoint_2=ccp(wSize.width+200, wSize.height/2);bezierConfig.endPosition=ccp(wSize.width/2-15,80);CCBezierTo *bezier=CCBezierTo::create(1.5f, bezierConfig);CCSequence *seq=CCSequence::create(bezier,CCDelayTime::create(0.5f),CCCallFunc::create(this,callfunc_selector(HelloWorld::removeSprite)),NULL);sprite->runAction(seq);}}void HelloWorld::removeSprite()
{CCString *numberString=(CCString *)yeziArray->lastObject();CCSprite *sprite=(CCSprite *)this->getChildByTag(numberString->intValue());yeziArray->removeLastObject();sprite->removeFromParentAndCleanup(true);lock=false;dataIndex++;CCString *infoString=CCString::createWithFormat("%s",this->getSystemTime()->getCString());//CCLOG("%s",infoString->getCString());dataArray->addObject(infoString);phbTableView->reloadData();// //存储
// CCUserDefault::sharedUserDefault()->setStringForKey(CCString::createWithFormat("data%d",dataIndex)->getCString(), infoString->getCString());
//
// //提交
// CCUserDefault::sharedUserDefault()->flush();}//创建暂停界面
void HelloWorld::createPauseLayer()
{pauselayer=CCLayerColor::create(ccc4(255, 255, 255, 0), 479, 520);pauselayer->setAnchorPoint(ccp(0, 0));pauselayer->setPosition(ccp(wSize.width/2-pauselayer->getContentSize().width/2, wSize.height/2-pauselayer->getContentSize().height/2));this->addChild(pauselayer, 1);CCSprite *bgSprite=CCSprite::create("bg_pause.png");bgSprite->setPosition(ccp(pauselayer->getContentSize().width/2, pauselayer->getContentSize().height/2));pauselayer->addChild(bgSprite);CCLabelTTF *contentLabel=CCLabelTTF::create("你没有足够的叶子,你可以从叶子商店里购买,或者等几分钟。", "MarkerFelt-Thin",32);contentLabel->setPosition(ccp(pauselayer->getContentSize().width/2, pauselayer->getContentSize().height/2));contentLabel->setDimensions(CCSize(pauselayer->getContentSize().width-40,200));//横向对齐方式contentLabel->setHorizontalAlignment(kCCTextAlignmentLeft);contentLabel->setColor(ccWHITE);pauselayer->addChild(contentLabel);CCSprite *sureSprite=CCSprite::createWithSpriteFrameName("button_ok.png");CCMenuItemSprite *sureItem = CCMenuItemSprite::create(sureSprite, sureSprite, this, menu_selector(HelloWorld::pauseButtonPressed));sureItem->setPosition(ccp(pauselayer->getContentSize().width/2, pauselayer->getContentSize().height/2-160));CCMenu* sureMenu = CCMenu::create(sureItem, NULL);sureMenu->setPosition(CCPointZero);pauselayer->addChild(sureMenu, 1);pauselayer->setVisible(false);}//ok按钮
void HelloWorld::pauseButtonPressed()
{pauselayer->setVisible(false);}
上面中,我们进行了界面的布局,没什么复杂的东西,主要是叶子的逻辑及动画,满状态的时候是5片叶子,我们现在点开始,然后就减少一片叶子,并且叶子做一个贝塞尔曲线的动画,当叶子都没有的时候,我们提示一个对话框界面,告诉我们没有叶子了。
效果如下
~~然后是分享后面的背景图旋转动画,
在.h中
void rotateAnimation(void);
在.cpp中定义一个刷新函数
//刷新this->schedule(schedule_selector(HelloWorld::rotateAnimation), 0.1);//旋转动画
void HelloWorld::rotateAnimation()
{rotate=rotate+10;sharebgSprite->setRotation(rotate);}
我们设定每隔0.1秒增加10度,当然这个你可以自己设定,然后我们就可以看见分享背景sprite旋转了,(*^__^*) ……
OK,,接下来,我们要加入个排行榜的界面,我们利用cctbaleview,前面的文章中,我已经简单介绍过cctableview了,下面我们直接上代码
在.h中我们增加cctableview的几个虚函数
//CCTableViewDelegate继承自CCScrollViewDelegatevirtual void scrollViewDidScroll(cocos2d::extension::CCScrollView* view);virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView* view);//点击哪个cellvirtual void tableCellTouched(cocos2d::extension::CCTableView* table, cocos2d::extension::CCTableViewCell* cell);//每个cell的sizevirtual cocos2d::CCSize cellSizeForTable(cocos2d::extension::CCTableView *table);//生成cellvirtual cocos2d::extension::CCTableViewCell* tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx);//cell的数量virtual unsigned int numberOfCellsInTableView(cocos2d::extension::CCTableView *table);
然后在.cpp中具体去实现它们
//cell数量
unsigned int HelloWorld::numberOfCellsInTableView(cocos2d::extension::CCTableView *table)
{return dataArray->count();}//每行cell
CCTableViewCell* HelloWorld::tableCellAtIndex(CCTableView *table, unsigned int idx)
{CCTableViewCell *cell=table->dequeueCell();if (!cell) {cell = new CCTableViewCell();cell->autorelease();}cell->removeAllChildrenWithCleanup(true);//金银铜if (idx==0){CCSprite *pSprite = CCSprite::createWithSpriteFrameName("rank1.png");pSprite->setPosition(ccp(40, 60));cell->addChild(pSprite);}else if (idx==1){CCSprite *pSprite = CCSprite::createWithSpriteFrameName("rank2.png");pSprite->setPosition(ccp(40, 60));pSprite->setTag(456);cell->addChild(pSprite);}else if (idx==2){CCSprite *pSprite = CCSprite::createWithSpriteFrameName("rank3.png");pSprite->setPosition(ccp(40, 60));cell->addChild(pSprite);}int touxiangindex=arc4random()%3+1;CCString *nameString=CCString::createWithFormat("spin%d.png",touxiangindex);CCSprite *txSprite = CCSprite::createWithSpriteFrameName(nameString->getCString());txSprite->setPosition(ccp(130, 60));txSprite->setScale(0.7);txSprite->setTag(789);cell->addChild(txSprite);CCString *fenshu=(CCString *)dataArray->objectAtIndex(idx);CCLabelTTF *fenshuLabel = CCLabelTTF::create(fenshu->getCString(), "Arial", 36.0);fenshuLabel->setPosition(ccp(360, 60));fenshuLabel->setTag(123);fenshuLabel->setColor(ccYELLOW);cell->addChild(fenshuLabel);return cell;}CCSize HelloWorld::cellSizeForTable(CCTableView *table)
{return CCSizeMake(table->getContentSize().width, 120);}void HelloWorld::tableCellTouched(CCTableView *table, CCTableViewCell *cell)
{CCLOG("%d",cell->getIdx());}void HelloWorld::scrollViewDidScroll(CCScrollView *view)
{}void HelloWorld::scrollViewDidZoom(CCScrollView *view)
{}
OK,就这么简单,在这里,我们还要获取系统的时间,cocos2dx中获取时间的函数如下
//得到系统时间
CCString* HelloWorld::getSystemTime()
{struct tm *tm;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)//win32平台time_t timep;time(&timep);tm = localtime(&timep);
#else//android、ios平台struct cc_timeval now;CCTime::gettimeofdayCocos2d(&now, NULL);tm = localtime(&now.tv_sec);
#endifint year = tm->tm_year + 1900;int month = tm->tm_mon + 1;int day = tm->tm_mday;int hour=tm->tm_hour;int min=tm->tm_min;CCString *string=CCString::createWithFormat("%d-%d-%d %d:%d",year,month,day,hour,min);return string;}
OK,,我们看下效果图
OK~~~~~~~~~~~(*^__^*) …… 还有10分钟的倒计时,不知道大家有什么好的方法,我的想法应该是跟系统的时间去关联,这样进入后台或是关闭程序,时间还是继续进行的,通过获取系统的时间,然后某个算法来实现。。。
cocos2d-x的初步学习二十八之爱消除一相关推荐
- cocos2d-x的初步学习二十之坦克大战七
到目前为止,我们的坦克已经可以移动,并且已经做了碰撞检测.现在,我们要发射子弹了哦....首先,我们在我们的控制层添加一个虚拟按钮,来发射子弹,看代码: ControlLayer.h //按钮Snea ...
- Java多线程学习二十八:原子类和 volatile 有什么异同?
原子类和 volatile 有什么异同 案例说明 volatile 和原子类的异同 我们首先看一个案例.如图所示,我们有两个线程. 在图中左上角可以看出,有一个公共的 boolean flag 标记位 ...
- ballerina 学习二十八 快速grpc 服务开发
ballerina 的grpc 开发模型,对于开发者来说简单了好多,不是schema first 的方式,而是我们 只要编写简单的ballerina service 就可以了,proto 文件是自动帮 ...
- Java小白学习二十八——冒泡排序
冒泡排序 比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置 每一次比较,都会产生一个最大,或者最小的数字 下一轮则可以少一次排序 依次循环,直到结束 package com. ...
- OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope
OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...
- 【Vue学习】—Vue UI组件库(二十八)
[Vue学习]-Vue UI组件库(二十八) 一.移动端常用的UI组件库 二.PC端常用的UI组件库 三.具体使用自行查看文档,这里就不做概述了
- JavaScript学习(二十八)—事件冒泡和事件捕获
JavaScript学习(二十八)-事件冒泡和事件捕获 一.什么是事件流? 简单说,事件流就是指事件的执行顺序,他包含两种模式:事件冒泡.事件捕获. (一).事件冒泡 最常用的一种模式,就是指事件的执 ...
- 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言
嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...
- 深度学习之图像分类(二十八)-- Sparse-MLP(MoE)网络详解
深度学习之图像分类(二十八)Sparse-MLP(MoE)网络详解 目录 深度学习之图像分类(二十八)Sparse-MLP(MoE)网络详解 1. 前言 2. Mixture of Experts 2 ...
最新文章
- 闲话机器人领域的国际会议
- 江南百景图自动刷水井,附带拼图教程
- 如何使用 C# 中的 Lazy
- java ee编译器_Java EE 8 MVC:控制器的详细介绍
- nw.js package一般设置
- 零中频接收机频率转换图_【鼎阳硬件智库原创︱频谱分析仪】频谱分析仪应用解惑之频率分辨力...
- CCF202009-5 密信与计数【AC自动机】(100分题解链接)
- Couldn't find executable named map_saver below /opt/ros/indigo/share/map_server
- Android loopback(三)
- adams语句_ADAMS简单教程(上)讲解.ppt
- 黑马程序员-java教程 代码笔记
- Linux 并发测试工具 httpd-tools工具的安装和使用
- 笔记本电脑+USB接口GPS+WM6模拟器+PPC版城际通
- tom邮箱 服务器类型,Tom邮箱 - 帮助中心
- 高洛峰招徒培养IT名师
- 人工智能已经成为新一轮科技革命和产业变革的重要驱动力量
- RocketMQ-Retry
- dapper mysql_.NET Core Dapper操作mysql数据库
- IMX6ULL_PRO嵌入式开发板介绍
- Python实战——ESIM 模型搭建(keras版)
热门文章
- Eclipse 各种设置
- 我的第一个WFF项目
- 读书到什么程度才能算融会贯通?
- win10找不到便签(便利贴)怎么办,Win10找回便签功能的方法
- 盲盒app源码,可搭建部署二开.模式功能介绍.
- 查看电脑操作系统版本
- 解决error while accessing a target resource. resource is perhaps not available or a wrong access was
- 【AiLearning】test2:搭建Shallow Netural Network
- Codeforces 311D Interval Cubing 数学 + 线段树 (看题解)
- 国科大学习资料--人工智能原理与算法-2020年期末考试题解析(学长整理)