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
相关产品推荐
相关产品推荐

