如何重用动作

时间:2010-05-15 17:19:16

标签: iphone animation cocos2d-iphone

在我要移动的三个部分中,只有最后一个部分实际移动。我似乎无法“回收”我创建的ease action

这是如何以正确的方式完成的?

- init
{    
    // initial setup

    [self moveParts];
}

- (void)moveParts
{
    id action = [CCMoveBy    actionWithDuration:1 position:ccp(0,160)];
    id ease   = [CCEaseInOut actionWithAction:action];

    [part1 runAction:ease];
    [part2 runAction:ease];
    [part3 runAction:ease];
}

1 个答案:

答案 0 :(得分:1)

似乎分配和复制动作对象是一个问题。 This thread很好地回答了我的问题,这篇文章是摘要:


根据我的经验,你无法真正保留行动并从中获得任何好处。

重用动作确实没有好方法。如果您发现游戏过多,游戏不稳定,那么您应该忘记操作并安排一个完成所有工作的方法。

示例(所有以下划线结尾的变量都是类变量“variablename _”):

无法采取行动:

.... maybe in init
moveAction_ = [[MoveBy actionWithDuration:1.f position:ccp(100.f, 0.f)]retain];

.... Some other function
[sprite1_ runAction:moveAction_];
[sprite2_ runAction:moveAction_];

这个例子不起作用,因为sprite1_,sprite2_都说具有相同的位置。 他们肯定不会一起移动!这是因为动作由actionManager引用,您刚刚更改了该动作的目标。

正确的方式:

.... maybe in init
moveAction_ = [[MoveBy actionWithDuration:1.f position:ccp(100.f, 0.f)]retain];

.... Some other function
[sprite1_ runAction:[[moveAction_ copy] autorelease]];
[sprite2_ runAction:[[moveAction_ copy] autorelease]];

现在该操作将具有正确的行为,但您实际上已经失去了首先执行保留的所有效率。你已经创建了两个新的动作实例。

以上代码完全相同:

[sprite1_ runAction:[MoveBy actionWithDuration:1.f position:ccp(100.f, 0.f)]];
[sprite2_ runAction:[MoveBy actionWithDuration:1.f position:ccp(100.f, 0.f)]];

所以最后你没有获得保留行动的好处。那么为什么要保留?

如果你真的担心dealloc会减慢游戏速度,那么另一种方法就是失去行动的便利性并创建自己的预定行动

...somewhere in init
[self schedule:@selector(moveStuff:)];

// do all you actions manually here
- (void) moveStuff:(ccTick) dt
{
   CGPoint delta = ccp(100.f,0.f);
   sprite1.position = ccp( (sprite1.position.x + delta.x * dt ), 
                           (sprite1.position.y + delta.y * dt ) );
}

所以真的由你决定速度还是方便。