Ruby / Gosu: проблема с вызовом атрибутов экземпляра внутри циклов - PullRequest
1 голос
/ 25 мая 2019

В качестве предисловия я хочу сказать, что я очень новичок в программировании, и эта программа определенно написана не самым умным способом.

Кроме того, я использую терминал, чтобы показать отладку, но программа является графической, как показано ближе к концу.

В программе Gosu у меня есть оператор if внутриосновная функция розыгрыша.Когда срабатывает оператор if, он должен отображать несколько строк текста, представляющих разные названия треков в музыкальном альбоме.Я пытался сделать это с помощью цикла, который печатает все эти треки с помощью одного вызова .draw_text.На каждой итерации она должна сдвигаться на пару пикселей вниз.Цикл выполняется один раз за кадр, 60 кадров в секунду.

Внутри цикла я вызываю эту длинную цепочку массивов / экземпляров:

@albums[@current_album_no].tracks[i].name

Это на самом деле работает нормально, как показанониже, но когда я попытаюсь использовать его внутри цикла, это приведет к аварийному завершению программы.

Странно то, что цикл на самом деле будет прекрасно отображаться, как показано в операторах "put", но завершит работу ПОСЛЕ выполнения.

В предыдущей версии у меня был этот цикл в отдельной функции, поэтому я думал, что перемещение цикла внутрь основного вызова отрисовки и использование переменных класса будет работать вместо этого.На мой взгляд, это должно было устранить все проблемы с переменной областью, но я не уверен.

Вот этот цикл:

if @current_album_no > 0
   puts "OUTSIDE LOOP: " + @albums[@current_album_no].tracks[1].name.to_s
   for i in 1..@albums[@current_album_no].tracks.length
      puts "INSIDE LOOP: " + @albums[@current_album_no].tracks[i].name.to_s
      @tracks_font.draw_text("Track ##{i}: '#{@albums[@current_album_no].tracks[i].name}'", 225, 100+((i-1)*25), ZOrder::UI, 1.5, 1.5, Gosu::Color::BLACK)
   end
end

И вывод, показывающий «успех» передсбой:

ruby .\gui_music_player.rb

Reading albums file...

Found album #1: 'Black Sands' by 'Bonobo'
Found album #2: 'Ancestral Recall' by 'Christian Scott aTunde Adjuah'

OUTSIDE LOOP: Prelude
INSIDE LOOP: Prelude       ###By this point the program has already crashed
INSIDE LOOP: Kiara
INSIDE LOOP: Kong
INSIDE LOOP: Eyesdown
INSIDE LOOP: El Toro
INSIDE LOOP: We Could Forever
INSIDE LOOP: 1009
INSIDE LOOP: All in Forms
INSIDE LOOP: The Keeper
INSIDE LOOP: Stay the Same
INSIDE LOOP: Animals
INSIDE LOOP: Black Sands
./gui_music_player.rb:97:in `block in draw': undefined method `name' for nil:NilClass (NoMethodError)
        from ./gui_music_player.rb:96:in `each'
        from ./gui_music_player.rb:96:in `draw'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/gosu-0.14.5-x86-mingw32/lib/gosu/patches.rb:72:in `tick'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/gosu-0.14.5-x86-mingw32/lib/gosu/patches.rb:72:in `tick'
        from ./gui_music_player.rb:182:in `<main>'

Строка 97 - это путы "INSIDE LOOP", но без них выдает ту же ошибку:

ruby .\gui_music_player.rb

Reading albums file...

Found album #1: 'Black Sands' by 'Bonobo'
Found album #2: 'Ancestral Recall' by 'Christian Scott aTunde Adjuah'

./gui_music_player.rb:99:in `block in draw': undefined method `name' for nil:NilClass (NoMethodError)
        from ./gui_music_player.rb:96:in `each'
        from ./gui_music_player.rb:96:in `draw'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/gosu-0.14.5-x86-mingw32/lib/gosu/patches.rb:72:in `tick'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/gosu-0.14.5-x86-mingw32/lib/gosu/patches.rb:72:in `tick'
        from ./gui_music_player.rb:182:in `<main>'

С строкой 99 - "@ track_font.draw_text""call.

Теперь то, что я на самом деле хочу, происходит примерно так: https://i.imgur.com/mDwaCn8.png Но с разными названиями треков, конечно.

Этот снимок экрана был сделан путем изменения" я"здесь:

'#{@albums[@current_album_no].tracks[i].name}'

... в" 1 ".

Таким образом, код может отображать полный список, только с разными названиями дорожек.

...