일단 시뮬레이터 좌표
http://aescripts.com/decasteljau-bezier-curve/
cocos2d에서 베이지곡선(bezier curves)는 상대곡선으로 움직인다.
이건 예제에 나오는 그로시니 아저씨의 움직임
//마치 앵그리 버드에서 새를 날릴때의 포물선을 그려준다.
static class ActionBezier extends ActionDemo {
public void onEnter() {
super.onEnter();
CGSize s = CCDirector.sharedDirector().winSize();
//
// startPosition can be any coordinate, but since the movement
// is relative to the Bezier curve, make it (0,0)
//
Log.w("s.width", String.valueOf(s.width));//09-03 12:45:06.915: W/s.width(23209): 800.0
// sprite 1
CCBezierConfig bezier = new CCBezierConfig(); //그로시니 p0==(400, 160)
bezier.controlPoint_1 = CGPoint.ccp(0, s.height/2); //p1 //s.height/2 == 480/2 == (0,240)
bezier.controlPoint_2 = CGPoint.ccp(300, -s.height/2); //p2 (300, -240)
bezier.endPosition = CGPoint.ccp(300,100); //p3 300, 100)
CCBezierBy bezierForward = CCBezierBy.action(3, bezier); //3초간 베이지 곡선으로 움직임
CCBezierBy bezierBack = bezierForward.reverse();
CCSequence seq = CCSequence.actions(bezierForward, bezierBack);
CCRepeatForever rep = CCRepeatForever.action(seq); //To가 아니라 By의 개념으로 움직인다. 이걸로 한참 삽질했다 bezier에서 설정한 값은 p0>p1>p2>p3의 방향으로 해당 x,y값만큼 움직임!
// sprite 2
tamara.setPosition(CGPoint.ccp(80,160));
kathia.setPosition(CGPoint.ccp(300, 240));
CCBezierConfig bezier2 = new CCBezierConfig();
bezier2.controlPoint_1 = CGPoint.ccp(100, s.height/2);
bezier2.controlPoint_2 = CGPoint.ccp(200, -s.height/2);
bezier2.endPosition = CGPoint.ccp(240,160);
CCBezierTo bezierTo1 = CCBezierTo.action(2, bezier2);
// sprite 3
kathia.setPosition(CGPoint.ccp(400,160));
CCBezierTo bezierTo2 = CCBezierTo.action(2, bezier2);
grossini.runAction(rep);
tamara.runAction(bezierTo1);
kathia.runAction(bezierTo2);
}
public String title() {
return "BezierBy / BezierTo";
}
}
본 블로그는 페이스북 댓글을 지원합니다.