0

ユーザーが画面上で指をドラッグしたときに、いくつかのパーティクルをスポーンしたいと考えています。すべてのドラッグ コードを配置しましたが、パーティクルが描画されていないことが問題です。

少しグーグルで、UIViewのサブクラスを作成した次のクラスを思いつきました:

#import "PrettyTouch.h"
#import <QuartzCore/QuartzCore.h>

@implementation PrettyTouch
{
    CAEmitterLayer* touchEmitter;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        touchEmitter = (CAEmitterLayer*) self.layer;
        touchEmitter.emitterPosition= CGPointMake(0, 0);
        touchEmitter.emitterSize = CGSizeMake(5,5);
        CAEmitterCell* touch = [CAEmitterCell emitterCell];
        touch.birthRate = 0;
        touch.lifetime = 0.6;
        touch.color = [[UIColor colorWithRed:0.2 green:0.3 blue:1.0 alpha:0.06] CGColor];
        touch.contents = (id)[[UIImage imageNamed:@"part.png"]CGImage];
        touch.velocity = 0;
        touch.velocityRange = 50;
        touch.emissionRange = 2*M_PI;
        touch.scale = 1.0;
        touch.scaleSpeed = -0.1;
        touchEmitter.renderMode = kCAEmitterLayerAdditive;
        touchEmitter.emitterCells = [NSArray arrayWithObject:touch];

    }
    return self;
}
+ (Class) layerClass 
{
    //tell UIView to use the CAEmitterLayer root class
    return [CAEmitterLayer class];
}

- (void) setEmitterPosition:(CGPoint)pos
{
    touchEmitter.emitterPosition = pos;
}
- (void) toggleOn:(bool)on
{
    touchEmitter.birthRate = on? 300 : 0;
}


@end

そして、私のゲーム ビュー コントローラー クラスの viewDidLoad で、次のようにしました。

@implementation PlayViewController
{
   //...
   PrettyTouch* touch;

}

- (void)viewDidLoad
{
    [super viewDidLoad];
    //...
    touch = [[PrettyTouch alloc]initWithFrame:self.view.frame];
    touch.hidden = NO;
    [self.view addSubview:touch];
    //...

次に、UIPanGestureRecogniser 関数で[touch toggleOn:YES];、ジェスチャの開始[touch setEmitterPosition:[gest locationInView:self.view]];時と関数が呼び出されるたびに呼び出します。(gest は UIPanGestureRecogniser* です)。

何が不足している可能性がありますか、またはパーティクルの描画を取得するために必要なことは何ですか?

ありがとうございました

4

1 に答える 1

3

ここでは2つのbirthRateプロパティが使用されています。

  • それぞれCAEmitterCellbirthRateプロパティがあります。
    これは、そのセルの配線された出生率です。

  • にはプロパティCAEmitterLayerがありbirthRateます。
    これは、実際の出生率を導き出すために各セルのプロパティに適用される乗数です。birthRate

コードは2つを混同しています。初期化でセルの出生率をゼロに設定しますが、トグルメソッドでレイヤーの出生率乗数を変更します。

2つの解決策...

1-toggleOn:レイヤーの乗数ではなく、セルの出生率を設定します。

- (void) toggleOn:(bool)on
  {
     CAEmitterCell* emitterCell = [self.touchEmitter.emitterCells objectAtIndex:0];
    [emitterCell setBirthRate:on? 300 : 0];
  }

2-初期化で、セルの出生率をゼロ以外に設定します。

    touch.birthRate = 1.0;

で使用している乗数はtoggleOn、この数値に適用されます。

于 2013-03-14T17:27:20.790 に答える