基于UIView的动画

时间:2009-02-09 13:16:36

标签: cocoa-touch

我正在尝试为2D游戏制作一些UIImageViews的动画。使用[UiView开始/提交动画]是不可能的,因为我需要始终确定所有图像视图的位置。相反,我正在改变我的UIImageViews中的frame.origin.x / y来手动控制我的动画。我的问题是,对于大量的UIImageViews,帧率会显着下降,或者如果它们的大小太大(顺便说一句,UIImageViews包含具有透明色的PNG)。你有任何优化建议吗?

由于

3 个答案:

答案 0 :(得分:6)

UIImageView适用于动画显示(UIViews是围绕CALayers的轻量级包装器,它们只是存储在图形卡上的纹理),但你需要使用开始/提交动画块来获得平滑的动画。使用它,您可以通过访问UIView的后备层并获取其表示层来检索视图的当前位置。 Dustin Bachrach有post描述了如何做到这一点。基本上,表示层是核心动画最接近实际图层在任何给定时间的位置,因此它的帧是当时UIView的帧。

我不确定触摸事件是否会在视图移动到屏幕时找到它们的路径,因此如果您需要让UIImageView响应触摸,您可能需要将其替换为CALayer,请将其插入主UIView层的子层,并在该主层的presentationLayer上调用hitTest方法。如果单击它,则应该返回移动图层的presentationLayer,否则返回背景图层。

老实说,除非出于性能原因,否则我不会选择OpenGL,因为代码比Core Animation为您提供UIViews和CALayers要困难得多。我已经能够使用UIViews和CALayers以60 FPS(100 FPS 30)动画50个移动半透明层。

答案 1 :(得分:1)

对于2D游戏,我会选择Cocos2D-iphone

它与Flash非常相似,并且具有开源的优势,并且与Chipmunk Physics紧密集成。此外,riq正在进行卓越而伟大的发展。

你可以用Cocos做更多的事情,而不仅仅是游戏。绝对值得一试。

答案 2 :(得分:0)

好的,使用开始/提交动画解决了我的帧率问题,我能够确定我的UIView的实时坐标。最后一个问题仍然存在:我可以以编程方式停止这样的动画吗?