Cocos2D:通过CCCallFuncND传递CGPoint

时间:2011-09-27 17:29:22

标签: methods parameters cocos2d-iphone cgpoint

使用操作调用方法的适当方法是什么,以及传递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 个答案:

答案 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。