Cocos2D: прохождение CGPoint через CCCallFuncND - PullRequest
0 голосов
/ 27 сентября 2011

Как правильно вызывать метод с действием и как должен выглядеть сам метод для передачи параметра 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);

}

Ответы [ 4 ]

5 голосов
/ 07 октября 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, используя аналогичный способ .

5 голосов
/ 30 сентября 2011

Правильный способ отправки CGPoint (или любого не-id типа, такого как структуры C) в метод, который принимает id в качестве параметра (любой метод, использующий executeSelector), заключается в его оборачивании в объект 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);

}
0 голосов
/ 28 сентября 2011

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

0 голосов
/ 28 сентября 2011

Вы не можете типизировать CGPoint с этим синтаксисом.Попробуй ....

CGPoint *spriteCoord = data;

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

Я пытался ...

CGPoint* spriteCoord = (CGPoint)data;

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

...