وقت التشغيل الديناميكي قائمة تطبيقات طول لتسلسل

StackOverflow https://stackoverflow.com/questions/1030324

  •  06-07-2019
  •  | 
  •  

سؤال

وCocos2D يحدد طريقة "الإجراءات" ثابتة للطبقة تسلسل على هذا النحو:

+(id) actions: (FiniteTimeAction *) action1, ... { /* omitted */ }

وكيف يمكن لي أن بناء قائمة من الإجراءات التي تؤدي في وقت التشغيل، وربما قراءة من ملف القرص أو كذا؟

وقرأت أن القائمة حجة طول متغير يمكن أن تترجم إلى (تشار *) ومرت بهذه الطريقة ...

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 المتداخلة. تقوم بإرجاع 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 وعلى ... قراءة المستندات على setArgument: 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