CCFollow는 대상을 중심에 놓고 화면이 움직이는 거다.
올림픽을 생각해보자.
우사인 볼트가 뛸때 카메라는 그를 가운데 담을꺼다.
그럼 우리가 보기엔 배경이 뒤로 지나가는 것처럼 보인다.
(배경은 고정이고 볼트가 달리는 건데!!)
이런 효과를 주는거다. 소스를 보자.
static class ActionFollow extends ActionDemo {
public void onEnter() {
super.onEnter();
centerSprites(1);
CGSize winSize = CCDirector.sharedDirector().winSize();
// grossini.setPosition(CGPoint.ccp(200, 200));
// grossini.setPosition(CGPoint.ccp(-200, winSize.height/2));
// grossini.setPosition(CGPoint.ccp(200, 480));
CCMoveBy move = CCMoveBy.action(2, CGPoint.ccp(100,0));
CCMoveBy move_back = move.reverse();
CCSequence seq = CCSequence.actions(move, move_back);
CCRepeatForever rep = CCRepeatForever.action(seq);
grossini.runAction(rep);
// CGRect.make(0, 0, 0,0);
// CGRect.make(0, 0, (winSize.getWidth()*2)-100, winSize.getHeight());
this.runAction(
CCFollow.action(grossini)//, CGRect.make(0, 0, (winSize.width*2)-100, winSize.height)));
);
}
붉게 칠한 부분이 핵심이다.
우리의 그로시니 형을 중심으로 카메라 앵글을 옮기는 거다.
문제는 안드로이드 펍에 누군가 올려놓은 질문
http://www.androidpub.com/2108155
그렇다! 원래 소스는 제대로 동작하지 않는다.
값을 바꿔가면서 테스트 해봤는데
CGRect.make로 값을 주면 이상해 지길래 CCFollow 클래스를 열어 보았다.
생성자가 두개가 있는데 바운더리 설정을 안하는거는 당연히 rect값을 받지 않는다.
/** creates the action with no boundary set */
public static CCFollow action(CCNode followedNode) {
return new CCFollow(followedNode);
}
/** creates the action with a set boundary */
public static CCFollow action(CCNode followedNode, CGRect rect) {
return new CCFollow(followedNode, rect);
}
그리고 이 두개의 생성자가 리턴하는 값중 다른것이..
boundarySet 이라는 변수였다.
위의 경우 렉트값을 받지 않는 생성자가 실행될때 작동하는 걸로 보아 이 boundarySet 변수 값이 false일때만 카메라 움직임이 제대로 되는 것을 생각해보면 이 변수가 true가 될때 어딘가 삐꾸가 된다는 이야기가 된다.
그리고 오버라이드 되는 스텝메소드에서 if문으로 이것이 분기되는 것을 볼 수 있었다.
(스텝은 뭐 카메라움직임에 필요한 단계쯤으로 생각된다. api를 살펴보기 귀찮으므로 그냥 그정도로 이해하고 넘어감)
@Override
public void step(float dt) {
Log.w("debug_log",boundarySet+" and "+boundaryFullyCovered); //요기에 살포시 로그를 찍어본다.
if(boundarySet) {
// whole map fits inside a single screen, no need to modify the position - unless map boundaries are increased 뭐 바운더리(테두리)가 전체를 덮으면 그냥 나감
if(boundaryFullyCovered)
return;
CGPoint tempPos = CGPoint.ccpSub( halfScreenSize, followedNode_.getPosition());
target.setPosition(CGPoint.ccp(CLAMP(tempPos.x,leftBoundary,rightBoundary),
CLAMP(tempPos.y,bottomBoundary,topBoundary)));
}
else {
target.setPosition(CGPoint.ccpSub(halfScreenSize, followedNode_.getPosition()));
}
}
결국 바운더리 설정하는데서 꼬이는데
점심시간도 다 됐고 더 이상 파기도 귀찮으니 이정도로 하고 넘어감..
필요할때 더 공부하기로 하고, 혹시나 이글을 보고 이 부분을 해결한 사람이 있으면 코멘트로 알려주시기 바랍니다.
본 블로그는 페이스북 댓글을 지원합니다.