2016-11-10 5 views
1

私はプレイヤーキャラクターとグラウンドタイルを持っています。両方の物理機関で、restitutionを0に設定しました。スプライトキットで繰り返しジャンプするとバウンスを止める

ジャンプするには、プレーヤーのvelocity.dyを直接設定します。重力のためにプレイヤーが地面に戻ったとき、ほとんどの場合、それは機能しているように見えます。

繰り返しジャンプすると問題が発生します。プレーヤーが着陸するとすぐにジャンプすると、ある程度のバウンスがあり、次のバウンスでプレーヤーが到達する高さが必ずしも最初のバウンスと一致するとは限りません。

ユーザーが土地にいるときにvelocity.dyを強制的に0にするさまざまな方法を試しましたが、奇妙なジャンプの問題は修正されません。一貫して物理的なジャンプを適切かつスムーズに行うにはどうすればよいですか?

gif of issue

+1

私はジャンプするために衝動を使用することをお勧めします。速度を直接変更しない。 – GeneCode

+1

グラウンドタイルで衝突検出を使用し、player.physicsBody.velocity = CGvectorMake(0.0,0.0)を設定することができます。それはURの問題を解決するだろう – dragoneye

+0

ほとんど知られていない秘密は、ちょうどすべてのplatformersについては、物理学ではなく、動きのアルゴリズム計算を使用しています。 「プレイヤーが着陸するとすぐに飛び降りても、バウンスがあり、次のバウンスでプレーヤーが到達する高さが、常に最初のバウンスと一致するとは限りません」 – Confused

答えて

1

正直なところ、私はあなたが達成しようとしているのかわからないです。通常は、オブジェクトの速度を混乱させるべきではありません。典型的なSpritekitゲームでは、それを「現実の世界」のように扱い、一般的にオブジェクトに力や衝動を加えなければなりません。

あなたはマリオのようなゲームを作ろうとしていると思います。あなたがしなければならないことは、physicsworldに十分大きな重力を適用し、ジャンプするためにスプライトに衝動を適用することです(touchesBeganデリゲートで)。

ちょうど今私はSpritekitで簡単なマリオジャンプのシナリオを作った。そして、これは私がy成分とy成分の重​​力をyに設定することで終わりました。 (フレームレートが悪いシミュレータ/デバイス上で良く見えます。)

enter image description here

PhysicsWorldセットアップ:

[self.physicsWorld setGravity:CGVectorMake(0, -30)]; 
self.physicsWorld.contactDelegate = self; 

マリオとプラットフォームのスプライトセットアップコード:

SKSpriteNode *platform = [SKSpriteNode spriteNodeWithImageNamed:@"platform"]; 
platform.position = CGPointMake(view.frame.size.width/2.0,0); 
platform.name = @"platform"; 
platform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:platform.frame.size]; 
platform.physicsBody.categoryBitMask = platformCategory; 
platform.physicsBody.dynamic = NO; 
platform.physicsBody.usesPreciseCollisionDetection = YES; 
platform.physicsBody.affectedByGravity = NO; 
[self addChild:platform]; 

SKSpriteNode *mario = [SKSpriteNode spriteNodeWithImageNamed:@"mario"]; 
mario.position = CGPointMake(view.frame.size.width/2.0, 400); 
mario.name = @"mario"; 
mario.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:mario.frame.size]; 
mario.physicsBody.categoryBitMask = marioCategory; 
mario.physicsBody.dynamic = YES; 
mario.physicsBody.usesPreciseCollisionDetection = YES; 
mario.physicsBody.contactTestBitMask = platformCategory; 
mario.physicsBody.affectedByGravity = YES; 
[self addChild:mario]; 

touchesBegan:

SKSpriteNode *mario = (SKSpriteNode*)[self childNodeWithName:@"mario"]; 
[mario.physicsBody applyImpulse:CGVectorMake(0, 100)]; 
+0

移動/物理の一部ではない衝突のために使用していた境界ボックスが、質量、線形減衰、および復元を持ち、移動する物理学の本体に固定されているため、すべての問題が発生しました。 @Rocotilosが投稿されたときにこれを行うと、これは絶対に機能します。 –

+1

答えを受け入れてくれてありがとう。喜んで助けることができます。私は、ダブルジャンプを禁止するためにphysicscontentデリゲートを監視する必要があることを追加したいと思います(例えば、画面上を繰り返しタップするなど)。 (二番目の考えでは、いくつかのゲームはジャンプを倍増させる能力を持っています)..とにかくあなたはそれを別々に扱わなければなりません。 – GeneCode

+0

ps。あなたのゲームで幸運。 :D – GeneCode

関連する問題