0

目前,我有一个游戏,其中一个对象决定了一个点。然后它计算到该点的路径并构造一个长CCMoveTo动画以到达该点。使用这种方法,动画看起来非常流畅和连续。

我现在正试图利用定期调用的方法将这一方法分解CCMoveTo为多次。我想这样做是因为在对象通过的路径的每个节点上,可能会分散注意力,我希望我的对象能够对此采取行动。所以这就是我正在做的事情:CCMoveToupdate

- (void) update: (ccTime) dt
{
    if(![self isWalking]){
        CGPoint nextNode = [_path objectAtIndex:(_currentPathIndex%[_path count])];
        _currentPathIndex++;
        NSMutableArray *actions = [[NSMutableArray alloc] init];
        [actions addObject:[CCCallBlockO actionWithBlock:^void(id obj) {
            [(Monkey *) obj setIsWalking:NO];
        }                                         object:self]];
        [self moveTo: nextNode withCallbacks: actions];
    }
}

注意:当对象完全到达目标节点时,我设置为回调isWalkingNO这将让它计算下一个节点并构建该动画。没有这个,对象将尝试runAction在正在进行的CCMoveTo动作中进行。这种方法的问题在于,运动似乎不再平滑和连续。CCMoveTo每个动画结束时似乎都有延迟

有人知道如何解决这个问题吗?

4

1 回答 1

1

这是 cocos2d 的 CCAction 系统和 CCScheduler 的副作用。

总会有 1 帧延迟,因为当一个动作停止时,它不会在当前帧中做任何工作:它在前一帧中进行了最后一次位置更新,而在当前帧中它不再作为运行动作。

如果您现在在计划的方法中运行另一个移动操作,则该操作将在下一帧之前开始更新,因为它会自行安排接收更新。而 cocos2d 的 CCScheduler 执行更新时计划的更新将不会运行到下一帧,因为您无法在枚举期间修改数组。

我的建议是始终避免将 CCMove* 动作用于游戏目的,而是手动更新游戏对象的位置。这很容易做到,如果您需要代码示例,请查看 CCMoveTo 类的内部。

一种解决方法是延长 CCMoveTo 的距离并在它完成前不久替换该动作。虽然这将是一个 hack,并且实际上可能比手动位置更新更难正确实施。

PS:这是我在KoboldTouch的动作模型中解决的问题。它实现了自己的动作系统,具有更轻量级和可重用的动作。

于 2013-01-22T09:22:21.257 回答