cocos2d-x runAction 정보

올해의 봄~여름 무렵부터 cocos2d-x를 본격적으로 시작하게 되었습니다.
원래 C++11의 지식이 필요하거나 Android NDK에서 일부 빌드가 통과하지 않거나,
여러가지가 있었지만, 가장 집착한 cocos2d-x의 애니메이션에 대해 씁니다.

그 1 몇개의 Action을 호출할 때의 이야기



세 개의 스프라이트를 움직이고 싶다면 동시에 움직이고 싶다면 초보자 때
다음과 같이 설명했습니다.

1.1
auto circle = Sprite::create("circle.png");
auto triangle = Sprite::create("triangle.png");
auto square = Sprite::create("square.png");

this->addChild(circle);
this->addChild(triangle);
this->addChild(square);

circle->runAction(MoveTo::create(0.3, Vec2(100, 100)));
triangle->runAction(MoveTo::create(0.3, Vec2(100, 100)));
square->runAction(MoveTo::create(0.3, Vec2(100, 100)));


하지만,
Action을 멈추고 싶을 때나 Action 완료의 callback을 취하고 싶은 경우,
위의 쓰기는 그다지 적합하지 않았습니다.
위와 같은 Action을 하고 싶은 경우는 이하와 같이도 쓸 수 있습니다.

1.2
this->runAction(Spawn::create(TargetedAction::create(circle, MoveTo::create(0.3, Vec2(100, 100)),
                              TargetedAction::create(triangle, MoveTo::create(0.3, Vec2(100, 100)),
                              TargetedAction::create(square, MoveTo::create(0.3, Vec2(100, 100)),
                              nullptr));

1.2의 쓰는 방법이라면 애니메이션을 멈추고 싶은 경우, this->stopAllActions()로 일괄적으로 멈출 수 있습니다.
반대로 그 2로 벌써 this->runAction()를 실시하고 있는 경우, Action를 덧쓰기되어 버립니다.

TargetedAction은 매우 유용하며 Action의 가독성이 높아질 뿐만 아니라,
어떤 노드가 어떤 Action을 관리하는지 알 수 있습니다.

2 일부 Action이 호출 될 때의 이야기



다음과 같은 경우가있었습니다.
・エフェクトAを再生する
・エフェクトAのアクション完了時にエフェクトBとCを同時再生する
・エフェクトBかCのアクション完了時にエフェクトDを再生する
・ここのエフェクトだけちょっとスロー再生で

이 때에 이펙트의 클래스를 어떻게 쓸까를 헤매었습니다만,
어리석은 곳에서 다음 사항을 멈추면 깨끗했습니다. (개인의 감상입니다)

・그 클래스로부터 Action의 처리를 취득할 수 있는 것
・그 클래스로부터 Action의 처리를 던져 없이 할 수 있는 것
・duration은 외출

구체적으로 이런 느낌을 쓰면

HogeEffect.cpp


FiniteAction* HogeEffect::getPlayAction(float duration)
{
    return TargetedAction::create(this, MoveTo::create(duration, Vec2(100, 100)),
}

void HogeEffect::runPlayAction(float duration)
{
    this->runAction(getPlayAction(duration));
}

다음과 같이 호출할 수 있습니다.

this->runAction(Sequence::create(effectA->getPlayAction(0.1f),
                                 Spawn::create(effectB->getPlayAction(0.2f),
                                               effectC->getPlayAction(0.3f),
                                               nullptr),
                                 effectD->getPlayAction(0.4f),
                                 nullptr));

Action에는 많은 파생 클래스가 있지만,
개인적으로는 Spawn, Sequence를 자주 사용하므로 FiniteAction*에서 정의하고 있었습니다.



h tp // w w. 여기 s2dx. rg/레후오렌세/나치ゔぇ-cp/V3. HTML
h tp // w w. 여기 s2dx. 오 rg / 레후 렌세 / 나치 ゔ ぇ c p / V3. HTML
h tp // w w. 여기 s2dx. rg/레후렌센스/나치ゔぇぇcp/V3. HTML

그 3 다른 언어 등과 비교한 이야기 ​​(+래퍼 만들었습니다)




언어/도구
이름
특징


swift
SKAction 클래스 일반
cocos2d와 거의 동일

Unity 표준
애니메이션
커브 애니메이션 지정. Animator(Mecanim)와의 연계가 강력

Unity Plugin
iTween
ㅇㅇㅇㅇㅇㅇぇlp ぁ세멘 t. 이 m/그리고 x. php

ActionScript
BetweenAS3
h tp // w w.ぃ bs 파 rk. 오 rg / 우키 / 베토 에나 S3

ActionScript
Tweener
htps : // 여기. 오, ぇ. 이 m/p/와 ㅇ네 r/


Tween 애니메이션과 관련하여 각 도구에서 대체로 다음은 표준화되었습니다. (정말 죄송합니다.)
・이동(절대 위치/상대 위치)
· 확대
・회전
· Easing 지정 (Quad, Elastic, Back 등의 각종에 관해서 In, InOut, Out)

작성중은 Easing 조견표가 편리했으므로 붙여 둡니다.
htp // 에아신 gs. 네 t / 그럼

덧붙여서 iTween, BetweenAS3, cocos2d-x 각각의 쓰기 방법은 다음과 같이 되어 있습니다
(x:100, y:100을 QuadOut 여유로 0.2sec로 이동하는 경우)

[iTween]
iTween.MoveTo(gameObject, iTween.Hash("x", 100, "y", 100, "time", 0.2f, "easetype", iTween.EaseType.easeOutQuad));

[BetweenAS3]
BetweenAS3.to(frog, {x:100, y:100}, 0.2f, Quad.easeOut);

[cocos2d-x]
this->runAction(EaseQuadraticActionOut::create(MoveTo::create(Point(100, 100), 0.2f));

···

··· 그 외에 비해 Easing의 지정 방법이 조금 다른 것 같은··
그리고 같은 움직임을 같은 간격, 같은 Easing 지정으로 할 때에 아무것도 지정하지 않으면 안 되어 번거로움・・
그리고 미묘하게 cocos2d-x의 Easing 명칭이 긴 ··

그래서!

BetweenAS3라이크한 래퍼(Between 클래스) 만들었습니다↓
htps : // 기주 b. 코 m / 케이 d 로이 d / 아 d ゔ t2014

이런 가키타
this->runAction(Between::to(this, "x:100, y:100", 0.2f, Easing::QuadOut));

래퍼 없음의 경우와 있는 경우, 동시 재생으로 회전·확대를 더하면 각각 이하가 됩니다

[소로 쓴 경우]
this->runAction(Spawn::create(EaseQuadraticActionOut::create(MoveTo::create(Point(100, 100), 0.2f),
                              EaseQuadraticActionOut::create(RotateTo::create(30, 0.2f),
                              EaseQuadraticActionOut::create(ScaleTo::create(2.0f, 0.2f));

[래퍼 있음]
this->runAction(Between::to(this, "x:100, y:100, rot:30, scale:2", 0.2f, Easing::QuadOut));

(˚Д˚)

애니 애니메이션을 스크립트로 작성할 기회는 앞으로도 있을지 잘 모르겠지만
사쿠토 애니메이션을 쓰고 싶을 때 적합하면 사용하십시오.
(자신은 Flash를 cocos2d-x에 이식하기 위해 만들었습니다)

내일은 네이티브 제휴 이야기! 매우 기대됩니다!

좋은 웹페이지 즐겨찾기