1

基本的に、私は理論上、特定のプロパティを持つランダムなバルーンを画面に生成する必要がある spawn エンティティ関数を持っています。私はそのようにメソッドを設計しました:

-(void)spawnBalloon
{
    int a = arc4random_uniform(self.frame.size.width);
    int b = self.frame.size.height - 50;
    CGPoint loc = CGPointMake(a, b);
    [self spawnBalloonAtPoint:loc];
}

そして、この方法は機能します。init 関数で呼び出すと、機能します。touchesMoved() 関数で呼び出すと、機能します。ただし、 init メソッドで呼び出そうとすると、

[self runAction:[SKAction repeatActionForever:[SKAction performSelector:@selector(spawnBalloon) onTarget:self]]];

失敗します。どうしてこれなの?「self」から performSelector 関数を使用してから、NSTimer を使用して永久に繰り返す必要がありますか?

また、コードに NSLog をスローして、繰り返しアクションのときに実行されているかどうかを確認してみました。唯一の問題は、バルーンが画面に追加されていないことです。私の感覚では、repeatActionForever を介して spawnBalloon 関数を呼び出すと、self が別のクラスを参照していると思いますか? これが混乱している場合は申し訳ありませんが、私はObjective CとSpriteKitにまだ慣れていないため、実際に多くを読む代わりに、必要に応じて学習することにしました(ただし、Java / Cの膨大な知識があります)

編集:repeatForever アクションがない場合、コードが実行されて機能することがわかりました。ただし、そこにある場合は機能しません。

4

2 に答える 2

1

望ましい結果が得られる DFrog の回答への追加として、repeatActionForever:メソッドを使用したときにコードが機能しない理由を理解すると役立つと思います。

repeatActionForever:メソッドが機能するには、瞬間的ではないアクションが必要です。これはドキュメントからのものです:

繰り返されるアクションには、非瞬間的な継続時間が必要です。

瞬時のアクション

瞬間的なアクションは、アニメーションの 1 フレームで開始および完了します。たとえば、ノードをその親から削除するアクションは、ノードを部分的に削除することはできないため、瞬間的なアクションです。代わりに、アクションが実行されると、ノードはすぐに削除されます。

瞬間的ではないアクション

非瞬間的なアクションには、その効果をアニメートする期間があります。実行されると、アクションが完了するまでアニメーションの各フレームでアクションが処理されます。

既にお気づきのように、 performSelector:onTargetはオブジェクトのメソッドを呼び出すアクションを作成しますが、そのアクションは瞬時に実行されます。ドキュメントからの引用:

...アクションが実行されると、ターゲット オブジェクトのメソッドが呼び出されます。このアクションは瞬時に発生します...

そして、上で述べたように、repeatActionForever:メソッドは非瞬間的な持続時間のアクションを必要とするため、期待どおりに動作しません。

于 2015-06-09T13:08:32.977 に答える
0

これを試して:

[self runAction:[SKAction repeatActionForever:[SKAction sequence:@[
                                                                   [SKAction waitForDuration:0.1],
                                                                   [SKAction performSelector:@selector(spawnBalloon) onTarget:self]
                                                                   ]]]];
于 2015-06-09T04:33:09.943 に答える