通过本文主要向大家介绍了动作补间动画实例,ppt动作路径实例,动作路径实例,性交动作实例,wincc c动作实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
我们玩的游戏一般都可以看到精灵的运动,游戏的世界就是一个运动的世界,而所有的这些动作都可以分为一些基本的动作和动作的组合,今天就来学习一下动作类CCAction,首先看一下类之间的继承关系。
CCAction类下派生了三个动作类,执行动作的类是CCNode以及它的子类,通过函数runAction()来执行动作,其中CCFiniteTimeAction之下是常用的瞬时动作和延时动作。动作从本质上来说就是改变节点的属性,瞬时动作就是改变这些属性不需要时间,瞬时就完成了,而延时动作改变这些属性需要一些时间,可以通过参数来设置这个时间,下面是瞬时动作和延时动作的例子,解释看源代码。点击下图查看效果。
bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); //创建一个精灵 CCSprite * sprite = CCSprite::create("image.png"); sprite->setPosition(ccp(240,160)); //最后一个参数是精灵的tag,以便在众多的子节点中,通过getChildByTag()找到该节点 this->addChild(sprite,0,0); //创建菜单 CCMenuItemFont * fontMenu1 = CCMenuItemFont::create("start"); CCMenuItemFont * fontMenu2 = CCMenuItemFont::create("stop"); //和move函数相互绑定 CCMenuItemToggle * toggleMenu = CCMenuItemToggle::createWithTarget(this,menu_selector(HelloWorld::move), fontMenu1,fontMenu2,NULL); CCMenu * menu = CCMenu::create(toggleMenu,NULL); menu->setPosition(ccp(420,40)); this->addChild(menu); bRet = true; } while (0); return bRet; } void HelloWorld::move(CCObject* pSender) { //通过tag获得添加的精灵 CCSprite * sprite = (CCSprite *)this->getChildByTag(0); CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender; //瞬时动作CCPlace,改变了精灵的坐标,可以用sprite->setPosition(ccp(60,160))代替,但写成动作可以加入到动作序列中 CCPlace * action1 = CCPlace::create(ccp(60,160)); //瞬时动作,使精灵做X轴的翻转 CCFlipX * action2 = CCFlipX::create(true); if(toggleMenu->getSelectedIndex() == 1) { //通过runAction精灵执行动作 sprite->runAction(action2); } else if(toggleMenu->getSelectedIndex() == 0) { } }</div>
void HelloWorld::move(CCObject* pSender) { //通过tag获得添加的精灵 CCSprite * sprite = (CCSprite *)this->getChildByTag(0); CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender; //延时动作,第一个参数是执行动作所需要的时间,moveTo是绝对的,就是移动到哪个坐标,而moveBy是相对的 //传入的ccp(10,0)是一个向量,精灵沿着x轴移动了10个像素 CCMoveTo * moveTo = CCMoveTo::create(2.0,ccp(240,180)); CCMoveBy * moveBy = CCMoveBy::create(2.0,ccp(10,0)); //rotate按照一定的角度旋转,to强调的是结果,现在是0度,会旋转到90度,如果现在是90度,还是会在90度 CCRotateTo * rotateTo = CCRotateTo::create(2.0,90); //by强调旋转的相对角度,不论现在多少度都会旋转90度,以to和by结尾的动作类都是相同的道理 CCRotateBy * rotateBy = CCRotateBy::create(2.0,90); if(toggleMenu->getSelectedIndex() == 1) { //通过runAction精灵执行动作 //sprite->runAction(moveTo); //sprite->runAction(moveBy); sprite->runAction(rotateBy); } else if(toggleMenu->getSelectedIndex() == 0) { } }</div>
以by结尾的延时动作都可以通过reverse()获得它的反动作。
void HelloWorld::move(CCObject* pSender) { //通过tag获得添加的精灵 CCSprite * sprite = (CCSprite *)this->getChildByTag(0); CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender; //第二个参数是跳跃的向量,第三个参数是跳跃的高度,第四个参数是跳跃的次数 CCJumpBy * jumpBy = CCJumpBy::create(2.0,ccp(100,30),50,4); //以by结尾的延时动作都可以通过reverse()获得它的反动作 CCActionInterval * jumpBack = jumpBy->reverse(); if(toggleMenu->getSelectedIndex() == 1) { //通过runAction精灵执行动作 sprite->runAction(jumpBy); } else if(toggleMenu->getSelectedIndex() == 0) { sprite->runAction(jumpBack); } }</div>
延时动作中还有俩个重复动作的函数,就是重复不断的执行某一个动作,看下他们的继承关系。
下面是实现的源代码。
void HelloWorld::move(CCObject* pSender) { //通过tag获得添加的精灵 CCSprite * sprite = (CCSprite *)this->getChildByTag(0); CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender; //第一个参数传入重复的动作,第二个参数传入重复的次数 CCRepeat * repeat = CCRepeat::create(rotateBy,4); //永远重复执行一个动作 CCRepeatForever * repeatForever = CCRepeatForever::create(rotateBy); if(toggleMenu->getSelectedIndex() == 1) { //通过runAction精灵执行动作 sprite->runAction(repeatForever); } else if(toggleMenu->getSelectedIndex() == 0) { } }</div>
下面再列举一下基本常用的瞬时动作和延续动作。
瞬时动作:
放置Place:效果类似于 setPosition = ccp(x, y)。