3

Chingu 示例如下所示:

require 'rubygems'
require 'chingu'

class Game < Chingu::Window
  def initialize
    super
    @player = Player.new
  end
end

class Player < Chingu::GameObject
  def initialize(options = {})
    super(options.merge(:image => Gosu::Image["player.png"])
  end
end

Game.new.show

如果我想用线条而不是图像来绘制 Player 对象,我该怎么做呢?

下面的代码看起来很直观,但我无法让它工作!

class Player < Chingu::BasicGameObject
  def initialize(options = {})
    super
    @radius = options[:radius]
    @c = Gosu::Color.new(0xffff0000)
  end

  def draw
    $window.draw_rect([@x-1,@y+1,@x+1,@y+1,@x+1,@y-1,@x+1,@y+1],@c,1)
  end
end

难道我做错了什么?

4

1 回答 1

5

让我们弄清楚。

我假设这些是您实际代码的不完整片段,因为所示代码调用 draw_rect 并将 @x 和 @y 设置为 nil,为 nil:nilClass 异常抛出“未定义方法”,因为您无法从中减去任何内容零。)

我怀疑你看到的是一个没有绘制的空白窗口,因为正如所写,你的 Player.draw 永远不会被调用。

为什么?因为 Chingu 为其所有 GameObjects 提供自动绘制和更新,但前提是您使用 GameObject.create 而不是 GameObject.new。

( http://rdoc.info/projects/ippa/chingu )

Chingu::GameObject

将此用于所有游戏中的对象。玩家、敌人、子弹、道具、战利品。它非常可重用,并且不包含任何游戏逻辑(这取决于您!)。只有以某种方式将其放在屏幕上的东西。如果你使用 GameObject.create() 而不是 new(),Chingu 将把对象保存在“game_object”列表中,以便自动更新/绘制。

Chingu::BasicGameObject

GameObject 的 new() 与 create() 行为来自 BasicGameObject。

所以我们需要解决这个问题。然而...

现在,Chingu 每一帧都正确调用了 Player.draw,我们发现了一个新问题:对 draw_rect 的调用不起作用!这是Ruby告诉我的:

[99 , draw_rect': undefined method101, 101, 101, 101, 99, 101, 101]: 数组 (NoMethodError)

嗯...我可以看到传递给 draw_rect 方法的内容,我想知道它期望收到什么?让我们看一下代码。

( http://github.com/ippa/chingu/blob/master/lib/chingu/helpers/gfx.rb )

  # Draws an unfilled rect in given color
  #
  def draw_rect(rect, color, zorder)
    $window.draw_line(rect.x, rect.y, color, rect.right, rect.y, color, zorder)
    $window.draw_line(rect.right, rect.y, color, rect.right, rect.bottom, color, zorder)
    $window.draw_line(rect.right, rect.bottom, color, rect.x, rect.bottom, color, zorder)
    $window.draw_line(rect.x, rect.bottom, color, rect.x, rect.y, color, zorder)
  end

啊,现在说得通了。draw_rect 期望传递一个 Rectangle 对象,而不是一堆坐标。这里是:

( http://rdoc.info/projects/ippa/chingu )

     Chingu::Rect

     Constructor Details

- (Rect) initialize(*argv)

Create a new Rect, attempting to extract its own information from the 
given arguments.

The arguments must fall into one of these cases:

- 4 integers +(x, y, w, h)+.
- 1 Rect or Array containing 4 integers +([x, y, w, h])+.
- 2 Arrays containing 2 integers each +([x,y], [w,h])+.
- 1 object with a +rect+ attribute which is a valid Rect object.

All rect core attributes (x,y,w,h) must be integers.

所以我们只需要先创建一个 Rect 对象,然后以该 Rect 作为第一个参数调用 draw_rect 。

好的,让我们这样做。这是工作代码 -

require 'rubygems'
require 'chingu'

class Game < Chingu::Window
  def initialize
    super
    puts "initializing player..."
    @player = Player.create
  end

end

class Player < Chingu::BasicGameObject
  def initialize(options = {})
    super
    @x = 100
    @y = 100
    @rect = Chingu::Rect.new(@x, @y, 10, 10)
    @c = Gosu::Color.new(0xffff0000)
  end

  def draw
    puts "inside draw"
    puts @x, @y
    $window.draw_rect(@rect, @c, 1)
  end
end

Game.new.show

现在运行它会在 100,100 处显示一个小的红色矩形。

希望有帮助。

c~

于 2010-07-29T06:14:10.667 回答