cocos2d-x 3.0 Action


出典を明記してください.http://blog.csdn.net/lttree********************************************
余談:
久、久、久、久、久、木有更新
8月、韓国に9日間旅行して、帰ってきて、直接井岡山に行って実践活動に参加しました(課題はアンドロイドアプリを作ることです)
はい、今井岡山実践基地にいます.19日に帰らなければなりません.
そして、やっとWIFIに繋がって、ブログを送れるようになりました.
本文:
今回はcococos 2 d-xについてのActionですが、動作とか、いろいろな動作とか、これの勉強は、cococos 2 d-xの例によるといいでしょう.
{
PS:サンプルプログラムの開き方:
VS 2012でプロジェクトを開く:
->cococos 2 d-xフォルダの下
——buildフォルダの下
cocos2d-win32.vc 2012プロジェクト
}
このブログでは、7つのテストプログラムを通じて、基本的なアクションを示します.
一、Manual Transformation————精霊に対する基本設定
二、MoveToとMoveBy――精霊の基本動作(順番実行動作)
三、Span+Rotate————精霊の基本動作(同時に動作)
四、DelayTime:m+delay+m――動作の遅延実行
五、RepeatとRepeatForever――繰り返し実行
六、Follow Action————動作に従う
七、Sequence of InstantActions――終了メカニズム
はい、プログラムを実行しながら、コードを見て、を勉強することができます.
ファイルはActionTestを見ることができます.cpp
実行中のプログラムでAction-Basicを選択して表示
cocos2d-x 3.0 Action_第1张图片
-最初のテスト-
Manual Transformation
コードの位置は次のとおりです.
//------------------------------------------------------------------
//
// ActionManual
//
//------------------------------------------------------------------
void ActionManual::onEnter()
{
    ActionsDemo::onEnter();

    auto s = Director::getInstance()->getWinSize();

    _tamara->setScaleX( 2.5f);
    _tamara->setScaleY( -1.0f);
    _tamara->setPosition( Point(100,70) );
    _tamara->setOpacity( 128);

    _grossini->setRotation( 120);
    _grossini->setPosition( Point(s.width/2, s.height/2));
    _grossini->setColor( Color3B( 255,0,0));

    _kathia->setPosition( Point(s.width-100, s.height/2));
    _kathia->setColor( Color3B::BLUE);
}

std::string ActionManual::subtitle() const
{
    return "Manual Transformation";
}

コードから見ると、
オブジェクトに対する一連のアクション:
//------------------------------------------------------------------
//
// ActionManual
//
//------------------------------------------------------------------
void ActionManual::onEnter()
{
    ActionsDemo::onEnter();

	//         OpenGL     
    auto s = Director::getInstance()->getWinSize();


	//           :
	//  X   
    _tamara->setScaleX( 2.5f);
    //  Y   
	_tamara->setScaleY( -1.0f);
    //     
	_tamara->setPosition( Point(100,70) );
    //      
	_tamara->setOpacity( 128);


	//            :
	//       
    _grossini->setRotation( 120);
    _grossini->setPosition( Point(s.width/2, s.height/2));
	//     
    _grossini->setColor( Color3B( 255,0,0));


<span style="white-space:pre">	</span>//            :
    _kathia->setPosition( Point(s.width-100, s.height/2));
    _kathia->setColor( Color3B::BLUE);
}

std::string ActionManual::subtitle() const
{
    return "Manual Transformation";
}

ここの関数はOnEnterなのに、なぜInitではないのか気づいたかもしれません.
ここではOnEnterとInitの違いについてお話しします.
Init:オブジェクトの初期化時に実行される関数.
OnEnter:オブジェクトが表示されたときに実行される関数.(表示されている場合のみ実行されます)
-2番目のテスト-
2つ目のテストはMoveToとMoveByについてのテストです
コード:
//------------------------------------------------------------------
//
//    ActionMove
//
//------------------------------------------------------------------
void ActionMove::onEnter()
{
    ActionsDemo::onEnter();

    centerSprites(3);

    auto s = Director::getInstance()->getWinSize();

	//       :
	//            ,           
    auto actionTo = MoveTo::create(2, Point(s.width-40, s.height-40));
    //           ,          80,  80,           
	auto actionBy = MoveBy::create(2, Point(80,80));
    //    actionBy     
	auto actionByBack = actionBy->reverse();


	//               
	//         actionTo  
    _tamara->runAction( actionTo);
    //          actionBy actionByBack  (   actionBy,   actionByBack)
	_grossini->runAction( Sequence::create(actionBy, actionByBack, NULL));
    //        MoveTo  (  : 1  ,  ,    40)
	_kathia->runAction(MoveTo::create(1, Point(40,40)));
}

std::string ActionMove::subtitle() const
{
    return "MoveTo / MoveBy";
}

ここで特に注意したいのは、一連の動作を順次実行できるSequenceです.
次は自分で見ることができますが、
APIを借りると、簡単にわかります.
-3番目のテストプログラム-
このテストプログラムはSpan+Rotateです
//------------------------------------------------------------------
//
// ActionSpawn
//
//------------------------------------------------------------------

void ActionSpawn::onEnter()
{
    ActionsDemo::onEnter();

    alignSpritesLeft(1);

    auto action = Spawn::create(
        JumpBy::create(2, Point(300,0), 50, 4),
        RotateBy::create( 2,  720),
        NULL);

    _grossini->runAction(action);
}

std::string ActionSpawn::subtitle() const
{
    return "Spawn: Jump + Rotate";
}

これは、2つの動作を同時に実行させることです.
JumpBy::create(2,Point(300,0),50,4)
ジャンプの語句.
RotateBy::create(2,720)
文を反転します.
Sequenceと同様に、Spawnは複数の動作を同時に行うために使用できます.
4番目のテストプログラム
これはDelayTime:m+delay+m
中間に遅延時間を追加します.
//------------------------------------------------------------------
//
// ActionDelayTime
//
//------------------------------------------------------------------
void ActionDelayTime::onEnter()
{
    ActionsDemo::onEnter();

    alignSpritesLeft(1);

    auto move = MoveBy::create(1, Point(150,0));
    auto action = Sequence::create( move, DelayTime::create(2), move, NULL);

    _grossini->runAction(action);
}

std::string ActionDelayTime::subtitle() const
{
    return "DelayTime: m + delay + m";
}

明らかに、Sequenceを使って、順番に実行して、中間に遅延文DelayTimeを加えればいいです.
-5番目のテストプログラム-
RepeatとRepeatForever
//------------------------------------------------------------------
//
// ActionRepeat
//
//------------------------------------------------------------------
void ActionRepeat::onEnter()
{
    ActionsDemo::onEnter();

    alignSpritesLeft(2);


    auto a1 = MoveBy::create(1, Point(150,0));
    auto action1 = Repeat::create(
        Sequence::create( Place::create(Point(60,60)), a1, NULL) , 
        3); 
    auto  action2 = RepeatForever::create(
        Sequence::create(a1->clone(), a1->reverse(), NULL)
        );

    _kathia->runAction(action1);
    _tamara->runAction(action2);
}

std::string ActionRepeat::subtitle() const
{
    return "Repeat / RepeatForever actions";
}

Repeatは一定回数の動作を行う.
Repeat::createには2つのパラメータがあります.1つ目は繰り返しが必要な動作、2つ目の繰り返しの回数です.
繰り返し回数の値は、1~2^30の間の符号なし整数です.
対応するRepeatForeverには回数のパラメータがなく、1つのパラメータしかありません.
-6番目のテストプログラム-
Follow Action
//------------------------------------------------------------------
//
// ActionFollow
//
//------------------------------------------------------------------
void ActionFollow::onEnter()
{
    ActionsDemo::onEnter();

    centerSprites(1);
    auto s = Director::getInstance()->getWinSize();

	//          
    _grossini->setPosition(Point(-200, s.height / 2));
	//        
    auto move = MoveBy::create(2, Point(s.width * 3, 0));
    auto move_back = move->reverse();
    //        
	auto seq = Sequence::create(move, move_back, NULL);
    //          
	auto rep = RepeatForever::create(seq);

    _grossini->runAction(rep);

	//        ,creat     ,            ,           
    this->runAction(Follow::create(_grossini, Rect(0, 0, s.width * 2 - 100, s.height)));
}

追従を設定する文では、2番目のパラメータは動作に関する境界であり、パラメータがRect::ZEROに設定されている場合、すなわち境界がない.
-7番目のテストプログラム-
Sequence of InstantActions
//------------------------------------------------------------------
//
//    ActionSequence2
//
//------------------------------------------------------------------
void ActionSequence2::onEnter()
{
    ActionsDemo::onEnter();

    alignSpritesLeft(1);

	//         ,false    
    _grossini->setVisible(false);

	//             
    auto action = Sequence::create(
		Place::create(Point(200,200)),
		Show::create(),
		MoveBy::create(1, Point(100,0)),
		//           ,       
		CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback1,this)),
		CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback2,this,_grossini)),
		CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback3,this,_grossini,0xbebabeba)),
		NULL);

    _grossini->runAction(action);
}

CallFunc::create文で、
CC_CALLBACK_0はパラメータがないことを示し、Action使用時に適用
CC_CALLBACK_1はパラメータが1つしかないことを示し、Menuの使用時に適用
CC_CALLBACK_2はバインディングに2つのパラメータがあることを示し、一般的にユーザーの単点タッチ、多点タッチに用いられる.
******まとめ******
Action:
——基本動作
MoveTo/MoveBy
RoatTo/RoatBy
JumpTo/JumpBy
.......
——組み合わせ動作
Sequenceシーケンス実行
Spawn同時実行
——動作の取逆
Reverse
——動作の繰り返し実行
Repeat
RepeatForever
——関数動作
CallFucn::create()
うん、ここまでだよ~
参考資料:沈先生
出典を明記してください.http://blog.csdn.net/lttree********************************************