Cocos2D-x权威指南
上QQ阅读APP看书,第一时间看更新

3.1.4 实例:通过节点控制屏幕中的全体渲染对象

本节,已经可以利用我们目前所学的知识做出一些有趣的东西。之前已经说过,CCNode类没有贴图,也就是说在屏幕上单独建立一个节点是没有任何效果的,但是可以通过这个“无形”的节点来控制屏幕上的节点。现在就开始吧!

1.加入节点

新建一个项目,并在HelloWorldScene.cpp文件中的init函数中做如代码清单3-2的代码所示的修改。

代码清单3-2 加入节点

bool HelloWorld::init()
{
    if (!CCLayer::init())
    {
        return false;
    }
    //创建一个节点
    CCNode *anode=CCNode::create();
    //将节点作为子节点加入场景类中
    this->addChild(anode,0);
    CCMenuItemImage *pCloseItem=CCMenuItemImage::create(
                                      "CloseNormal.png",
                                      "CloseSelected.png",
                                      this,
    menu_selector(HelloWorld::menuCloseCallback));
    pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20,20));
    CCMenu* pMenu=CCMenu::create(pCloseItem,NULL);
    pMenu->setPosition(CCPointZero);
    //将菜单作为子节点加入之前定义的节点中
    anode->addChild(pMenu,1);
    CCLabelTTF* pLabel=CCLabelTTF::create("Hello World","Thonburi",34);
    CCSize size=CCDirector::sharedDirector()->getWinSize();
    pLabel->setPosition(ccp(size.width/2,size.height - 20));
    //将标签作为子节点加入之前定义的节点中
    anode->addChild(pLabel,1);
    CCSprite* pSprite=CCSprite::create("HelloWorld.png");
    pSprite->setPosition(ccp(size.width/2,size.height/2));
    //将背景图片作为子节点加入之前定义的节点中
    anode->addChild(pSprite,0);
    return true;
}

首先通过create函数创建一个节点anode,把anode作为子节点使用addChild函数加入HelloWorld场景类对象中;然后把本来作为子节点加入HelloWorld场景类对象中的对象,使用addChild函数作为子节点加入anode中。这些对象包括菜单类对象、标签类对象、人物精灵类对象。这些对象的类都是CCNode类的子类。如果目前你对这些对象的使用不了解的话,请跳过这些对象的使用,因为对于这些本书会在后面做相应的讲解。

运行项目,发现和修改前的项目并无区别,如图3-4所示。

图3-4 加入节点控制的项目运行效果

2.改变位置

修改HelloWorldScene.cpp文件中的init方法,如代码清单3-3所示。

代码清单3-3 设置节点位置

//设置节点位置
anode->setPosition(ccp(50,50));

运行效果如图3-5所示。

图3-5 修改节点位置后的运行效果

可以看到,整体都跟着节点移动了。

3.设置缩放

下面修改这段代码如代码清单3-4所示,看一下缩放的效果。

代码清单3-4 设置缩放代码

//设置缩放
anode->setScale(0.5);

运行效果如图3-6所示。

图3-6 整体缩放后的运行效果

4.整体旋转

最后再来试验整体旋转,如代码清单3-5所示。因为默认锚点在左下角,因此需要首先移动一下整体的位置,否则整体一转,屏幕中将只显示黑屏。注意角度设置为角度制。

代码清单3-5 设置旋转

//设置旋转
anode->setPosition(ccp(200,200));
anode->setRotation(90.0);

运行效果如图3-7所示。

本节介绍了屏幕中渲染对象的基础类CCNode,下一节将介绍控制游戏显示的导演类CCDirector。

图3-7 整体旋转后的运行效果