2

KinematicBody2D の test_move() を使用して、キャラクターが壁の横にあるかどうかを確認しようとしましたが、壁に触れていませんでしたが、実際のドキュメントは単に

bool test_move( Transform2D from, Vector2 rel_vec, bool infinite_inertia=true )

Checks for collisions without moving the body. Virtually sets the node's position, scale and rotation to that of the given Transform2D,

次に、ベクトル rel_vec に沿ってボディを動かそうとします。衝突が発生する場合は true を返します。

そして、私が見つけることができるすべてのチュートリアルは、唯一の引数がもう少し簡単な Vector2 である関数の古いバージョンを示しているだけです。

私が理解している限りでは、Transform2D はテストするオブジェクトの初期位置であり、Vector2 はオブジェクトが移動する方向を示し、無限の慣性はオブジェクトが衝突時に回転するかどうかを処理します。

私の問題は現在Transform2Dにあります。これまでのところ、ドキュメントで見つけることができる関数は、その形式でオブジェクトの変換を返す必要があるように見えるのはCollisionObject2Dのものだけです

shape_owner_get_transform( int owner_id ) const

Returns the shape owner's Transform2D.

しかし、私が何をしようとしても、私はいつもそれから恒等行列を取得しているように見えます.これを理解しようとして終わったコードのビットは

var transform2d = Transform2D(owner.shape_owner_get_transform(owner.get_shape_owners()[0]))

if owner.test_move(transform2d, Vector2(-20, 0), true):
  print("on your left").

owner_id を取得するために使用したのが test_move()、shape_owner_get_transform()、または get_shape_owners() であるかどうか、私が誤解している関数はわかりませんが、助けていただければ幸いです。

4

1 に答える 1

2

質問を投稿した直後に解決したので、ここで自分の質問に答えます。私の問題はowner.shape_owner_get_transform(owner.get_shape_owners()[0])、体の変化を得る方法ではないということです. 代わりに、キャラクターの位置と回転を使用して Transform2D を構築する必要がありました。

最後に私の next_to_wall() 関数は次のようになりました:

func next_to_wall(distance):
    var transform2d = Transform2D(0.0, owner.position)

    if owner.test_move(transform2d, Vector2(distance, 0), true):
        return true
    else:
        return false

最初の引数に 0.0 を入力したことに注意してください。これは、私のケースではうまくいったためです。それ以外の場合は、owner.rotation になります。

于 2019-07-31T01:29:50.923 に答える