【问题标题】:Cocos2D: Passing a CGPoint through CCCallFuncNDCocos2D:通过 CCCallFuncND 传递一个 CGPoint
【发布时间】:2011-09-27 17:29:21
【问题描述】:

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

}

【问题讨论】:

    标签: methods parameters cocos2d-iphone cgpoint


    【解决方案1】:

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

    【讨论】:

    • 太棒了!我不知道那是这样做的方法。谢谢!
    【解决方案2】:

    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.

    【讨论】:

      【解决方案3】:

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

      CGPoint *spriteCoord = data;
      
      CGFloat ptX = spriteCoord->x;
      CGFloat ptY = spriteCoord->y;
      

      我试过了……

      CGPoint* spriteCoord = (CGPoint)data;
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-14
          • 2020-04-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多