Cocos2d-x2.0 RotateWorldTest深入分析

长平狐 发布于 2013/03/19 18:39
阅读 129
收藏 0
 

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier]

红孩儿Cocos2d-X学习园地QQ2群:44208467加群写:Cocos2d-x 
红孩儿Cocos2d-X学习园地QQ群:249941957 [暂满]加群写:Cocos2d-x

本章为我的Cocos2d-x教程一书初稿。望各位看官多提建议!

另请转载者注明转载地址及作者。

Cocos2d-x2.0 RotateWorldTest深入分析

另:本章所用Cocos2d-x版本为:

cocos2d-2.0-x-2.0.2@ Aug 30 2012

http://cn.cocos2d-x.org/download

              我们今天来学习一下RotateWorldTest这个实例,这个实例讲了点什么呢?顾名思义,“旋转世界”。嗯,让我想起潘帅的“反转地球”了。我们一起来转起来吧~

运行截图:


   打开RotateWorldTest.h:

//没什么新鲜,演示当前实例的场景和CCLayer们:
class RotateWorldTestScene : public TestScene
{
public:
    virtual void runThisTest();
};

class SpriteLayer : public CCLayer
{
public:
    virtual void onEnter();
    CREATE_FUNC(SpriteLayer)
};

class TestLayer : public CCLayer
{
public:
    virtual void onEnter();

    CREATE_FUNC(TestLayer)
};

class RotateWorldMainLayer : public CCLayer
{
public:
    virtual void onEnter();

    CREATE_FUNC(RotateWorldMainLayer)
};

直接看RotateWorldTest.cpp吧:

//加载TestLayer时调用的处理:
void TestLayer::onEnter()
{
	//调用基类的相应函数。
    CCLayer::onEnter();
	//定义临时变量x,y保存窗口大小。
    float x,y;
    //取得窗口大小。
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    x = size.width;
    y = size.height;

    //创建一个文字标签
    CCLabelTTF* label = CCLabelTTF::create("cocos2d", "Tahoma", 64);
	//设置其位置
    label->setPosition( CCPointMake(x/2,y/2) );
    //放到当前CCLayer中。
    addChild(label);
}

//加载SpriteLayer时调用的处理:
void SpriteLayer::onEnter()
{
	//调用基类的相应函数。
    CCLayer::onEnter();
	//定义临时变量x,y保存窗口大小。
    float x,y;
    //取得窗口大小。
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    x = size.width;
    y = size.height;
    //创建演员们,熟悉的男一号,女一号,女二号,都上台了。
    CCSprite* sprite = CCSprite::create(s_pPathGrossini);
    CCSprite* spriteSister1 = CCSprite::create(s_pPathSister1);
    CCSprite* spriteSister2 = CCSprite::create(s_pPathSister2);
    //设置各自的缩放值 。
    sprite->setScale(1.5f);
    spriteSister1->setScale(1.5f);
    spriteSister2->setScale(1.5f);
    //设置各自的位置。
    sprite->setPosition(CCPointMake(x/2,y/2));
    spriteSister1->setPosition(CCPointMake(40,y/2));
    spriteSister2->setPosition(CCPointMake(x-40,y/2));
	//创建一个16秒内反向旋转3600度的动画。
    CCAction *rot = CCRotateBy::create(16, -3600);
    //将演员们都放到场景。
    addChild(sprite);
    addChild(spriteSister1);
    addChild(spriteSister2);
    //男一号运行上面的旋转动画。
    sprite->runAction(rot);
	//创建一个跳跃动画,4秒内跳跃4次。
    CCActionInterval *jump1 = CCJumpBy::create(4, CCPointMake(-400,0), 100, 4);
	//创建上面跳跃动画的反向动画。
    CCActionInterval *jump2 = jump1->reverse();
    //创建一个旋转动画,4秒内旋转720度。
    CCActionInterval *rot1 = CCRotateBy::create(4, 360*2);
	//创建上面旋转动画的反向动画。
    CCActionInterval *rot2 = rot1->reverse();
    
    //女一号循环运行5次一个动画序列,动画序列就是交替运行跳跃动画和其反向动画,不过是先运行反向动画。
spriteSister1->runAction(CCRepeat::create( CCSequence::create(jump2, jump1, NULL), 5 ));
    //女二号无限循环运行5次一个动画序列,动画序列也是交替运行跳跃动画和其反向动画。
spriteSister2->runAction(CCRepeat::create( CCSequence::create((CCFiniteTimeAction *)(jump1->copy()->autorelease()), (CCFiniteTimeAction *)(jump2->copy()->autorelease()), NULL), 5 ));
    
    //女一号循环运行5次一个动画序列,动画序列交替运行旋转动画和其反向动画。
spriteSister1->runAction(CCRepeat::create( CCSequence::create(rot1, rot2, NULL), 5 ));
     //女二号循环运行5次一个动画序列,动画序列交替运行旋转动画和其反向动画,不过是先运行反向动画。
spriteSister2->runAction(CCRepeat::create( CCSequence::create((CCFiniteTimeAction *)(rot2->copy()->autorelease()), (CCFiniteTimeAction *)(rot1->copy()->autorelease()), NULL), 5 ));
}

//加载RotateWorldMainLayer时调用的处理:
void RotateWorldMainLayer::onEnter()
{
	//先调用基类的相应函数。
    CCLayer::onEnter();
	//定义临时变量x,y保存窗口大小。
    float x,y;
    //取得窗口大小。
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    x = size.width;
    y = size.height;
    //创建分别代表Blue,Red,Green,White四种纯色的纯色层。
    CCNode* blue =  CCLayerColor::create(ccc4(0,0,255,255));
    CCNode* red =   CCLayerColor::create(ccc4(255,0,0,255));
    CCNode* green = CCLayerColor::create(ccc4(0,255,0,255));
    CCNode* white = CCLayerColor::create(ccc4(255,255,255,255));
	//设置其各自的缩放为屏幕大小的一半。
	//蓝色,设置缩放后,设置其位置初始化时向左下移动屏幕大小四分之一。
    blue->setScale(0.5f);
    blue->setPosition(CCPointMake(-x/4,-y/4));
	//创建SpriteLayer实例放入blue层中。
    blue->addChild( SpriteLayer::create() );
    //红色,设置缩放后,设置其位置初始化时向右下移动屏幕大小四分之一。
    red->setScale(0.5f);
    red->setPosition(CCPointMake(x/4,-y/4));
	//绿色,设置缩放后,设置其位置初始化时向左上移动屏幕大小四分之一。
    green->setScale(0.5f);
    green->setPosition(CCPointMake(-x/4,y/4));
	//创建TestLayer实例放入green层中。
    green->addChild(TestLayer::create());
	//白色。,设置缩放后,设置其位置初始化时向右下移动屏幕大小四分之一。
    white->setScale(0.5f);
    white->setPosition(ccp(x/4,y/4));
    white->ignoreAnchorPointForPosition(false);
    white->setPosition(ccp(x/4*3,y/4*3));
	//将各纯色层加入当前场景。
    addChild(blue, -1);
    addChild(white);
    addChild(green);
    addChild(red);
	
	//创建一个旋转动画。8秒内从当前状态开始旋转720度。
    CCAction* rot = CCRotateBy::create(8, 720);
    //各色纯色层都运行这个动画。
    blue->runAction(rot);
    red->runAction((CCAction *)(rot->copy()->autorelease()));
    green->runAction((CCAction *)(rot->copy()->autorelease()) );
    white->runAction((CCAction *)(rot->copy()->autorelease()) );
}

//加载场景时调用的处理。
void RotateWorldTestScene::runThisTest()
{
	//创建一个RotateWorldMainLayer的CCLayer实例,并放入当前场景。
    CCLayer* pLayer = RotateWorldMainLayer::create();

    addChild(pLayer);
	//让当前场景运行在4秒内反向旋转360度的动画。
    runAction( CCRotateBy::create(4, -360) );
	//运行这个场景。
    CCDirector::sharedDirector()->replaceScene(this);

}

              现在总结一下世界是怎么转动的吧。在开始时,场景创建了四个纯色层,分别通过缩小为屏幕的一半后偏移来填充到窗口的左上,右上,左下,右下四个部分,并让它们开始绕着中心点旋转,其中蓝色层和绿色层中又各自放了一个子结点层,分别为SpriteLayerTestLayer,其中SpriteLayer中表现的是三个演员的跳跃和旋转动画,TestLayer中有一个文字标签。就这么回事。这里的关键是旋转动画的对象要弄清楚。既有精灵,也有层,也有场景,它们都属于CCNode的派生类,因为旋转动画操纵的是CCNode的变化,所以我们可以对所有基于CCNode的派生类来进行相应的动画。



原文链接:http://blog.csdn.net/honghaier/article/details/8499401
加载中
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部