接上一节;
3. 开始场景的搭建与计划:
简单场景,3个难度菜单1个退出菜单;计划在功能完成后将文字变成中文显示(CCDictionary)
|
3*3 共9格
4*4 共16格
5*5 共25格
退出 |
|
关键知识点:
A. 菜单,菜单项及回调函数
B. 传参
界面: CCMenuItem *simple = CCMenuItemFont::create("simple"); CCMenuItemFont *normal = CCMenuItemFont::create("normal"); CCMenuItemFont *hard = CCMenuItemFont::create("hard"); CCMenuItemFont *quit = CCMenuItemFont::create("quit");
CCMenu *menu = CCMenu::create(simple,normal,hard,quit,NULL); addChild(menu); menu->alignItemsVerticallyWithPadding(10); 先把界面显示出来~ |
回调函数: 在.h中声明回调函数: void simpleCallBack(CCObject *); void normalCallBack(CCObject *); void hardCallBack(CCObject *); void quitCallBack(CCObject *);
在.cpp中先打桩(QT:ALT+Enter -->在.cpp中添加定义) void GameStart::simpleCallBack(CCObject *) { CCLog(“simple”); } void GameStart::normalCallBack(CCObject *) { } |
给MenuItem设置回调函数: simple->setTarget(this,menu_selector(GameStart::simpleCallBack)); normal->setTarget(this,menu_selector(GameStart::normalCallBack)); hard->setTarget(this,menu_selector(GameStart::hardCallBack)); quit->setTarget(this,menu_selector(GameStart::quitCallBack)); |
注意一点:menu_selector(F2 / VS中F12)看到参数是(CCObject *),在QT中可以不带参,但在VS中必须带参!
传参: 在.h中: enum DEGREE { THREE = 3,FOUR,FIVE };
在.cpp中: void GameStart::simpleCallBack(CCObject *) { CCScene *scene = LayerGame::scene(THREE); CCDirector::sharedDirector()->replaceScene(scene); } void GameStart::normalCallBack(CCObject *) { CCScene *scene = LayerGame::scene(FOUR); CCDirector::sharedDirector()->replaceScene(scene); } |
至此,LayerGame还没有建立,下一节继续。
4. 主场景及卡片类
|
计时
数字卡片大小: setContentSize (CCSizeMake(60,70)); setAnchorPoint(ccp(0,0)); |
| ||
联系: 1. 主场景接收开始场景的传参(难度),因而不能用CREATE_FUN()宏,要自己写Create: LayerGame *LayerGame::create(int rank) 2. 数字卡片要接受主场景(init())中的传参(数字1~x),继承自CCSprite,也要自己写Create函数:CardItem * CardItem::create( int idx ) | ||||
| ||||
主场景: 在.h中: class LayerGame : public CCLayer { public: static CCScene * scene(int rank); static LayerGame * create(int rank); bool init(int rank);
void addCard(int rank); CCArray * allCards; | 在.cpp中 CCScene *LayerGame::scene(int rank) { CCScene *scene = CCScene::create(); LayerGame *layer = LayerGame::create(rank); scene->addChild(layer); return scene; } LayerGame *LayerGame::create(int rank) { LayerGame *pRet = new LayerGame; if (pRet && pRet->init(rank)) { pRet->autorelease(); } else { delete pRet; pRet = NULL; } return pRet; } bool LayerGame::init(int rank) { CCLayer::init(); addCard(rank); | |||
数字卡片在addCard()中调用: void LayerGame::addCard(int rank) { allCards = CCArray::create(); allCards->retain();
for (int i = 0; i < rank ; i++) { for (int j = 0; j< rank; j++) { CardItem *item = CardItem::create(/*vec[i*rank+j+1]*/5); item->setPosition(ccp(baseX+60*i,baseY+70*j)); addChild(item); allCards->addObject(item); } } } | ||||
数字卡片类:
| ||||
class CardItem: public CCSprite { public: static CardItem *create(int idx); bool init(int idx);
CCLabelTTF *ttf; CC_SYNTHESIZE(int,_index,Idx) }; | CardItem * CardItem::create( int idx ) { 。。。 return pRet; } bool CardItem::init(int idx) { CCSprite::init(); // 设置大小 setContentSize(CCSizeMake(60,70)); setAnchorPoint(ccp(0,0)); setIdx(idx); //保存分给的序号
CCString *str = CCString::createWithFormat("%d",idx); ttf = CCLabelTTF::create(str->getCString(),"courier new",20); addChild(ttf); |
数字的随机产生:
使用vector --增强性数组,每次随机出的数是下标,下标--就不会重复
| |
#include <iostream> #include <vector> #include <stdlib.h> #include <time.h> using namespace std;
void getAvailPoints(int rank); vector<int> vec; | void LayerGame::getAvailPoints(int rank) { srand(time(NULL)); //种子 for (int i = 0; i<= rank*rank; i++) { vec.push_back(i); //初始化 } int mysize = rank*rank; for (int i = 1; i<= mysize+1-i; i++) { int idx = rand()% (mysize-i)+1; int value = vec[idx]; vec[idx] = vec[mysize+1-i]; vec[mysize+1-i]=value; } |
基准坐标获得:
float k = (rank)/2.0; baseX = winSize.width/2 -k*60; //对应不同格子数,找到其基准点的X坐标 baseY = winSize.height/2 - k*70; |
至此,数字就随机摆在界面上了。