В качестве предисловия я хочу сказать, что я очень новичок в программировании, и эта программа определенно написана не самым умным способом.
Кроме того, я использую терминал, чтобы показать отладку, но программа является графической, как показано ближе к концу.
В программе 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 ".
Таким образом, код может отображать полный список, только с разными названиями дорожек.