繁体   English   中英

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

[英]Draw a Polygon with Chipmunk and Gosu in Ruby

我是游戏开发的新手,我认为一起尝试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宽度的一半,但这并没有给我正确的结果。

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

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

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

实际上,你的球是以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

要使Chipmunk形状适合居中的玩家图像,您需要将顶点偏移一半大小的形状。 你可以硬编码

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之前。

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

如果你想要一个32x32的正方形,它的左上角是(0,0),你的坐标应该是:(0,32); (32,32); (32,0); (0,0)。 或者是31而不是32? 对于花栗鼠多边形定义,笔和纸可以派上用场。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM