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