5. 触摸
在初始化函数中: setTouchEnabled(true); setTouchMode(kCCTouchesOneByOne);
在.h中声明: bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
在.cpp中实现: bool LayerGame::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { static int touchOrder = 1; for (int i = 0; i< _rank*_rank; i++) { //注意boundingBox()前面被括号括起来了,是个整体 if (((CardItem *)allCards->objectAtIndex(i))->boundingBox() .containsPoint(pTouch->getLocation())) { //只有当前的触摸次序与数字卡的序号相等,才能继续下去 if (touchOrder == ((CardItem *)allCards->objectAtIndex(i))->getIdx()) { touchOrder++; ((CardItem *)allCards->objectAtIndex(i))->removeFromParentAndCleanup(true); }
if(touchOrder == _rank*_rank +1 ) { CCLog("you Win"); touchOrder = 1; //重置触摸次序 CCScene *scene = GameOver::scene(_rank,passtime); CCDirector::sharedDirector()->replaceScene(scene); } } } return false; } |
6. 结束场景:
结束场景由 1.显示成绩的标签 LabelTTF 2.返回主场景的Redo菜单 3.返回开始场景的Back菜单 组成
结束场景接收2个参数: 1. 难度等级 rank 2. 完成时间 passtime
Passtime不再它用 Rank还要返回,在.h中设置为全局 int _rank; |
| |
参数传递与保存: | ||
class GameOver : public CCLayer { public: static CCScene * scene(int rank,float t); //CREATE_FUNC(GameOver) static GameOver *create(int rank,float t); bool init(int rank,float t);
void redoCallBack(CCObject *); void backCallBack(CCObject *); | CCScene *GameOver::scene(int rank,float t) { 。。。。。。 return scene; } GameOver *GameOver::create(int rank,float t) { GameOver *pRet = new GameOver; 。。。。。。 return pRet; } bool GameOver::init(int rank,float t) { _rank = rank;
| |
当前还没有开定时器进行计时,先把时间显示的放一放,把菜单项先做掉: | ||
在.h中 void redoCallBack(CCObject *); void backCallBack(CCObject *); | 在.cpp中 CCMenuItem *redo = CCMenuItemFont::create("Redo"); redo->setTarget(this,menu_selector(GameOver::redoCallBack)); CCMenuItem *back = CCMenuItemFont::create("Back"); back->setTarget(this,menu_selector(GameOver::backCallBack)); CCMenu *menu = CCMenu::create(redo,back,NULL); menu->alignItemsHorizontallyWithPadding(30); addChild(menu); | |
void GameOver::redoCallBack(CCObject *) { CCDirector::sharedDirector()->replaceScene(LayerGame::scene(_rank)); } void GameOver::backCallBack(CCObject *) { CCDirector::sharedDirector()->replaceScene(GameStart::scene()); } |
7. 定时器与计时
主场景,在.h中 void mySchedule(float delta); float passtime; | |
在.cpp中,调用和实现 | |
passtime = 0.0; schedule(schedule_selector( ayerGame::mySchedule),0.1); CCLabelTTF *ttf = CCLabelTTF::create("0.00","Arial",30); addChild(ttf,0,1313); ttf->setPosition(ccp(winSize.width/2 + 50,winSize.height-50));
注意:ttf的Tag | void LayerGame::mySchedule(float delta) { passtime += delta; CCString *str = CCString::createWithFormat("%0.2f",passtime); CCLabelTTF *ttf = (CCLabelTTF *)getChildByTag(1313); ttf->setString(str->getCString()); |
8. 中文显示与声音
中文显示在cocos2d-x中不支持,要想显示中文,其中一种方法是使用CCDictionary。即自己写一个.xml文件,Value是中文,再通过Key拿中文
|
CCDictionary *dic = CCDictionary::createWithContentsOfFile("chinese.xml"); CCString * str1 = (CCString *)dic->objectForKey("simple"); CCString * str2 = (CCString *)dic->objectForKey("normal"); CCString * str3 = (CCString *)dic->objectForKey("hard"); CCString * str4 = (CCString *)dic->objectForKey("quit"); |
CCMenuItem *simple = CCMenuItemFont::create(str1->getCString()); simple->setColor(ccGREEN); CCMenuItem *normal = CCMenuItemFont::create(str2->getCString()); ....... |
声音要使用到cocosdention库
|
在VS中这个是没什么好说的
但在Linux中会链接出错:
必须在Makefile文件中-lcocosdenshion SHAREDLIBS += -lcocos2d -lcocosdenshion |
在init()中预加载: CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("click.wav");
在CCTouchBegan()中: 如果点击正确的数字,发出声音: if (touchOrder == ((CardItem *)allCards->objectAtIndex(i))->getIdx()) { 。。。 CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("click.wav"); 。。。 } |