0

我正在使用 RubyGosuChipmunkgems 开发游戏。我在名为的文件中有以下类HeroBullets.rb

require 'gosu'

class HeroBullets
  attr_accessor :y
  def initialize(window)
    @x = 20
    @y = 0
  end
end

我知道需要从另一个Physics.rb处理所有Chipmunk代码的文件中访问这个类。

在顶部我有:

require 'chipmunk'

load 'HeroBullets.rb'

class Physics
   attr_accessor :play_area 

def initialize(window)

    @hBullets = Array.new(25)
    @hBullets << HeroBullets.new(window)
    @hBullets << HeroBullets.new(window)
end

再往下是:

  def fire_arrow(y)
    for i in 0...@hBullets.count
      @bullet = @hBullets[i]
      if(@bullet.y == y)
        @hBullets[i].active = true
      end
    end
  end

我得到的错误是:

Physics.rb:112:in block in fire_arrow': undefined methody' for nil:NilClass 
(NoMethodError) from Physics.rb:110:in each' from Physics.rb:110:infire_arrow'
from FileManager.rb:90:in fireHero' from .../lib/main.rb:90:inupdate' from .../lib/main.rb:129:in `'
4

1 回答 1

3

问题是如果@hBullets有 10 个元素,@hBullets.count将输出10,但@hBullets[10]不起作用,因为数组的索引从0not at开始1。第 10 个元素将在@hBullets[9]. 您收到错误消息是因为您尝试访问的元素是nil,而不是因为“未读取 attr_accessor”。

话虽如此,Ruby 提供了更简单的方法来迭代数组。我会像这样重写你的代码:

def fire_arrow(y)
  @hBullets.each do |bullet|
    bullet.active = true if bullet.y == y
  end
end

您的代码的另一个问题是您像这样初始化一个新数组:

@hBullets = Array.new(25)

这将创建一个包含 25 个元素的数组,这些元素都是nil. 您应该从一个空数组开始:

@hBullets = Array.new

或者:

@hBullets = []
于 2011-12-21T13:50:03.797 回答