在我要移动的三个部分中,只有最后一个部分实际移动。我似乎无法“回收”我创建的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];
}
答案 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 ) );
}
所以真的由你决定速度还是方便。