2011-12-21 4 views
0

GosuChipmunk 보석을 사용하여 Ruby로 게임을 개발하고 있습니다. 나는 모든 Chipmunk 코드를 처리하는 다른 파일, Physics.rb에서이 클래스에 접근 할 필요가 알고Ruby attr_accessor를 읽을 수 없습니다.

require 'gosu' 

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

: 나는 HeroBullets.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 

그리고이 더 아래로 : : 맨

내가 가진

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

여기 질문이 표시되지 않습니다. 또한 코드가 여전히 올바르지 않습니다. –

+0

정확한 오류 메시지를 게시하십시오 –

답변

3

문제는 @hBullets가있는 경우이다 : 내가 오류가

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

10 개의 요소 인 @hBullets.count10을 출력하지만배열 인덱스가 0이 아닌 1이 아니기 때문에이 작동하지 않습니다. 열 번째 요소는 @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 = Array.new 

또는 :

@hBullets = [] 
+0

귀하의 버전을 구현하려했으나 문제가 계속 발생합니다. 오류를 붙여 넣은 곳의 편집 내용을 저장하지 않았다는 것을 깨달았습니다. 이제 그 코드가 –

+0

에 또 다른 실수를 발견했습니다. 내 업데이트 답변을 참조하십시오. – Mischa

+0

감사합니다. :) 내 문제가 해결되었습니다. 나는 루비와 그 보석에 비교적 새로운 것이다. –