6

私は描画アプリを持っており、ユーザーが描画の一部としてパーティクル エフェクトを使用できるようにしたいと考えています。基本的に、アプリのポイントは、カスタム描画を実行し、カメラ ロールに保存するか、World Wide Web で共有することです。

私は最近このクラスに出会いましたCAEmitterLayer。これは、パーティクル エフェクトを追加するためのシンプルで効果的な方法だと思います。

CAEmitterLayer実装を使用して、アプリの画面上にパーティクルを描画することができました。そのため、画面上でのレンダリングは正常に機能します。

を使用して図面の内容をレンダリングしようとすると

CGContextRef context = UIGraphicsBeginImageContextWithSize(self.bounds.size);

// The instance drawingView has a CAEmitterLayer instance in its layer/view hierarchy
[drawingView.layer renderInContext:context];


//Note: I have also tried using the layer.presentationLayer and still nada

....
//Get the image from the current image context here for saving to Camera Roll or sharing


....the particles are never rendered in the image.

起こっていると思うこと

CAEmitterLayer、パーティクルを常に「アニメート」している状態です。そのため、レイヤーをレンダリングしようとすると (レンダリングlayers.presentationLayerと modelLayer も試しました)、アニメーションがコミットされないため、オフスクリーン イメージ レンダリングにパーティクルが含まれません。

CAEmitterLayer質問オフスクリーンのコンテンツをレンダリングした人はいますか? もしそうなら、どのようにしましたか?

別の質問 OpenGL を使用せず、Cocos2D ではないパーティクル エフェクト システム ライブラリを知っている人はいますか?

4

2 に答える 2

4

-[CALayer renderInContext:]いくつかの単純なケースでは役立ちますが、より複雑な状況では期待どおりに機能しません。描画を行う別の方法を見つける必要があります。

のドキュメントに-[CALayer renderInContext:]は次のように書かれています:

このメソッドの Mac OS X v10.5 実装は、Core Animation コンポジション モデル全体をサポートしていません。QCCompositionLayer、CAOpenGLLayer、および QTMovieLayer レイヤーはレンダリングされません。さらに、3D 変換を使用するレイヤーはレンダリングされず、backgroundFilters、フィルター、compositingFilter、またはマスク値を指定するレイヤーもレンダリングされません。Mac OS X の将来のバージョンでは、これらのレイヤーとプロパティのレンダリングのサポートが追加される可能性があります。

(これらの制限は iOS にも適用されます。)

ヘッダーCALayer.hには次のようにも書かれています。

 * WARNING: currently this method does not implement the full
 * CoreAnimation composition model, use with caution. */
于 2012-08-12T23:52:59.500 に答える
0

CAEmitterLayer を現在のアニメーション状態で画像として正しくレンダリングすることができました

Swift

func drawViewHierarchyInRect(_ rect: CGRect,
          afterScreenUpdates afterUpdates: Bool) -> Bool



Objective-C

- (BOOL)drawViewHierarchyInRect:(CGRect)rect
             afterScreenUpdates:(BOOL)afterUpdates

現在のコンテキスト内で

UIGraphicsBeginImageContextWithOptions(size, false, 0)

afterScreenUpdates を true|YES に設定します

頑張ってください:D

于 2016-08-10T19:08:02.617 に答える