使用Gosu开发多选音乐播放器时媒体资源初始化失败求助
问题分析
你的代码存在三个核心问题,直接导致黑屏和资源无法正常显示:
- 绘制逻辑错误:Gosu窗口依赖
draw方法循环渲染画面,你在initialize里调用@vil.draw这类绘制方法,只会执行一次,且窗口还未进入主渲染循环,画面无法被持续渲染。 - 方法作用域错误:
draw_beth定义在类外部,无法访问MW类的实例变量@beth,调用时会出现变量访问异常。 - 输入逻辑冗余:
read_integer_in_range已经返回用户输入的整数,你又用gets.chomp.to_i(),导致程序等待两次输入,且choice是局部变量,后续draw方法无法读取。
修复后的代码
require 'gosu' require './input_functions' class MW < Gosu::Window def initialize super 200, 135 # 初始化所有资源 @beth = Gosu::Image.new("media/beth.jpg") @dimitri = Gosu::Image.new("media/dimitri.png") @vil = Gosu::Image.new("media/vilva.png") @song = Gosu::Song.new("media/3rdmovement.mp3") @song2 = Gosu::Song.new("media/2ndwaltz.mp3") @song3 = Gosu::Song.new("media/1stseason.mp3") # 直接用read_integer_in_range的返回值作为实例变量 @choice = read_integer_in_range( "What song you want play\n1st Spring\n2nd Waltz\n3rd movement", 1, 3) # 根据选择播放对应歌曲 case @choice when 1 @song3.play when 2 @song2.play when 3 @song.play end end # 重写draw方法,Gosu会循环调用该方法渲染画面 def draw case @choice when 1 @vil.draw(0, 0, 0) when 2 @dimitri.draw(0, 0, 0) when 3 draw_beth end end # 将draw_beth改为类的实例方法,才能访问@beth变量 def draw_beth @beth.draw(0, 0, 0) end end window = MW.new window.show
关键修复说明
- 绘制逻辑移至
draw方法:Gosu主循环会持续调用draw,确保画面被持续渲染,解决黑屏问题。 - 调整
draw_beth作用域:将其放入MW类内部作为实例方法,正确访问@beth变量。 - 简化输入逻辑:直接使用
read_integer_in_range的返回值作为实例变量@choice,避免重复输入,同时让draw方法能读取用户选择。 - 添加图层参数:
draw方法第三个参数为图层深度(默认0即可),确保图片正常绘制。
内容的提问来源于stack exchange,提问作者Kar98k
相关产品推荐
相关产品推荐

