在iPhone上,使用屏幕控制移动UIImageView的最佳方法是什么?
-
06-07-2019 - |
题
我正在开发这款游戏的iPhone版本。 http://www.students.uni-mainz.de/rathb000/ Fillit / Game.html
我使用NSTimer将船的位置改变1个像素,计时器的时间间隔为0.002。
然而,我注意到如果我减少时间间隔,船只不会移动得更快。事实上,0.05和0.002之间没有差别。您必须作为NSTimeInterval提供的最短时间是否有限制?
目前这艘船的移动速度太慢,令游戏无法令人兴奋。
此外,当我按任何按钮移动船只时,鸟类的移动(也由NSTimer实现)变得缓慢。
有关如何解决这个问题的任何想法?
解决方案 6
想出来了。
必须使用核心动画来移动船只并使鸟类移动NSTimer。这种方式工作正常,但只有一定的限制。当船的速度增加超过一定限度时,鸟类再次减速。
其他提示
NSTimer不是一个实时机制;它作为运行循环的一部分发射,并不是创建平滑流畅动画的理想选择。但是,有一个SDK是iPhone OS的一部分,名为Core Animation--它提供了一个函数库,用于执行图层和视图的平滑动画。 这是一个相当不错的系列您可能觉得有用的视频教程。还有一本名为适用于Mac OS X和iPhone的核心动画的优秀书籍你可能会觉得很有用。
还有 Apple的核心动画文档,描述了如何使用CABasicAnimation类为任何图层或视图的属性设置动画。以下是docs中显式图层动画的示例:
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"];
来自 NSTimer
docs:
计时器不是实时机制;它仅在已经添加了计时器的运行循环模式之一运行时才触发,并且能够检查计时器的触发时间是否已经过去。由于典型的运行循环管理各种输入源,因此定时器的时间间隔的有效分辨率被限制在50-100毫秒的量级。如果在运行循环处于不监视定时器的模式或长呼出期间发生定时器的触发时间,则定时器在下一次运行循环检查定时器之前不会触发。因此,计时器可能发射的实际时间可能是计划发射时间之后的一段很长时间。
也许您可以尝试使用 UIView
动画而不是计时器来移动 UIView
。
您可以考虑增加距离大小:每隔.05秒移动3或4个像素,而不是每.002秒移动1个像素。
在我看来,你应该在游戏中的所有实体中使用相同的时间步长,而不是专门针对玩家船只的时间步长。如果船的时间步长太慢,请增加每帧移动的距离。
真的,你应该考虑以像素/秒为单位移动玩家的船。触发NSTimer事件时,获取自上次更新以来经过的时间。使用此经过时间移动游戏实体。例如,如果您的更新时间步长为0.05秒,并且您希望将播放器的每秒移动100像素,则应在此更新中将其移动100 * 0.05 = 5像素。此方法将考虑不同大小的时间步长,即使您的计时器机制不一致,您的游戏实体也总是会以一致的速度移动。
不仅NSTimer不适合这种类型的动画,你的设计也是错误的。
inteval为0002的计时器每秒发射500次。这是一种疯狂的动画游戏方式。
我建议你阅读有关2D游戏设计的内容并找出一种更好的方法来进行碰撞检测 - 比如匿名建议你应该在船上有一个碰撞矩形,而不是依赖于实际的像素。
您还应该查看 Cocos适用于iPhone的-2D