You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:15:34