用Ruby中的Chipmunk和Gosu绘制一个Polygon

时间:2011-04-16 06:43:55

标签: ruby chipmunk libgosu

我是游戏开发的新手,我认为一起尝试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是图像的左上角,而实际的Polygon甚至更远到图像的左上角。

所以我假设我应该将“偏移”设置为我的Polygon宽度的一半,但这并不能给我正确的结果。

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

修改
Here是我截至2011年5月28日的完整代码

2 个答案:

答案 0 :(得分: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添加到您的形状中。

随着这些变化,我怀疑你的物理行为会更像你期望的那样。

答案 1 :(得分:2)

如果你想要一个左上角为(0,0)的32x32广场,你的坐标应为:(0,32); (32,32); (32,0); (0,0)。或者是31而不是32?对于花栗鼠多边形定义,pen&纸张派上用场。

值得指出的是,花栗鼠绝对不知道渲染 - 所有它都是抽象的物理计算。所以你想要的是定义一个正方形。 绘图在Gosu中完成并与Chipmunk形状分离,因为您经历了痛苦的经历:)让我觉得在Gosu中可视化花栗鼠形状的预制库会很好,但我不是花栗鼠用户自己。