Cocos2dx动作的基类是Action,Action提供了常用的方法。
//表示动作的逆向执行
virtual Action* reverse();
//表示动作是否结束
virtual bool isDone(void)const;
//停止动作
virtual void stop(void);
根据动作执行是否需要时间,将动作分为瞬时动作和延时动作。
瞬时动作: 动作的执行不需要花费时间,马上就能完成动作的执行。基类是ActionInstant。
延时动作: 动作的执行需要花费时间。基类是ActionInterval.
---->创建演示精灵
//使用png图片做成精灵帧,精灵帧创建精灵对象
auto spriteFrame = SpriteFrame::create("mp.png",Rect(0,81.25*2,81.25,81.25));
sprite = Sprite::createWithSpriteFrame(spriteFrame);
sprite->setPosition(visibleSize/2);
this->addChild(sprite);
<瞬时动作>
(翻转动作)
a. FlipX::create(bool) ; sprite->setFlippedX(bool); 水平方向翻转
b. FlipY::create(bool); sprite->setFlippedY(bool); 垂直方向翻转
c. isFlippedX()---->判断是否水平方向翻转; isFlippedY()---->判断是否垂直方向翻转
//创建两个菜单项,实现水平和垂直方向翻转
auto menuItemX = MenuItemFont::create("FlipX",CC_CALLBACK_1(Test::FlipX,this));
menuItemX->setPosition(Vec2(100,200));
auto menuItemY = MenuItemFont::create("FlipY", CC_CALLBACK_1(Test::FlipY, this));
menuItemY->setPosition(Vec2(300, 200));
auto menu = Menu::create(menuItemX, menuItemY,NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu);
//实现回调函数
void Test::FlipX(cocos2d::Ref * ref)
{
if (sprite->isFlippedX())
{
sprite->setFlippedX(false);
}
else
{
sprite->setFlippedX(true);
}
}
void Test::FlipY(cocos2d::Ref * ref)
{
if (sprite->isFlippedY())
{
sprite->setFlippedY(false);
}
else
{
sprite->setFlippedY(true);
}
}
(对象显示和隐藏)
a. Hide::create()---->隐藏对象
b. Hide::create()---->显示对象
//创建两个菜单项,实现显示和隐藏
auto menuItemHide = MenuItemFont::create("Hide", CC_CALLBACK_1(Test::menuItemHide, this));
menuItemHide->setPosition(Vec2(100, 500));
auto menuItemShow = MenuItemFont::create("Show", CC_CALLBACK_1(Test::menuItemShow, this));
menuItemShow->setPosition(Vec2(300, 500));
auto menus = Menu::create(menuItemHide, menuItemShow, NULL);
menus->setPosition(Vec2::ZERO);
this->addChild(menus);
void Test::menuItemHide(cocos2d::Ref * ref)
{
sprite->runAction(Hide::create());
}
void Test::menuItemShow(cocos2d::Ref * ref)
{
sprite->runAction(Show::create());
}
注意: Hide,Show与setVisible(bool),没有多大的区别,后者只是对前者的封装。
(延时动作)----> 需要时间来完成动作的执行
(实现移动)
a. 花费时间移动到哪个位置
MoveTo::create(float duration, const Vec2& point) ----> duration : 花费的时间 point : 目的地
b. 花费时间移动了多少距离
MoveBy::create(float duration, const Vec2& point)----->duration : 花费的时间 point : 移动的距离
对象当前的位置+point-->目的地
//创建两个菜单项,实现移动
auto menuItemTo = MenuItemFont::create("MoveTo", CC_CALLBACK_1(Test::menuItemTo, this));
menuItemTo->setPosition(Vec2(100, 400));
auto menuItemBy = MenuItemFont::create("MoveBy", CC_CALLBACK_1(Test::menuItemBy, this));
menuItemBy->setPosition(Vec2(300, 400));
auto menud = Menu::create(menuItemTo, menuItemBy, NULL);
menud->setPosition(Vec2::ZERO);
this->addChild(menud);
void Test::menuItemTo(cocos2d::Ref * ref)
{
Size visibleSize = Director::getInstance()->getVisibleSize();
auto size = visibleSize/2;
auto move = MoveTo::create(2, Vec2(size.width+150,size.height));
sprite->runAction(move);
}
void Test::menuItemBy(cocos2d::Ref * ref)
{
Size visibleSize = Director::getInstance()->getVisibleSize();
auto size = visibleSize / 2;
auto move = MoveBy::create(2, Vec2(size.width+150,size.height));
sprited->runAction(move);
}
注意:
MoveTo对象创建逆向动作的时候, 创建的对象为NULL。因为, MoveTo将对象的位置重新设置,原来的位置没有保存。
MoveBy对象创建逆向动作的时候, 创建的对象不为NULL。因为,MoveBy将原来的位置+移动的距离==目的位置,原来的位置保
存。