使用操作调用方法的适当方法是什么,以及传递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);
}
答案 0 :(得分:5)
将CGPoint(或任何非id类型,如C结构)发送到以id作为参数(使用performSelector的任何方法)的方法的正确方法是将其包装在NSValue对象中:
NSValue* value = [NSValue valueWithBytes:&spriteCoord objCType:@encode(CGPoint)];
在被调用的方法中,您可以通过将数据指针强制转换为NSValue *并调用getValue来从NSValue对象中检索点:
-(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);
}
答案 1 :(得分:5)
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 can also deal with CGSize and CGRect using similar way
答案 2 :(得分:0)
您无法使用该语法对CGPoint
进行类型转换。尝试....
CGPoint *spriteCoord = data;
CGFloat ptX = spriteCoord->x;
CGFloat ptY = spriteCoord->y;
我试过......
CGPoint* spriteCoord = (CGPoint)data;
这不起作用,我猜想是这样的。试试我的第一个建议,看看它是否适合你。它确实为我编译,但我不确定它将如何执行,这可能取决于您的具体情况。
答案 3 :(得分:0)
CGPoint是一个结构,而不是一个对象,所以你不能将它直接传递给CCCallFunc
的任何一个。有几种方法可以解决这个问题,但最快的方法是使用NSStringFromCGPoint将CGPoint转换为NSString,传递字符串,然后使用CGPointFromString将其转换回CGPoint。