cocos2d中CCCallFuncND传参数的注意事项

本文介绍了在Cocos2d-x中使用CCFuncBlock和CCFuncND两种方式来实现动作回调的方法。通过具体代码示例展示了如何利用block进行简洁高效的编程,并对比了使用(void*)参数传递CGPoint等非指针类型数据的不同技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A.用CCFuncBlock可以不用传参数,代码简洁高效,函数内临时变量如果不retain,不存在跳出函数使用域后被回收情况(推荐)

//用CCCallBlock的block方式
CGPoint convertedLocation = [self convertTouchToNodeSpace:touch];
CCCallBlock *block = [CCCallBlock actionWithBlock:^{
            //回调方法在一个函数循环内3个好处:
          1.不用传递(void *)参数,所以convertedLocation不需要封装,
          2.传递指针类型变量(非alloc或copy)也不需要retain,
          3.alloc或copy方式产生的参数,函数内释放,省去函数外手动释放的麻烦。
            [self flightBezier:convertedLocation];
            }];
[flight runAction:[CCSequence actions:[CCMoveTo actionWithDuration:1 position:ccp(convertedLocation.x,convertedLocation.y)], block, nil]];

B.使用CCFuncND传递参数(void *)类型,若想传递CGPoint等非指针类型参数,,有两种方法:

   1.传递参数地址,注意参数必须为静态变量,否则参数地址一出循环即被系统回收。

-(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
  UITouch *touch = [touches anyObject];
     static _startPos;
     CGPoint convertedLocation = [self convertTouchToNodeSpace:touch];
  _startPos = converedLocation;
    //传递&_startPos
     id call = [CCCallFuncND actionWithTarget:self selector:@selector(call:data:) data:(void *)&_startPos];
     [flight runAction:[CCSequence actions:[CCMoveTo actionWithDuration:1 position:ccp(convertedLocation.x,convertedLocation.y)], call, nil]];
     return;
}

回调:

- (void)call:(id)sender data:(void *)point
{
  //sender即为flight指针
//传递&_startPos; CGPoint p = *(CGPoint *) point; [self flightBezier:p]; }

2.如果想传递CGPoint等非指针类型变量, 可以封装成NSValue再传递

-(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
  UITouch *touch = [touches anyObject];
     static _startPos;
     CGPoint convertedLocation = [self convertTouchToNodeSpace:touch];
  _startPos =converedLocation;

    //传递nsvalue封装的cgpoint
    NSValue *va = [[NSValuevalueWithCGPoint:convertedLocation]retain];//这里不能加autorease
    id call1 = [CCCallFuncND actionWithTarget:self selector:@selector(call:data:) data:(void *)va];
    [flight runAction:[CCSequence actions:[CCMoveTo actionWithDuration:1 position:ccp(convertedLocation.x,convertedLocation.y)], call1, nil]];
return;
}

回调:

- (void)call:(id)sender data:(void *)point
{
 //传递nsvalue
    CGPoint p = [((NSValue *)point) CGPointValue]; 
  //父变量,子释放,比较忌讳,但是没找到好的解决办法先凑合用 [(NSValue
*)point release]; point = nil; [self flightBezier:p]; }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值