Project1

标题: 一次界面脚本结构优化的经历 [打印本页]

作者: KB.Driver    时间: 2019-3-3 23:03
标题: 一次界面脚本结构优化的经历
初学ruby时,用自己蹩脚的编程水平写了一个标题界面。


当然,代码的结构十分的“个性”,不利于阅读与修改,更不用说拓展了。
随便找出一段代码都能让人看着头大

旧代码


最近着手重构这部分代码.
优化过程

好了,这样可读性大幅度提高了,并且还有机会扩展。
新代码


最终效果

作者: shitake    时间: 2019-3-4 00:12
本帖最后由 shitake 于 2019-3-4 02:10 编辑

为什么不来试试 rgui 呢 【逃

github.com/molingyu/rgui

https://molingyu.github.io/rgui/

rgui


上边界面的等价物 没测试 感觉是跑不起来 orz
RUBY 代码复制
  1. # require 'rgui'
  2.  
  3. class View_Title
  4.     include RGUI
  5.     def initialize
  6.         @childs = []
  7.         @bg = Component::ImageBox.new({
  8.             image: Bitmap.new('bg.png'),
  9.             x: 0,
  10.             y: 0,
  11.             width: Graphics.width,
  12.             height: Graphics.height,
  13.             type: Component::ImageBoxType::Filling
  14.         })
  15.         @childs.push @bg
  16.         @button_bg =  Component::ImageBox.new({
  17.             image: Bitmap.new(Graphics.width, 48).fill(0, 0, Graphics.width, 48, Color.new(255, 255, 255, 180)),
  18.             type: Component::ImageBoxType::Responsive,
  19.             visible: false
  20.         })
  21.         @button_bg.add_action(:breath, {speed: 0.6})
  22.         @childs.push @button_bg
  23.         @command_index = 0
  24.     end
  25.  
  26.     def create_command(name, method, enabled = false)
  27.         button = Component::SpriteButton.new({
  28.             x: 0,
  29.             y: 300 + @command_index * 48,
  30.             status: enabled,
  31.             images: create_button_bitmap(conf.name)
  32.         })
  33.  
  34.         button.on(:click){ |_| method.call }
  35.  
  36.         button.on(:mouse_out){ |em| em.object.lost_focus }
  37.  
  38.         button.on(:lost_focus) { |em|
  39.             em.object.sprite.zoom_y = 1
  40.             index = @childs.index(em.object)
  41.             while(@childs[index + 1].class == Component::SpriteButton)
  42.                 @childs[index + 1].y = @childs[index].y + @childs[index].height
  43.                 index += 1
  44.             end
  45.             @button_bg.hide
  46.         }
  47.  
  48.         button.on(:mouse_in){ |em|
  49.             Event::EventManager.focus_object.lost_focus if Event::EventManager.focus_object != em.object
  50.             Event::EventManager.focus_object == em.object
  51.             em.object.get_focus
  52.         }
  53.  
  54.         button.on(:get_focus){ |em|
  55.             em.object.sprite.zoom_y = 1.5
  56.             index = @childs.index(em.object)
  57.             while(@childs[index + 1].class == Component::SpriteButton)
  58.                 @childs[index + 1].y = @childs[index].y + @childs[index].height * 1.5
  59.                 index += 1
  60.             end
  61.             @button_bg.y = em.object.y
  62.             @button_bg.show
  63.         }
  64.         @childs.push(button)
  65.         @command_index += 1
  66.     end
  67.  
  68.     def create_button_bitmap(name)
  69.         font = Font.new("LilyUPC", 32)
  70.         font.bold = true
  71.         font.out_color = Color::BLACK
  72.         [Color::GL18, Color::GL32, Color::GL4].map{|c|
  73.             bitmap = Bitmap.new(Graphics.width, 32)
  74.             bitmap.font = font
  75.             bitmap.font.color = c
  76.             bitmap.draw_text(0, 0, Graphics.width, 32, name, 1)
  77.             bitmap
  78.          }
  79.     end
  80.  
  81.     def update
  82.         @childs.each{|c| c.update }
  83.     end
  84.  
  85.     def dispose
  86.         @childs.each{|c| c.dispose }
  87.     end
  88.  
  89. end
  90.  
  91. class Scene_Title < Scene_Base
  92.     def start
  93.         @view = View_Title.new
  94.         @view.create_command 'New Game', method :new_game
  95.         @view.create_command 'Load Game', method(:continue), DataManager.save_file_exists?
  96.         @view.create_command 'Shutdown', method :shutdown
  97.     end
  98.  
  99.     def update
  100.         @view.update
  101.     end
  102.  
  103.     def new_game
  104.     end
  105.  
  106.     def continue
  107.     end
  108.  
  109.     def shutdown
  110.     end
  111. end

作者: KB.Driver    时间: 2019-3-4 00:57
shitake 发表于 2019-3-4 00:12
为什么不来试试 rgui 呢 【逃

github.com/molingyu/rgui

这个太触了,回头都可以用rm写简单的窗体程序了……

我还只是做着玩玩,用不到这么高端的东西233
(咱不是搞编程的,只会瞎摸几下rgss,涉及到线程和API就不会了_(:з」∠)_




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1