4

我是游戏开发的新手,我认为一起尝试 Gosu、Ruby 和 Chipmunk 会很有趣。到目前为止,我在 2d Top-Down 场上有一个球员和一个球,它们发生了碰撞。我现在的问题是我希望我的球员是一个正方形。
我在高中时数学很烂,那是太多年前的事了。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 是图像的左上角,而实际的多边形开始于图像的左上角甚至更远。

所以我认为我应该将“偏移”设置为多边形宽度的一半,但这并没有给我正确的结果。

我敢肯定,对于这里的大多数人来说,这是基本的。但在游戏开发方面,我仍然处于初级阶段。
有人可以向我解释一下吗?

编辑
是我截至 2011 年 5 月 28 日的完整代码

4

2 回答 2

4

看起来您的问题源于绘图和碰撞原点之间的不一致。

实际上,您的球以 x,y 为中心绘制,而玩家则以 x,y 的左上角绘制。再加上您的 Player 形状未以 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 正方形,你的坐标应该是:(0,32); (32,32);(32,0); (0,0)。还是 31 而不是 32?对于 Chipmunk 多边形定义,笔和纸会派上用场。

值得指出的是,Chipmunk 完全不知道渲染——它所做的只是抽象的物理计算。所以你想要在这里定义一个正方形。绘图是在 Gosu 中完成的,并且与花栗鼠的形状分离,正如您所经历的那样:) 让我认为在 Gosu 中可视化花栗鼠形状的预制库会很好,但我自己不是花栗鼠用户。

于 2011-04-25T05:44:41.853 回答