深秋

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

       上一篇中已经完成滑动合并卡片,但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);
        }
    }
}

         来看看效果

image

posted on 2014-06-21 12:19  深秋  阅读(470)  评论(0编辑  收藏  举报