2013-08-23 8 views
4

가장 좋은 방법은 무엇입니까? 나는 CCEaseSineInOut 액션을 보았지만 그렇게하지는 않았다.Cocos2d - 정현파 모션으로 점 A에서 점 B로 스프라이트 이동

화면의 한쪽에서 다른쪽으로 이동해야합니다. 스프라이트는 스크린을 가로 질러 사인파 패턴으로 움직여야합니다.

+0

베 지어를 사용할 수 있습니다. http://stackoverflow.com/questions/14589474/cocos2d-2-x-understanding-ccbezierconfig-beheaviour –

+0

수동 작업보다 정현파 패턴을 얻고 싶다면 cceasesineinout와. 사인파의 한주기에 대해 cceasesineinout을 세 번 사용해야합니다. – Renaissance

답변

0

나는 항상 CCNode 모션을 완벽하게 제어하고 싶다. 나는 아주 기본적인 것을하기 위해서만 CCAction을 사용한다. 귀하의 케이스는 CCAction과 함께 할 정도로 간단하지만 시간이 지남에 따라 어떤 기능에 따라 CCNode을 이동하는 방법을 알려 드리겠습니다. 동일한 기술을 사용하여 축척, 색상, 불투명도, 회전 및 고정 점까지도 변경할 수 있습니다.

@interface SomeLayer : CCLayer 
{ 
    CCNode *nodeToMove; 
    float t; // time elapsed 
} 
@end 

@implementation SomeLayer 

// Assumes nodeToMove has been created somewhere else 
-(void)startAction 
{ 
    t = 0; 

    // updateNodeProperties: gets called at the framerate 
    // The exact time between calls is passed to the selector 
    [self schedule:@selector(updateNodeProperties:)]; 
} 

-(void)updateNodeProperties:(ccTime)dt 
{ 
    t += dt; 

    // Option 1: Update properties "differentially" 
    CGPoint velocity = ccp(Vx(t), Vy(t)); // You have to provide Vx(t), and Vy(t) 
    nodeToMove.position = ccpAdd(nodeToMove.position, ccpMult(velocity, dt)); 
    nodeToMove.rotation = ... 
    nodeToMove.scale = ... 
    ... 

    // Option 2: Update properties non-differentially 
    nodeToMove.position = ccp(x(t), y(t)); // You have to provide x(t) and y(t) 
    nodeToMove.rotation = ... 
    nodeToMove.scale = ... 
    ... 

    // In either case, you may want to stop the action if some condition is met 
    // i.e.) 
    if(nodeToMove.position.x > [[CCDirector sharedDirector] winSize].width){ 
     [self unschedule:@selector(updateNodeProperties:)]; 
     // Perhaps you also want to call some other method now 
     [self callToSomeMethod]; 
    } 
} 

@end 

특정 문제를 들어, x(t) = k * t + cy(t) = A * sin(w * t) + d과 옵션 2를 사용할 수 있습니다.

수학 노트 # 1 :x(t)y(t)는 위치 매개 변수화라고합니다. Vx(t)Vy(t)은 속도 매개 변수입니다.

수학 노트 # 2 : 당신이 수학을 공부 경우 해당 옵션 2 (특히 낮은 프레임 속도를위한) 시간이 지남에 위치 오류의 축적을 방지 쉽게 알 수있을 것이다. 가능한 경우 옵션 2를 사용하십시오. 그러나 정확도가 중요하지 않거나 사용자 입력이 매개 변수화를 적극적으로 변경하는 경우 옵션 1을 사용하는 것이 더 쉽습니다.

CCAction을 사용하면 많은 이점이 있습니다. 그들은 당신을 위해 특정 시간에 다른 기능을 호출하는 것을 처리합니다. 트랙을 추적하여 쉽게 일시 중지하고 다시 시작하거나 카운트 할 수 있습니다.

하지만 노드를 일반적으로 관리해야 할 때이를 수행 할 수 있습니다. 예를 들어 위치에 대한 복잡하거나 복잡한 수식의 경우 매개 변수화를 구현하는 방법을 알아내는 것보다 훨씬 쉽게 매개 변수화를 변경하는 것이 더 편리합니다 (CCAction).

+0

어떻게 SpriteKit에서 sinwave Motion을 만들 수 있습니까? – khaled

+0

"k", "t", "c", "w"및 "d"는 무엇입니까? – hyd00