上一篇中已经完成滑动合并卡片,但2048游戏在合并卡片后会在没有卡片的位置随机生成一个卡片。为完成此功能我们在GameLayer.h中声明一个函数
//自动生成卡片 void autoCreateCardNumber();
在cpp中实现如下:
void GameLayer::autoCreateCardNumber() { int tmp = CCRANDOM_0_1()*15; //二维数组转换为整数: index = x+y*size_x int i= tmp%4; int j= tmp/4; //判断指定位置是否有卡片 if (cardArr[i][j]->getNumber()>0) { autoCreateCardNumber(); } else { //2和4个一半机会 cardArr[i][j]->setNumber(CCRANDOM_0_1() < 0.5 ? 2: 4); } }
生成卡片的方法是有了,现在就需要调用它,我们在init函数中调用
bool GameLayer::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } //打开触屏功能 setTouchEnabled(true); //创建游戏背景 this->addChild(cocos2d::CCLayerColor::create( ScreenAdapter::GetGameBGColor() )); //创建卡片 CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); createCardSprite(visibleSize); autoCreateCardNumber(); autoCreateCardNumber(); return true; }
不过还得改一个地方,应为我们在createCardSprite函数中创建卡片的时候默认每个格子都有数值,游戏开始可不能这样,所有创建的卡片数值给0
void GameLayer::createCardSprite(cocos2d::CCSize size) { //获取卡片高宽 int unitSize = ScreenAdapter::GetCardHeight(size.height); //创建4*4个卡片 for (int i=0;i<4;i++) { for (int j=0;j<4;j++) { CardSprite* card = CardSprite::createCardSprite( 0, // 修改这里 unitSize, unitSize, unitSize*i+100, unitSize*j+20); //保存卡片到数组中 cardArr[i][j] = card; addChild(card); } } }
来看看效果