시퀀스에 대한 런타임 동적 길이 액션 목록
-
06-07-2019 - |
문제
Cocos2d는 시퀀스 클래스의 정적 메소드 '동작'을 다음과 같이 정의합니다.
+(id) actions: (FiniteTimeAction *) action1, ... { /* omitted */ }
런타임에 수행 할 작업 목록을 어떻게 구축 할 수 있습니까?
변수 길이 인수 목록은 (char *)로 변환 될 수 있고 그런 식으로 통과 할 수 있음을 읽었습니다.
NSMutableArray *actions = [[NSMutableArray alloc] init];
[actions addObject: [DelayTime actionWithDuration:1]];
[actions addObject: [ScaleBy actionWithDuration:2 scale:4];
char *argList = (char *)malloc(sizeof(FiniteTimeAction *) * [actions count]);
[actions getObjects:(id *)argList];
[self runActions: actions];
이것이 '가장 좋은 방법'입니까, 아니면 '올바른'방법입니까? 그들의 더 나은 대안, 더 빠른 대안입니까?
해결책
Vaargs는 중첩을 만들기위한 도우미 일뿐입니다 Sequence
사물. a FiniteTimeAction*
연속적인 전화로 구축되었습니다 [Sequence actionOne:one_ two:two_]
. 세트 나 배열을 통해 반복하여 코드에서 직접 수행 할 수 있습니다. 다음과 같이 진행해야합니다.
FiniteTimeAction *seq = nil;
for (FiniteTimeAction *action in actions) {
if (!seq) {
seq = action;
} else {
seq = [Sequence actionOne:seq two:action];
}
}
[self runActions:seq];
다른 팁
NSInvocation을 사용하는 것을 살펴 봅니다. 타겟팅하는 메소드 서명을 사용하여 기본적으로 하나를 빌드 한 다음 다음과 같은 각 객체의 세터를 사용할 수 있습니다.
NSInvocation *invoker = setup invoker here...
for ( int i = 0; i < actions.count; i++ )
{
NSObject *arg = [actions objectatIndex:i];
[invoker setArgument:&arg atIndex:i+2];
}
[invoker setArgument:nil atIndex:i+2];
i+2 비트는 처음 두 인수가 실제로 자아와 _cmd이기 때문에 인덱스 2에서 모든 것을 설정하고 ... 세트 아레지 메뉴에서 문서를 읽으십시오 : atindex : nsinvocation에서 더 자세하게 설명하십시오.
일단 당신이 그것을 얻으면 대상으로 작업을 호출 할 수 있습니다. 나는 이것을 가변 인수 방법으로 사용한 적이 없으므로 그것이 얼마나 잘 작동하는지 잘 모르겠지만 런타임에 호출을 동적으로 구성하는 것이 유일한 방법입니다.
제공된 옵션을 감안할 때, 내가 후에 무엇을 달성 할 수있는 유일한 방법은 다음과 같은 질문에서 언급 한 접근법을 사용하는 것 같습니다.
NSMutableArray *actions = [[NSMutableArray alloc] init];
[actions addObject: [DelayTime actionWithDuration:1]];
[actions addObject: [ScaleBy actionWithDuration:2 scale:4];
char *argList = (char *)malloc(sizeof(FiniteTimeAction *) * [actions count]);
[actions getObjects:(id *)argList];
[self runActions: actions];
아마도 사전 제작 된 시퀀스 세트일까요?
id move = [MoveBy actionWithDuration:3 position:ccp(350,0)];
id move_back = [move reverse];
id move_ease_in = [EaseIn actionWithAction:[[move copy] autorelease] rate:3.0f];
id move_ease_in_back = [move_ease_in reverse];
id move_ease_out = [EaseOut actionWithAction:[[move copy] autorelease] rate:3.0f];
id move_ease_out_back = [move_ease_out reverse];
id seq1 = [Sequence actions: move, move_back, nil];
id seq2 = [Sequence actions: move_ease_in, move_ease_in_back, nil];
id seq3 = [Sequence actions: move_ease_out, move_ease_out_back, nil];
[grossini runAction: [RepeatForever actionWithAction:seq1]];
[tamara runAction: [RepeatForever actionWithAction:seq2]];
[kathia runAction: [RepeatForever actionWithAction:seq3]];