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

DragonRuby框架不支持Ruby原生Dir类?求替代实现方案

DragonRuby中无法使用Dir类遍历文件序列制作动画的解决方案

在DragonRuby中尝试用标准Ruby的Dir类遍历文件序列制作动画时,触发uninitialized constant FujiwaraGame::Dir错误,报错信息如下:

EXCEPTION THROWN:
uninitialized constant FujiwaraGame::Dir
Backtrace:
app/main.rb:362:in video
app/main.rb:347:in render_video
app/main.rb:105:in render
app/main.rb:82:in gameplay
app/main.rb:74:in game_state
app/main.rb:405:in tick
app/main.rb:417:in tick

原代码片段:

def video
  x = 0
  y = TILE_SIZE * 3
  w = 1280
  h = (720 - 80) - y # Adjusted for the HUD height
  @video_image ||= { x: x, y: y, w: w, h: h, path: 'sprites/misc/frame_0000.png'}

  video_file ||= ''

  d = Dir.new("video")
  d.each {|x| puts "Got #{x}" }
end

解决方案

DragonRuby不支持标准Ruby的Dir类,需要使用框架内置的$gtk.glob方法来获取目录下的文件列表,具体实现如下:

  • 获取并排序帧文件:用$gtk.glob匹配目标目录下的动画帧文件,通过排序保证帧顺序正确
  • 维护动画播放状态:用实例变量保存帧列表、当前帧索引和帧切换间隔,控制动画播放速度

修改后的示例代码:

def video
  x = 0
  y = TILE_SIZE * 3
  w = 1280
  h = (720 - 80) - y # Adjusted for the HUD height

  # 初始化动画状态
  unless @video_state
    # 获取video目录下所有帧文件并按文件名排序
    @video_frames = $gtk.glob("video/frame_*.png").sort
    @current_frame_idx = 0
    @frame_tick_interval = 2 # 每2个tick切换一帧,可按需调整
    @tick_counter = 0
    @video_state = true # 标记已初始化
  end

  # 按间隔切换帧
  @tick_counter += 1
  if @tick_counter >= @frame_tick_interval
    @current_frame_idx = (@current_frame_idx + 1) % @video_frames.size
    @tick_counter = 0
  end

  # 更新并绘制当前帧
  @video_image ||= { x: x, y: y, w: w, h: h }
  @video_image[:path] = @video_frames[@current_frame_idx]
  args.outputs.sprites << @video_image
end

关键说明

  • $gtk.glob是DragonRuby提供的文件匹配方法,支持通配符,返回匹配到的文件路径数组
  • 必须对帧文件排序,否则动画播放顺序会混乱
  • 通过tick_counter和frame_tick_interval可灵活控制动画的播放速度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:50:11