我是游戏开发的新手,我认为一起尝试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日的完整代码
答案 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中可视化花栗鼠形状的预制库会很好,但我不是花栗鼠用户自己。