代码之家  ›  专栏  ›  技术社区  ›  benzado

在二维场景中创建“放大镜”的最佳方法是什么?

  •  2
  • benzado  · 技术社区  · 17 年前

    我正在做一个游戏,我需要让玩家通过镜头(如放大镜)看到一架飞机(如墙壁)。游戏是在iPhone上运行的,所以我的选择是核心动画或OpenGLES。

    我的第一个想法(我还没有尝试过)是使用核心动画。

    1. 使用日历创建墙及其上的对象。
    2. 使用CALayer renderInContext: 方法创建墙的背景层图像。
    3. 将图像裁剪成镜头形状,放大,然后在背景上绘制。
    4. 在上面画出镜头框架和“闪亮的玻璃”层。

    笔记:

    • 我比OpenGL更熟悉核心动画,所以也许有更好的方法来使用OpenGL。(请告诉我!)
    • 如果我使用未连接到视图的日历,是否必须自己管理所有动画?还是有一种直接的手动运行方式?
    • 三维透视并不重要,我只是放大一个平面墙。
    • 我担心上面所有的操作对于流畅的动画来说都太慢了。

    在我投入大量的代码编写之前,我的问题是 你在上面的计划中看到了什么陷阱吗,或者你能推荐一种更简单的方法吗?

    2 回复  |  直到 17 年前
        1
  •  2
  •   Andrew Grant    17 年前

    我就是这么做的,听起来是个好计划。

    无论你选择OGL还是CA,基本原则都是一样的,所以我会坚持你更喜欢的。

    1. 确定要放大的区域
    2. 将此区域渲染到单独的表面
    3. 在表面上渲染任何边界/覆盖
    4. 将表面放大到主场景上,适当地剪裁。

    在性能方面,您必须尝试并查看(只需确保在实际硬件上进行测试,因为模拟器比硬件快得多)。如果要慢一点,你可以少看2/3的步骤,例如每2-3帧。这会造成一定的放大延迟,但这可能是完全可以接受的。

    我怀疑OGL/CA之间的性能大致相当。CA是构建在OGL库的本体上的,但是您的成本将是实际的渲染,而不是在层中花费的时间。

        2
  •  3
  •   lajos    17 年前

    我使用uiview在iPhone上实现了放大镜。CA太慢了。

    您可以使用它的drawRect方法将CGImage绘制到uiView中。这是我抽屉里的步骤:

    1. 获取当前上下文
    2. 创建剪切视图(圆)的路径
    3. 缩放电流变换矩阵(CTM)
    4. 移动当前转换矩阵
    5. 绘制CGIMAGE

    您可以预先渲染CGIMAGE,然后将其保存在图形内存中。 如果你想要动态的东西,从零开始画,而不是画一个CGIMAGE。

    很快,看起来不错。