0

使用操作调用方法的适当方式是什么,传递 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

4 回答 4

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);

}
于 2011-09-30T09:57:20.373 回答
5

GamingHorror 关于将 CGPoint 包装在 NSValue 中的建议是正确的。

但是有一种比使用valueWithByte:objCType:method:更简单的方法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

于 2011-10-07T03:11:01.283 回答
0

您不能CGPoint使用该语法将类型转换为 a 。尝试....

CGPoint *spriteCoord = data;

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

我试过...

CGPoint* spriteCoord = (CGPoint)data;

这没有用,我猜是这样。试试我的第一个建议,看看它是否适合你。它确实为我编译,但我不确定它将如何执行,这可能取决于您的具体情况。

于 2011-09-28T05:02:11.730 回答
0

CGPoint 是一个结构,而不是一个对象,所以你不能将它直接传递给任何CCCallFunc's. 有几种方法可以解决这个问题,但最快的方法是使用 NSStringFromCGPoint 将 CGPoint 转换为NSString ,传递字符串,然后使用CGPointFromString将其转换回 CGPoint 。

于 2011-09-28T09:14:33.640 回答