1

iPhone 用のトップダウン ゲーム (無重力) があり、Cocos2d と Box2d を使用しています。

このコードで弾丸を動かそうとします:

// 'targetPosition' is a point of touch

b2Vec2 touchInWorld = b2Vec2(targetPosition.x/PTM_RATIO, targetPosition.y/PTM_RATIO); 

b2Vec2 direction = b2Vec2(touchInWorld.x - ballBodyDef.position.x, touchInWorld.y - ballBodyDef.position.y);

b2Vec2 force = b2Vec2(direction.x, direction.y);

force.Normalize();

ballBody->ApplyLinearImpulse(force, ballBodyDef.position);

問題は、スプライトが小さい場合 (10x10 ピクセル)、ボールが速く動くことです。

スプライトが 50x50 の場合、速度は遅くなり、問題ないように見えます。

速度をまったく制御できないので、気が狂ってしまいます。

それだけでなく、 force.Normalize() を入れないと、タッチの方向によって速度が異なります...

Cocos2d とアニメーションだけを使用していたときは、すべてうまく機能していました。Box2d を使用して衝突を実装しようとしましたが、自分で物理演算を行うことを検討しているほどの膨大な労力のようです :(

4

1 に答える 1

1

最初に、よくわかりませんが、なぜここで PTM_Ratios で割っているのですか。それが必要だとは思いません。別の方法で処理している可能性があります。

次に、SetMassFromShapes を設定しているため、10x10 は 50x50 よりも速く移動します。したがって、50x50 スプライトに対して 50/PTM_RATIOSx50/PTM_RATIO ボディを作成すると仮定すると、ボディの質量は 10x10 ボディよりも大きくなります。だからゆっくり走る。

第三に、あなたは距離にインパルスを使用しているので、間違いなく正規化するつもりはありません。距離に比例したインパルスを得ることになります。

Hackish Solution の場合、他に何も機能しない場合は、PTM_RATIO を減らしてください!

于 2010-10-25T21:48:34.150 に答える