CCMoveTo CCCallFuncN CCSequence 사용 이해

6869 단어
'아이폰&아이패드 코코스2D 게임 개발 실전'이라는 책에서 4장을 보다가 낯선 지식을 만나 인터넷에서 관련 지식을 찾은 뒤 이를 기록한다.
시퀀스로 거미의 이동 방법 코드 제어
-(void) runSpiderMoveSequence:(CCSprite*)spider {
//                 
numSpidersMoved++;//   int   
if (numSpidersMoved % 8 == 0 && spiderMoveDuration > 2.0f) {
spiderMoveDuration -= 0.1f; }
//              
CGPoint belowScreenPosition = CGPointMake(spider.position.x,
-[spider texture].contentSize.height);
CCMoveTo* move = [CCMoveTo actionWithDuration:spiderMoveDuration position:belowScreenPosition];
CCCallFuncN* call = [CCCallFuncN actionWithTarget:self selector:@selector(spiderBelowScreen:)];
CCSequence* sequence = [CCSequence actions:move, call, nil];
[spider runAction:sequence]; 
}

RunSpider MoveSequence 방법은 내려진 거미의 수를 추적하는 역할을 합니다.여덟 번째 거미가 도착할 때마다 스파이더 MoveDuration의 값이 감소하여 모든 거미의 이동 속도를 높인다.이 기호는'나머지 연산자'(Modulus Operator)라고 하는데 나눗셈을 적용한 후에 얻은 나머지를 얻는 데 쓰인다.예를 들어numSpidersMoved가 8로 나누어질 수 있다면'여수 운산자'의 계산 결과는 0이어야 한다.
여기에 사용된 동작 순서는 CCMoveTo 동작 하나와 CCCallFuncN 동작 하나만 있습니다.너는 거미의 행동을 개선할 수 있다. 예를 들어 거미를 좀 아래로 옮기고 몇 초를 기다린 후에 끝까지 이동할 수 있다. 마치 정말 사악한 거미가 보통 하는 것처럼.나는 구체적인 방법을 너에게 발휘하도록 남겨 둘 것이다.내가 CCCallFuncN을 선택한 목적은 스파이더 Below Screen 방법으로 거미정령을 그의 sender 변수로 전달하는 것이다.이렇게 되면 어떤 거미가 화면 밑에 도착했을 때 나는 그 거미를 직접 인용할 수 있어 더 이상 여기저기 찾아다닐 필요가 없다
1.CCMoveTo  
점으로 이동함을 나타내고 이와 유사한 CCMoveBy가 하나 더 있으면 현재 위치의 어느 위치에 비해 벡터와 같은 이동을 나타낸다.
2.CCCallFuncN
CCCallFuncN은 하나의 매개 변수를 가지고 있는데 이 매개 변수 자체는 Action이고 그의 매개 변수는 바로 Button이다.그것과 유사한 것은 또 있다
CCCallFunc는 매개변수 없이 콜백 함수 메소드를 실행합니다.
CCCallFuncND는 두 개의 매개 변수를 가지고 있는데 하나는 Action 동작이고 다른 하나는 사용자 정의 매개 변수이다
CCCallFunco도 CCCallFuncN 매개 변수와 마찬가지로 두 개의 매개 변수입니다.
다음은 CCActionInstant의 클래스입니다.m 파일의 정의는 그들의 - (void)execute 함수를 통해 그들의 매개 변수 문제를 알아낸다
//
// CallFunc
//
#pragma mark CCCallFunc

@implementation CCCallFunc

@synthesize targetCallback = targetCallback_;

+(id) actionWithTarget: (id) t selector:(SEL) s
{
	return [[[self alloc] initWithTarget: t selector: s] autorelease];
}

-(id) initWithTarget: (id) t selector:(SEL) s
{
	if( (self=[super init]) ) {
		self.targetCallback = t;
		selector_ = s;
	}
	return self;
}

-(NSString*) description
{
	return [NSString stringWithFormat:@"<%@ = %p | Tag = %ld | selector = %@>",
			[self class],
			self,
			(long)tag_,
			NSStringFromSelector(selector_)
			];
}

-(void) dealloc
{
	[targetCallback_ release];
	[super dealloc];
}

-(id) copyWithZone: (NSZone*) zone
{
	CCActionInstant *copy = [[[self class] allocWithZone: zone] initWithTarget:targetCallback_ selector:selector_];
	return copy;
}

-(void) update:(ccTime)time
{
	[self execute];
}

-(void) execute
{
	[targetCallback_ performSelector:selector_];
}
@end


//
// CallFuncN
//
#pragma mark CCCallFuncN

@implementation CCCallFuncN

-(void) execute
{
	[targetCallback_ performSelector:selector_ withObject:target_];
}
@end


//
// CallFuncND
//
#pragma mark CCCallFuncND

@implementation CCCallFuncND

@synthesize callbackMethod = callbackMethod_;

+(id) actionWithTarget:(id)t selector:(SEL)s data:(void*)d
{
	return [[[self alloc] initWithTarget:t selector:s data:d] autorelease];
}

-(id) initWithTarget:(id)t selector:(SEL)s data:(void*)d
{
	if( (self=[super initWithTarget:t selector:s]) ) {
		data_ = d;

#if COCOS2D_DEBUG
		NSMethodSignature * sig = [t methodSignatureForSelector:s]; // added
		NSAssert(sig !=0 , @"Signature not found for selector - does it have the following form? -(void)name:(id)sender data:(void*)data");
#endif
		callbackMethod_ = (CC_CALLBACK_ND) [t methodForSelector:s];
	}
	return self;
}

-(id) copyWithZone: (NSZone*) zone
{
	CCActionInstant *copy = [[[self class] allocWithZone: zone] initWithTarget:targetCallback_ selector:selector_ data:data_];
	return copy;
}

-(void) dealloc
{
	// nothing to dealloc really. Everything is dealloc on super (CCCallFuncN)
	[super dealloc];
}

-(void) execute
{
	callbackMethod_(targetCallback_,selector_,target_, data_);
}
@end


@implementation CCCallFuncO
@synthesize  object = object_;

+(id) actionWithTarget: (id) t selector:(SEL) s object:(id)object
{
	return [[[self alloc] initWithTarget:t selector:s object:object] autorelease];
}

-(id) initWithTarget:(id) t selector:(SEL) s object:(id)object
{
	if( (self=[super initWithTarget:t selector:s] ) )
		self.object = object;

	return self;
}

- (void) dealloc
{
	[object_ release];
	[super dealloc];
}

-(id) copyWithZone: (NSZone*) zone
{
	CCActionInstant *copy = [[[self class] allocWithZone: zone] initWithTarget:targetCallback_ selector:selector_ object:object_];
	return copy;
}


-(void) execute
{
	[targetCallback_ performSelector:selector_ withObject:object_];
}

@end

3.CCSequence 
sequence는 다음과 같은 일련의 작업을 순서대로 수행하는 데 사용되는 동작입니다.
id action1 = [CCMoveTo actionWithDuration:2 position:ccp(100,100)];
id action2 = [CCMoveBy actionWithDuration:2  position: ccp(80,80)];
id action3 = [CCMoveBy actionWithDuration:2  position: ccp(0,80)];
[sprite runAction: [CCSequence actions:action1, action2, action3, nil]];

위의 코드는sprite(정령 대상)가 먼저 좌표(100100) 위치로 이동한 다음에 오른쪽 위로 이동(80,80)한 다음에 오른쪽으로 80(80,0)을 이동한다는 뜻이다.이 일련의 동작은 중첩되지 않고 하나하나 집행된다. 
주의해야 할 것은 이러한 동작 중에는 CCRepeatForever와 같은 무한한 동작(끊임없이 계속되는 동작)이 있을 수 없으며, 반드시 제한된 시간 안에 완성할 수 있는 것이어야 한다는 것이다. 
또한 블로그에서 다른 몇 가지 유사한 종류의 용법을 보았는데, 모두cocos2d에서 자주 사용하는 동작 원문 연결이다http://leeyin.iteye.com/blog/1306557
CCSpawn 
위의 CCSequence와 달리 정렬된 동작은 동시에 실행되며 실행된 시간은 하위 동작 중 가장 긴 시간을 기준으로 합니다.코드 예:
id action = [CCSpawn actions:
		[CCJumpBy actionWithDuration:2 position:ccp(300,0) height:50 jumps:4],
		[CCRotateBy actionWithDuration: 2 angle: 720],
		nil];
 
[sprite runAction:action];

위의 코드는sprite가 2초 안에 오른쪽으로 네 번 뛰면 총 점프 거리는 300이고 점프 높이는 50이며 점프 과정에서 720도를 동시에 회전한다는 뜻이다. 
CCRepeat 
이것은 한 동작을 반복하는 데 제한된 횟수이다.물론 CCSequence로 같은 기능을 할 수도 있지만, 그건 좀 멍청해 보일 뿐이다.예:
id a1 = [CCMoveBy actionWithDuration:1 position:ccp(150,0)];
id action1 = [CCRepeat actionWithAction:
		[CCSequence actions: [CCPlace actionWithPosition:ccp(60,60)], a1, nil]
		times:3];
[sprite runAction:action1];

위의 코드는 먼저 sprite를 (60,60) 위치에 놓고 1초 동안 오른쪽으로 150의 거리를 이동한다는 뜻이다.이 두 동작을 세 번 반복한다.
CCRepeatForever 
위의 것은 유한 횟수를 반복하는 것이다. 이것은 무한 반복이다. 예를 들어 바퀴가 끊임없이 회전하게 하려면 이것으로 실현할 수 있다.예:
CCRotateBy* rotate = [CCRotateBy actionWithDuration:1.0f angle:360];
CCRepeatForever* action2 = [CCRepeatForever actionWithAction:rotate];
[sprite runAction:action2];

위에서 말씀드린 것처럼 이 코드가 이걸
sprite
끊임없이
초당
360
도의 회전 속도는 영원히 회전해 간다.

좋은 웹페이지 즐겨찾기