正直なところ、私はあなたが達成しようとしているのかわからないです。通常は、オブジェクトの速度を混乱させるべきではありません。典型的なSpritekitゲームでは、それを「現実の世界」のように扱い、一般的にオブジェクトに力や衝動を加えなければなりません。
あなたはマリオのようなゲームを作ろうとしていると思います。あなたがしなければならないことは、physicsworldに十分大きな重力を適用し、ジャンプするためにスプライトに衝動を適用することです(touchesBeganデリゲートで)。
ちょうど今私はSpritekitで簡単なマリオジャンプのシナリオを作った。そして、これは私がy成分とy成分の重力をyに設定することで終わりました。 (フレームレートが悪いシミュレータ/デバイス上で良く見えます。)
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)];
私はジャンプするために衝動を使用することをお勧めします。速度を直接変更しない。 – GeneCode
グラウンドタイルで衝突検出を使用し、player.physicsBody.velocity = CGvectorMake(0.0,0.0)を設定することができます。それはURの問題を解決するだろう – dragoneye
ほとんど知られていない秘密は、ちょうどすべてのplatformersについては、物理学ではなく、動きのアルゴリズム計算を使用しています。 「プレイヤーが着陸するとすぐに飛び降りても、バウンスがあり、次のバウンスでプレーヤーが到達する高さが、常に最初のバウンスと一致するとは限りません」 – Confused