Проблема в том, что при вызове executeSelector есть только две опции:
- пусть ваш селектор не принимает аргументов и оставляет ":" вне определения @selector (foo).
- пусть ваш селектор принимает один или два аргумента , которые оба должны быть NSObject или подклассом
Я подозреваю, что это последнее, что запутывает вас здесь.
Вот три формы performSelector
:
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
Вы заметите, что все аргументы withObject имеют тип id
, который является объектом Objective C.
Селектор, который вы пытаетесь использовать, получает ccTime
, который является float
и , а не объектом Objective C, поскольку он является параметром, и именно поэтому вещи терпят крах:
-(void)rotate:(ccTime)delta;
Одним из вариантов является создание метода-обертки, который принимает обернутый ccTime
, разворачивает его и вызывает метод rotate:(ccTime)
:
- (void) wrappedRotate: (NSNumber*) inDelta
{
[self rotate: [inDelta floatValue]];
}
затем используйте
selectors[0] = @selector(wrappedRotate:);
, а затем позвоните через:
[self schedule: @selector(moveThings:)]); // cocos2d schedule
...
- (void) moveThings: (ccTime) dt
{
[self performSelector: selectors[0] withObject: [NSNumber numberWithFloat: dt]];
...
}
Одна из причин, по которой вы путаетесь, заключается в том, что Cocos2d использует @selector несколько более сложными способами (см. CCScheduler.m в CCTimer :: initWithTarget: selector: interval: и CCTimer :: update: метод в частности).
отказ от ответственности: код, введенный в SO, поэтому не проверяется компилятором, но суть того, что вам нужно, должна быть здесь.