您的位置:首页 > 移动开发 > Cocos引擎

cocos2d学习之tests实例场景切换(1)

2013-11-05 11:30 375 查看
上周的任务做完了,又可以有一段时间学习了。昨天我的同事推荐给我一本电子版的书籍,叫做《cocos2d-x权威指南完整版》。这书挺不错的,不过我只看了前70页就看不下去了,不是那种厌烦的看不下去,是因为它开始结合cocos2d自带的源代码tests例子进行各个类的功能和函数,单单的看会有些枯燥,所以,我决定边学便理清思路,一步步走下去。70页左右,开始进行场景切换了,我想,CCScene层应该是游戏的最外层了吧,所以,就从这开始吧。

下面结合程序进行分析:

启动调试实例之后,出现主界面。



这也是一个CCScene啊,怎么实现的呢?一步步看下去。

其实,貌似每个cocosd-x自带的例子的进入首界面方式都差不多。大致就是下面这个方法:

bool AppDelegate::applicationDidFinishLaunching()
{
    // initialize director
    CCDirector *pDirector = CCDirector::sharedDirector();//取得摄像机对象
    pDirector->setOpenGLView(&CCEGLView::sharedOpenGLView());//// 设置OpenGL 视图(还没搞太清楚啥意思)

   
    pDirector->setDisplayFPS(true);// 设置是否显示每帧时间

    pDirector->setAnimationInterval(1.0 / 60);// 设置每帧时间

    CCScene * pScene = CCScene::node();//创建场景
   CCLayer * pLayer = new TestController();
    //pLayer->autorelease();

    pScene->addChild(pLayer);
    pDirector->runWithScene(pScene);

    return true;
}

上面我注释的基本就这个套路吧,下面的东西我想说说。

由于之前我是java程序员,所以看到类似多态的东西就特别亲切,

CCLayer * pLayer = new TestController();

明显TestController类继承了CCLayer啊,进去看看就知道

class TestController : public CCLayer
{
public:
    TestController();
    ~TestController();

    void menuCallback(CCObject * pSender);
    void closeCallback(CCObject * pSender);

    virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
    virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);

private:
    CCPoint m_tBeginPos;
    CCMenu* m_pItemMenu;
};

这个是TestController的声明,说白了就是一个自己定制的CCLayer,,上面加上了一些按钮的点击事件,还有触摸事件,还有一个menu,一个点(估计是用来初始化什么位置用的)。OK,下面来看TestController构造方法。

[code]TestController::TestController(): m_tBeginPos(CCPointZero)
{
    // 添加关闭按钮
    CCMenuItemImage *pCloseItem = CCMenuItemImage::itemFromNormalImage(s_pPathClose, s_pPathClose, this, menu_selector(TestController::closeCallback) );
   //这个pMenu就是单纯的用来放那个退出按钮的                                                                                                                                                                                          
      CCMenu* pMenu =CCMenu::menuWithItems(pCloseItem, NULL);
    CCSize s = CCDirector::sharedDirector()->getWinSize();

    pMenu->setPosition( CCPointZero );
    pCloseItem->setPosition(CCPointMake( s.width - 30, s.height - 30));

    //成员变量,给他初始化
    m_pItemMenu = CCMenu::menuWithItems(NULL);
    for (int i = 0; i < TESTS_COUNT; ++i)//各种循环,用来给各种item添加label,添加点击事件
    {

        CCLabelTTF* label = CCLabelTTF::labelWithString(g_aTestNames[i].c_str(), "Arial", 24);
		
        CCMenuItemLabel* pMenuItem = CCMenuItemLabel::itemWithLabel(label, this, menu_selector(TestController::menuCallback));

        m_pItemMenu->addChild(pMenuItem, i + 10000);
        pMenuItem->setPosition( CCPointMake( s.width / 2, (s.height - (i + 1) * LINE_SPACE) ));
    }
    m_pItemMenu->setContentSize(CCSizeMake(s.width, (TESTS_COUNT + 1) * (LINE_SPACE)));
    m_pItemMenu->setPosition(s_tCurPos);
    addChild(m_pItemMenu);
    setIsTouchEnabled(true);//可以触摸,就是可以下拉,要不然看不到全部的menuItem
    addChild(pMenu, 1);
}


这里可能就是这个点击事件有点不懂,看起来同一个menu_selector,怎么会识别不同的menuItem呢?

点进去看

void TestController::menuCallback(CCObject * pSender)
{
    // get the userdata, it's the index of the menu item clicked
    CCMenuItem* pMenuItem = (CCMenuItem *)(pSender);
    int nIdx = pMenuItem->getZOrder() - 10000;

    // create the test scene and run it
    TestScene* pScene = CreateTestScene(nIdx);
    if (pScene)
    {
        pScene->runThisTest();
        pScene->release();
    }
}

一目了然,原来之前

m_pItemMenu->addChild(pMenuItem, i + 10000);

这句话给了它一个tag,通过它,就能去创建不同的Scene了,这里的Scene是点击主界面的Item之后进去的另外的Scene啊,这个后来讲,以免混淆。

好了,现在主界面如何显示的应该流程比较清楚了。

首先,一个普通的scene,用摄像机加载,然后一个TestController(其实是一个层),把这个层放到scene里面,就OK了。

这上面看起来其实和HelloWorld一个套路,选择这个进行解释,是因为接下去我可能还要研究这个tests实例好久,这样的话,就可以后续继续研究了。

其实,我是想一遍学习,一边自己做一款小游戏,类似打飞机这种的,而且要加上lua脚本,而且自己加上服务端的功能,让它拥有网游功能。有了上面的学习,我想进入游戏这个界面,我应该可以自己搞定了,下一篇文章,我想自己先把进入游戏这个界面做一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: