cocos2d-x 入门游戏:许特尔图_2 of 4



接上一节;

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 *)

{

   CCLogsimple;

}

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 / VSF12)看到参数是(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 CardItempublic 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;

至此,数字就随机摆在界面上了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值