0

我正在开发这款游戏的 iPhone 版本。http://www.students.uni-mainz.de/rathb000/Fillit/Game.html

我正在使用 NSTimer 将船的位置更改 1 个像素,计时器的时间间隔为 0.002。

但是,我注意到如果我进一步缩短时间间隔,船不会更快地移动。事实上,0.05 和 0.002 之间没有区别。您必须作为 NSTimeInterval 提供的最短时间是否有限制?

目前,这艘船的移动速度太慢,以至于游戏无法令人兴奋。

此外,当我按下任何按钮移动船时,鸟类的移动(也由 NSTimer 实现)变得缓慢。

关于如何解决这个问题的任何想法?

4

6 回答 6

3

NSTimer 不是实时机制;它作为运行循环的一部分触发,不适合创建流畅、流畅的动画。但是,有一个 SDK 是 iPhone OS 的一部分,称为 Core Animation——它提供了一个函数库,用于执行图层和视图的平滑动画。这是一个相当不错的系列视频教程,您可能会发现它们很有用。还有一本名为Core Animation for Mac OS X and iPhone的优秀书籍,您可能会发现它很有用。

还有来自 Apple 的核心动画文档,描述了如何使用 CABasicAnimation 类为任何层或视图的属性设置动画。这是文档中显式图层动画的示例:

CABasicAnimation *theAnimation; 

theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
theAnimation.duration=3.0;
theAnimation.repeatCount=1;
theAnimation.autoreverses=NO;
theAnimation.fromValue=CATransform3DTranslate(0,0,0);
theAnimation.toValue=CATransform3DTranslate(20,20,0);

[theLayer addAnimation:theAnimation forKey:@"animateTransform"];
于 2009-06-18T13:44:07.120 回答
0

来自NSTimer文档:

定时器不是实时机制;它仅在已添加计时器的运行循环模式之一正在运行并且能够检查计时器的触发时间是否已过时触发。由于典型的运行循环管理的各种输入源,计时器的时间间隔的有效分辨率被限制在 50-100 毫秒的数量级。如果在运行循环处于未监视计时器的模式或长时间调用期间发生计时器的触发时间,则计时器不会触发,直到运行循环下一次检查计时器。因此,定时器触发的实际时间可能是计划触发时间之后的一个重要时间段。

也许您可以尝试移动UIView使用UIView动画而不是计时器。

于 2009-06-18T13:38:10.050 回答
0

您可以考虑增加距离大小:每 0.05 秒移动船 3 或 4 像素,而不是每 0.002 秒移动 1 像素。

于 2009-06-18T13:38:55.290 回答
0

在我看来,您应该在游戏中的所有实体中全局使用相同的时间步,而不是专门用于玩家飞船的时间步。如果船在您的时间步长上移动得太慢,请增加它每帧移动的距离。

确实,您应该考虑以像素/秒为单位移动玩家的飞船。当 NSTimer 事件触发时,获取自上次更新以来经过的时间。使用此经过的时间来移动您的游戏实体。例如,如果您的更新时间步长为 0.05 秒,并且您希望以每秒 100 像素的速度移动玩家的飞船,那么您应该在此更新中将其移动 100 * 0.05 = 5 像素。此方法将考虑不同大小的时间步长,并且您的游戏实体将始终以一致的速度移动,即使您的计时器机制不是那么一致。

于 2009-06-18T13:40:18.407 回答
0

NSTimer 不仅不是适合此类动画的正确工具,您的设计也是错误的。

间隔为 0002 的计时器每秒触发 500 次。这是为这款游戏制作动画的一种疯狂方式。

我建议你阅读 2D 游戏设计并找到一种更好的碰撞检测方法——就像匿名建议你应该在船周围有一个碰撞矩形而不是依赖于实际像素。

你也应该看看Cocos-2D for iPhone

于 2009-06-18T15:04:31.200 回答
-1

想通了。

不得不使用核心动画来移动船,并通过 NSTimer 让鸟儿移动。这种方式可以正常工作,但只能达到一定的限制。当船速增加超过一定限度时,鸟类再次减速。

于 2009-08-07T07:15:33.030 回答