Cocos2D: передача CGPoint через CCCallFuncND

Как правильно вызвать метод с действием и как должен выглядеть сам метод для передачи параметра CGPoint? Я пытался найти примеры в Интернете без особой удачи, поэтому я в значительной степени догадывался.

Я пробовал это для вызова:

    CGPoint spriteCoord = saveStation.sprite.position;

    id a1=[CCMoveTo actionWithDuration:.4 position:ccp(saveStation.sprite.position.x,saveStation.sprite.position.y)];
    id actionSaveStationReaction = [CCCallFuncND actionWithTarget:self selector:@selector(saveStationReaction : data:) data:&spriteCoord];

    [hero.heroSprite runAction:[CCSequence actions:a1, actionSaveStationReaction, nil]];

И сам метод:

-(void) saveStationReaction:(id)sender data:(void *)data {

    CGPoint spriteCoord = (void *)data; //error: Invalid initializer 

    NSLog(@"spriteCoord x = %f", spriteCoord.x);
    NSLog(@"spriteCoord y = %f", spriteCoord.y);

}

person Chewie The Chorkie    schedule 27.09.2011    source источник


Ответы (4)


Правильный способ отправки CGPoint (или любого другого типа, отличного от id, такого как структуры C) в метод, который принимает id в качестве параметра (любой метод, использующий PerformSelector), заключается в заключении его в объект NSValue:

NSValue* value = [NSValue valueWithBytes:&spriteCoord objCType:@encode(CGPoint)];

В вызываемом методе вы можете получить точку из объекта NSValue, приведя указатель данных к NSValue* и вызвав getValue:

-(void) saveStationReaction:(id)sender data:(void *)data {

    CGPoint spriteCoord;
    [((NSValue*)data) getValue:&spriteCoord];

    NSLog(@"spriteCoord x = %f", spriteCoord.x);
    NSLog(@"spriteCoord y = %f", spriteCoord.y);

}
person LearnCocos2D    schedule 30.09.2011
comment
Изысканный! Я не знал, что это способ сделать это. Спасибо! - person Rob Segal; 06.10.2011

Предложение GamingHorror по заключению CGPoint в NSValue является точным.

Но есть более простой способ, чем использование метода valueWithByte:objCType:: valueWithCGPoint:, если вы пишете код для iOS, а не для MacOS.

NSValue *spriteCoordValue = [NSValue valueWithCGPoint:spriteCoord];
[CCCallFuncND actionWithTarget:self selector:@selector(saveStationReaction:data:) data:spriteCoordValue];

// and ..
-(void) saveStationReaction:(id)sender data:(void *)data {

    CGPoint spriteCoord = [(NSValue *)data CGPointValue]; 

    NSLog(@"spriteCoord x = %f", spriteCoord.x);
    NSLog(@"spriteCoord y = %f", spriteCoord.y);

}

NSValue также может работать с CGSize и CGRect аналогичным образом .

person Lukman    schedule 07.10.2011

Вы не можете привести тип к CGPoint с таким синтаксисом. Пытаться....

CGPoint *spriteCoord = data;

CGFloat ptX = spriteCoord->x;
CGFloat ptY = spriteCoord->y;

Я пытался...

CGPoint* spriteCoord = (CGPoint)data;

что не сработало, и я предполагаю, что это ожидаемо. Попробуйте мое первое предложение и посмотрите, сработает ли оно для вас. Он скомпилировался для меня, но я не уверен, как он будет выполняться, и это может зависеть от вашей конкретной ситуации.

person Rob Segal    schedule 28.09.2011

CGPoint — это структура, а не объект, поэтому вы не можете передать ее напрямую ни одному из CCCallFunc. Есть несколько способов справиться с этим, но самый быстрый преобразует CGPoint в NSString, используя NSStringFromCGPoint, передавая строку, а затем преобразовывая ее обратно в CGPoint, используя CGPointFromString.

person Community    schedule 28.09.2011