1

数日間これに苦労しており、ネット上でコード例を見つけるのは困難です。

トップダウン ゲームを作成していますが、キーを押してプレーヤーを動かせません。add_force現在、 orを使用しadd_impulseてプレイヤーをある方向に動かしていますが、プレイヤーは止まりません。スペースとプレイヤーの間の表面摩擦を使用して摩擦をシミュレートすることについて読んだことがあります。tank.cデモでそれがどのように行われるかを次に示します。

ただし、このコードをシマリスからピムンクに移植するのに十分なAPIを理解していません。

cpConstraint *pivot = cpSpaceAddConstraint(space, cpPivotJointNew2(tankControlBody, tankBody, cpvzero, cpvzero));

これまでのところ、次のようなものがあります。

class Player(PhysicalObject):
    BASE_SPEED = 5
    VISIBLE_RANGE = 400
    def __init__(self, image, position, world, movementType=None):
        PhysicalObject.__init__(self, image, position, world)
        self.mass = 100
        self.CreateBody()
        self.controlBody = pymunk.Body(pymunk.inf, pymunk.inf)
        self.joint = pymunk.PivotJoint(self.body, self.controlBody, (0,0))
        self.joint.max_force = 100
        self.joint.bias_coef = 0
        world.space.add(self.joint)

スペース/プレイヤーの制約をスペースに追加する方法がわかりません。

(この質問の pymunk タグを作成するには、1500 人以上の担当者が必要です)。

4

2 に答える 2

1

Joe がこの質問を Chipmunk/pymunk フォーラムにクロスポストしたところ、さらにいくつかの回答が得られました。http://www.slembcke.net/forums/viewtopic.php?f=1&t=1450&start=0&st=0&sk=t&sd=a

以下のフォーラムからの回答の一部を貼り付け/編集しました。

#As pymunk is python and not C, the constructor to PivotJoint is defined as
def __init__(self, a, b, *args):
    pass

#and the straight conversion from c to python is
pivot1 = PivotJoint(tankControlBody, tankBody, Vec2d.zero(), Vec2d.zero())
# but ofc it works equally well with 0 tuples instead of the zero() methods:
pivot2 = PivotJoint(tankControlBody, tankBody, (0,0), (0,0))

mySpace.add(pivot1, pivot2)

args に 1 つまたは 2 つの引数を送信するかどうかに応じて、C インターフェイスで cpPivotJointNew または cpPivotJointNew2 メソッドを使用してジョイントを作成します。これら 2 つのメソッドの違いは、cpPivotJointNew は引数として 1 つのピボット ポイントを必要とし、cpPivotJointNew2 は 2 つのアンカー ポイントを必要とすることです。したがって、1 つの Vec2d pymunk を送信すると cpPivotJointNew が使用されますが、2 つの Vec2d を送信すると cpPivotJointNew2 が使用されます。

PivotJoint コンストラクターの完全なドキュメントはこちら: PivotJoint コンストラクターのドキュメント

于 2011-03-09T07:55:57.347 に答える
0

あなたが言及したどちらのシステムにも精通していませんが、関連する可能性のある基本的なゲームのアイデアは次のとおりです。

  • 動きに影響を与える力 (またはインパルス) を追加する場合、エンティティを停止するには、エンティティを取り除く必要もあります。私のゲームでは、関数 AddImpulse()/AddForce() があれば、Apply_Friction() などの対応する関数があり、movespeed がゼロ以下になるまで、(地形に基づいて?) 必要なだけ効果を反転させます。個人的には、ゲームプレイに必要でない限り、この移動方法を気にする必要はありません。これは、更新ごとに価値のある計算を追加できるためです。

  • KeyPressed および/または KeyPosition を追跡する何らかの方法が必要であり、それらの x/y 座標を使用して、プレーヤーの速度に基づいてインクリメントされます。何を試したか、または API がどれだけ役に立ったかを知らなければ、それ以上のことを言うのは困難です。

お役に立てれば。これがすでに知っているものである場合は、親切に無視してください。

于 2011-03-07T19:08:20.167 に答える