Cocos2D:通过CCCallFuncND传递CGPoint

Che*_*kie 0 parameters methods 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]];
Run Code Online (Sandbox Code Playgroud)

方法本身:

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

}
Run Code Online (Sandbox Code Playgroud)

Lea*_*s2D 5

将CGPoint(或任何非id类型,如C结构)发送到以id作为参数(使用performSelector的任何方法)的方法的正确方法是将其包装在NSValue对象中:

NSValue* value = [NSValue valueWithBytes:&spriteCoord objCType:@encode(CGPoint)];
Run Code Online (Sandbox Code Playgroud)

在被调用的方法中,您可以通过将数据指针强制转换为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);

}
Run Code Online (Sandbox Code Playgroud)


Luk*_*man 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);

}
Run Code Online (Sandbox Code Playgroud)

NSValue也可以使用类似的方式处理CGSize和CGRect.