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

Ruby Gosu库中实现鼠标左键切换曲目列表绘制功能求助

Ruby Gosu实现点击切换曲目列表显示

问题描述

当前代码仅在按住鼠标左键且鼠标位于指定专辑区域时显示曲目列表,松开左键即消失。需要改为点击该区域切换显示状态(点击一次显示,再次点击隐藏)。

解决方案

核心思路是用实例变量跟踪曲目列表的显示状态,通过button_down方法处理单次点击事件(而非draw方法中检测持续按住状态):

1. 初始化显示状态变量

在窗口类的initialize方法中添加状态变量,初始化为隐藏:

def initialize
  # 保留你原有的初始化代码(如窗口尺寸、字体加载等)
  @show_tracks = false # 曲目列表显示状态,默认隐藏
end

2. 处理鼠标点击事件

新增button_down方法,检测鼠标左键点击专辑区域时切换显示状态:

def button_down(id)
  # 当左键点击且鼠标在专辑1区域内时,切换显示状态
  if id == Gosu::MsLeft && mouse_over_album1(mouse_x, mouse_y)
    @show_tracks = !@show_tracks
  end
end

3. 修改绘制逻辑

更新drawtracks_main方法,根据状态变量决定是否绘制曲目:

def drawtracks_main(albums)
  # 仅当显示状态为true时绘制曲目
  draw_tracks(albums[0].tracks) if @show_tracks
end

额外优化(可选)

原draw方法中每次都读取albums.txt文件,会导致性能浪费,建议将文件读取移至initialize方法中:

def initialize
  # ...原有初始化代码
  @show_tracks = false
  # 一次性读取专辑数据
  music_file = File.new("albums.txt", "r")
  @albums = read_albums(music_file)
  @artworks = read_artworks(@albums)
  music_file.close()
end

def draw
  @info_font.draw("mouse_x: #{mouse_x}", 0, 590, ZOrder::UI, 1.0, 1.0, Gosu::Color::BLACK)
  @info_font.draw("mouse_y: #{mouse_y}", 100, 590, ZOrder::UI, 1.0, 1.0, Gosu::Color::BLACK)
  draw_background() 
  draw_albums(@albums)
  drawtracks_main(@albums)
end

关键说明

  • button_down是Gosu中专门处理单次按键/点击事件的方法,适合实现切换逻辑;而button_down?用于检测持续按住状态,不适合点击切换场景。
  • 必须使用实例变量(以@开头)来保存显示状态,这样状态才能在不同方法间共享,局部变量会在方法执行结束后被销毁,导致状态无法保留。

内容的提问来源于stack exchange,提问作者Lucy Pavano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:20:18