문제

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]];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top