4

私はゲーム開発にまったく慣れていないので、Gosu、Ruby、Chipmunk を一緒に試すのは楽しいだろうと思いました。これまでのところ、2D トップダウン フィールドにプレーヤーとボールがあり、衝突しています。今の問題は、プレーヤーを正方形にしたいということです。
私は高校で数学が苦手でした。Chipmunk のドキュメントには、ポリゴンの描画について次のように記載されています。

# Create a poly collision shape attached to the given body at
# the given offset with the given vertexes. _verts_ must be an
# Array of CP::Vect with a counterclockwise winding.
 def initialize(body, verts, offset); end

私は今私のポリゴンを取得するためのこのコードを持っています:

verts = Array.new
verts.push(CP::Vec2.new(0,32))
verts.push(CP::Vec2.new(32,32))
verts.push(CP::Vec2.new(32,0))
verts.push(CP::Vec2.new(0,0))

@shape = CP::Shape::Poly.new(@body, verts, CP::Vec2.new(0,0))

これにより、正方形の png に添付された形状が得られますが、0,0 が画像の左上隅であり、実際の Polygon は画像の左上のさらに上から始まるように見えます。

したがって、「オフセット」をポリゴンの幅の半分に設定する必要があると想定しましたが、正しい結果が得られません。

ここにいるほとんどの人にとって、これは初歩的なことだと確信しています。でも、ゲーム開発に関してはまだ小学生です。
誰かが私にこれを説明してもらえますか?

編集2011 年 5 月 28 日現在の私の完全なコードは次のとおりです

4

2 に答える 2

4

問題は、描画元と衝突元の間の不一致に起因しているようです。

実際には、ボールは x、y の中心に描画され、プレーヤーは x、y の左上隅に描画されます。プレーヤーの形状がx、yを中心にしていないことと相まって、問題が発生しています。

プレーヤーの描画を中央に配置するには、角度 0 で draw_rot メソッドを使用して、画像が回転しないようにします。

class Player
  def draw
    @image.draw_rot(@shape.body.pos.x, @shape.body.pos.y, 1, 0, 0.5, 0.5, 1, 1)
  end
end

シマリスの形状を中央のプレイヤー イメージに合わせるには、形状のサイズの半分だけ頂点をオフセットする必要があります。これをハードコードすることができます

class Player
  def initialize(space, image) 
    ...
    verts = Array.new
    verts.push(CP::Vec2.new(-16,16))
    verts.push(CP::Vec2.new(16,16))
    verts.push(CP::Vec2.new(16,-16))
    verts.push(CP::Vec2.new(-16,16))
    ...
  end
end

または実行時に単純に実行します

CP::recenter_poly(verts)

vertsシェイプに追加する前に。

これらの変更により、物理は期待どおりに動作するようになると思います。

于 2011-06-03T12:39:34.417 に答える
2

左上隅が (0,0) の 32x32 の正方形が必要な場合、座標は次のようになります。(32,32); (32,0); (0,0)。それとも32ではなく31ですか?シマリスのポリゴン定義には、ペンと紙が役立ちます。

Chipmunk はレンダリングについてまったく考えていないことを指摘する価値があります。それが行うのは抽象的な物理計算だけです。ここで必要なのは、正方形を定義することです。描画は Gosu で行われ、シマリスの形状から切り離されています。これは、あなたが痛烈に経験したことです:) Gosu でシマリスの形状を視覚化するための事前に作成されたライブラリがあればいいと思いますが、私自身はシマリスのユーザーではありません。

于 2011-04-25T05:44:41.853 に答える