矢量'玩家'而不是使用Chingu和Gosu的图像

JP.*_*JP. 3 ruby libgosu

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
Run Code Online (Sandbox Code Playgroud)

如果我想用线而不是图像绘制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
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?

小智 5

让我们弄明白.

我假设这些是你的实际代码的不完整片段,因为显示的代码调用draw_rect,@ x和@y设置为nil,抛出'undefined方法' - 'for nil:nilClass'异常,因为你不能从中减去任何东西零.)

我怀疑你看到的是一个没有画出任何东西的空白窗口,因为写完后,你的Player.draw永远不会被调用.

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

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

Chingu ::游戏对象

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

Chingu :: BasicGameObject

GameObject的new()vs create()行为来自BasicGameObject.

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

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

in draw_rect': undefined methodx'for [99,101,101,101,101,99,101,101]:Array(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
Run Code Online (Sandbox Code Playgroud)

啊,现在有道理了.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.
Run Code Online (Sandbox Code Playgroud)

所以我们首先需要创建一个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
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助.

C〜