2011-12-21 17 views
0

私はrubyでGosuChipmunkの宝石を使ってゲームを開発しています。私はHeroBullets.rbという名前のファイルに次のクラスがあります。Rubyのattr_accessorが読み込まれていません

require 'gosu' 

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

私はすべてのChipmunkコードを扱う別のファイル、Physics.rbからこのクラスにアクセスする必要があります知っています。私が持っている一番上に

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 [email protected] 
     @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 `' 
+0

@hBullets = Array.new 

または:あなたは、代わりに空の配列を開始する必要があります。さらに、コードはまだ正しくフォーマットされていません。 –

+0

あなたが持っている正確なエラーメッセージを投稿してください –

答えて

3

問題があれば@hBulletsが持っているということです10要素、@hBullets.count10を出力しますが、アレイのインデックスが0で開始され、1で始まらないため、は機能しません。 10番目の要素は@hBullets[9]になります。アクセスしようとしている要素がnilであるため、エラーメッセージが表示されます。「attr_accessorが読み取られていないため」ではありません。

Rubyでは、配列を繰り返し処理する方がずっと簡単です。私はこのようにあなたのコードを書き換えるになります。これは、すべてのnilある25個の要素を持つ配列を作成します

@hBullets = Array.new(25) 

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

あなたのコードのもう一つの問題は、あなたがこのような新しい配列を初期化するということです。私はここか質問が表示されない

@hBullets = [] 
+0

あなたのバージョンを実装しようとしましたが、問題は解決しません。私はエラーを貼り付けた編集を保存していないことに気付きました。今すぐ見る –

+0

あなたのコードで別の間違いを発見しました。私の更新された答えを見てください。 – Mischa

+0

ありがとう! :)私の問題は解決しました。私はRubyとその宝石にとって比較的新しいものです。 –

関連する問題