0

我正在尝试从 0 到屏幕外的汽车旅行。但我可以看到,当汽车移动时,显示屏上有明显的打嗝。让我向您展示我的工作:

我有一辆@property (nonatomic,strong) CCSprite 汽车;

在 init 方法中,我执行以下操作:

self.car=[CCSprite spriteWithFileName:@"car.png"];
CGSize *windowSize=[[CCDirector sharedDirector] winSize];
CGSize carSize=car.contentSize;
car.position=ccp(0-carSize.width/2,windowSize.height/2);
[selp addChild:car];
[self schedule:@selecor(tick:) interval:0.5];

这是打勾方法:

-(void)tick:(ccTime)time{
 [[self.car runAction:MoveBy actionWithDuration:time position:ccp(100,0)];
}

如您所见,它只是一个简单的测试应用程序。图片“car.png”的大小为 64x128。在 AppDelegate.m 中,帧速率设置为 30 FPS。

4

2 回答 2

1

首先,如果你只是想让你的精灵移出屏幕边框,为什么不只使用一个动作而不每 0.5 秒开始一个新动作呢?您可以创建单个操作。同样使用这种方法,如果出现滞后,您将遇到问题。例如,如果您的应用程序由于任何原因会延迟 2 秒,那么在此之后,您的精灵将在 X 轴上缓慢移动 100 个点,因为无法保证您总是会收到 0.5 作为时间参数。如果延迟 2 秒,您将收到时间 = 2。

如果你真的想用某种更新方法移动你的精灵,最好用 setPosition 改变它的位置,而不是用动作。例如,如果您想将精灵的显示位置与它在物理世界(b2World 等)中的位置同步,它会很有用。或者在某种复杂运动的情况下。例如,在使用公式 sin(t) 或阿基米德螺线进行运动的情况下。

于 2012-06-18T07:52:54.360 回答
1

在您的 tick 方法中,我会在运行新的移动之前停止动作。此外,不要使用“时间”作为动作持续时间,而是使用 0.5f。时间是你实际得到的时间,可能是 0.5 的一些数字(如果我不得不猜测的话,可能是 +/- 1/60 秒)。随着更多对象出现在屏幕上,再加上用户操作,在预定方法上接收到的“时间”将变得更加随机。我个人只用它来计算预定方法处理的两个元事件之间的经过时间。

于 2012-06-18T12:41:52.883 回答