2

私は、プレイヤーがレンズ (虫眼鏡など) を通して平面 (壁など) を見られるようにする必要があるゲームに取り組んでいます。ゲームは iPhone で実行する予定なので、Core Animation または OpenGL ES を選択します。

私の最初のアイデア (まだ試していません) は、Core Animation を使用してこれを行うことです。

  1. CALayers を使用して壁とその上にオブジェクトを作成します。
  2. CALayer のrenderInContext:方法を使用して、背景レイヤーとして壁の画像を作成します。
  3. 画像をレンズの形にトリミングして拡大し、背景の上に描画します。
  4. その上にレンズ枠と「光るガラス」レイヤーを描きます。

ノート:

  • 私は OpenGL よりもコア アニメーションに精通しているので、OpenGL でこれを行うにはもっと良い方法があるかもしれません。(教えてください!)
  • ビューにアタッチされていない CALayer を使用している場合、すべてのアニメーションを自分で管理する必要がありますか? または、それらを手動で実行する簡単な方法はありますか?
  • 3D 視点は重要ではありません。平らな壁を拡大しているだけです。
  • 上記のすべてを行うと、スムーズなアニメーションには遅すぎるのではないかと心配しています。

これを書くために多くのコードをコミットする前に、私の質問は、上記の計画に落とし穴があるかどうか、またはこれを行うためのより簡単な方法をお勧めできますか?

4

2 に答える 2

3

UIView を使用して、iPhone に拡大鏡を実装しました。CAは遅すぎた。

drawRect メソッドを使用して、CGImage を UIView に描画できます。私の drawRect の手順は次のとおりです。

  1. 現在のコンテキストを取得する
  2. ビューをクリッピングするためのパスを作成します (円)
  3. 現在の変換行列 (CTM) をスケーリングします
  4. 現在の変換行列を移動します
  5. CG画像を描く

CGImage を事前にレンダリングすると、グラフィックス メモリに保存されます。動的なものが必要な場合は、CGImage を描画するのではなく、最初から描画します。

非常に速く、見栄えがします。

于 2008-10-03T00:45:06.740 に答える
2

それは私がそれを行う方法です、それは良い計画のように聞こえます。

OGL を選択するか CA を選択するかにかかわらず、基本原則は同じです。

  1. 拡大したい領域を特定します
  2. この領域を別のサーフェスにレンダリングします
  3. 境界線/オーバーレイを表面にレンダリングします
  4. サーフェスをメイン シーンに拡大してレンダリングし、適切にクリッピングします。

パフォーマンスに関しては、試して確認する必要があります (シミュレーターはハードウェアよりもはるかに高速であるため、実際のハードウェアでテストするようにしてください)。速度が遅い場合は、2 ~ 3 フレームごとなど、2/3 少ない頻度でステップを実行することを検討できます。これにより、倍率に多少の遅れが生じますが、完全に許容できる場合があります。

OGL / CA 間のパフォーマンスはほぼ同等になると思われます。CA は OGL ライブラリの上に構築されていますが、コストはレイヤーで費やされた時間ではなく、実際のレンダリングを行うことになります。

于 2008-10-02T23:29:34.050 に答える