Cocos2dx <5> 动作(1)

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());
}

(延时动作)----> 需要时间来完成动作的执行

(实现移动)

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将原来的位置+移动的距离==目的位置,原来的位置保

存。









猜你喜欢

转载自blog.csdn.net/wue1206/article/details/80053708