0

我试图让我的窗户边缘可以碰撞,而不是让我的形状在创作时从地板上掉下来。

当我浏览网站上的演示时,我看到了用于定义空间边界的这行代码:

[_space addBounds:CGRectMake(130, 139, 767, 1500) thickness:20 elasticity:1.0 friction:1.0 layers:PhysicsEdgeLayers group:CP_NO_GROUP collisionType:nil];

我认为这会在空间周围分配可碰撞的边界,从而将其封闭。

由于对 Objective-C 的一些小知识,我知道 addBounds 是一种允许创建空间边界的空间方法。

但是,在查看 chimmunk 的ruby​​ 绑定时,我找不到 AddBounds 方法。

此外,在一个相关问题中,我找不到 cpShapeSetFriction ruby​​ 等价物。

我能找到这些方法吗?如果我不能,还有其他选择吗?

4

2 回答 2

1

对于那些想知道的人,该addBounds方法没有红宝石绑定。

我通过创建四个构成窗口边框的静态段形状来解决这个问题。

以下是创建边界所需的段。

    CP::Shape::Segment.new(YOUR_STATIC_BODY, CP::Vec2.new(0, 0), CP::Vec2.new(WIDTH, 0), 1.0)
    CP::Shape::Segment.new(YOUR_STATIC_BODY, CP::Vec2.new(0, 0), CP::Vec2.new(0, HEIGHT), 1.0)
    CP::Shape::Segment.new(YOUR_STATIC_BODY, CP::Vec2.new(WIDTH, 0), CP::Vec2.new(WIDTH, HEIGHT), 1.0)
    CP::Shape::Segment.new(YOUR_STATIC_BODY, CP::Vec2.new(0, HEIGHT), CP::Vec2.new(WIDTH, HEIGHT), 1.0)

不要忘记将它们添加到空间中@space.add_static_shape(THE_SEGMENT)

红宝石中的形状摩擦可以设置为:shape.u = 0.1 #Shape friciton of 0.1

于 2014-12-27T03:57:13.010 回答
0

在 Ruby with Gosu 中,我修改了chipmunk_integration.rb示例以添加墙。有效地使用 CP::Shape::Segment,你可以在这里找到完整的解释和来源:

Ruby Chipmunk Integration 初学者 hacking gosu-example https://www.libgosu.org/cgi-bin/mwf/topic_show.pl?tid=1324

class Wall
  attr_reader :a, :b

  def initialize(window, shape, pos)
    # window needs to have a attr_accessor for :space
    @window = window

    @color = Gosu::Color::WHITE

    @a = CP::Vec2.new(shape[0][0], shape[0][1])
    @b = CP::Vec2.new(shape[1][0], shape[1][1])

    @body = CP::Body.new(CP::INFINITY, CP::INFINITY)
    @body.p = CP::Vec2.new(pos[0], pos[1])
    @body.v = CP::Vec2.new(0,0)

    @shape = CP::Shape::Segment.new(@body, @a, @b, 1)
    @shape.e = 0.5
    @shape.u = 1

    @window.space.add_static_shape(@shape)
  end

  def draw
    @window.draw_line(@body.p.x + a.x, @body.p.y + a.y, @color,
                      @body.p.x + b.x, @body.p.y + b.y, @color,
                      ZOrder::Wall)
  end
end

我在这里整合了它:

https://github.com/Sylvain303/gosu-examples/blob/test_chipmunk/examples/chipmunk_integration.rb#L218

以这种方式添加墙壁:

    @borders = []
    # add space wall !
    # first couple is point (x,y) of the segement, last couple is it top point
    # position.
    # left
    @borders << Wall.new(self, [[1, 1], [1,HEIGHT-1]], [1, 1])
    # top
    @borders << Wall.new(self, [[1, 1], [WIDTH-1, 1]], [1,1])
    # right
    @borders << Wall.new(self, [[1, 1], [1,HEIGHT-1]], [WIDTH-1, 1])
    # bottom
@borders << Wall.new(self, [[1, 1], [WIDTH-1, 1]], [1,HEIGHT-1])
于 2017-02-13T05:16:44.633 回答