1

作为前言,我想说我对编程很陌生,而且这个程序绝对不是用最聪明的方式编写的。

另外,我正在使用终端来显示调试,但程序是图形的,如最后所示。

在 Gosu 程序中,我在主绘图函数中有一个 if 语句。当这个 if 语句被触发时,它意味着显示几行代表音乐专辑中不同曲目名称的文本。我一直在尝试使用一个循环来执行此操作,该循环通过单个“.draw_text”调用打印所有这些轨道。在每次迭代中,它应该向下移动几个像素。循环每帧执行一次,每秒 60 帧。

在循环内部,我将这个长链数组/实例称为:

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

这实际上工作正常,如下所示,但是当我尝试在循环中使用它时,它会使程序崩溃。

奇怪的是,循环实际上会像“puts”语句中所示的那样完美输出,但会在执行后崩溃。

在以前的版本中,我将这个循环放在一个单独的函数中,所以我认为将循环移动到主绘图调用内部并使用类变量会起作用。在我看来,这应该消除了所有变量范围的问题,但我不确定。

这是有问题的循环:

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 行是“@tracks_font.draw_text”调用。

现在我真正想要发生的是这样的事情: https ://i.imgur.com/mDwaCn8.png 但是当然有不同的轨道名称。

该屏幕截图是通过更改此处的“i”制作的:

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

...变成“1”。

所以代码能够显示一个完整的列表,只是没有不同的轨道名称。

4

0 回答 0