Project1

标题: 焦点输入 InputFocus [打印本页]

作者: 叶子    时间: 2015-8-12 12:40
标题: 焦点输入 InputFocus
本帖最后由 叶子 于 2015-8-12 12:58 编辑

RMVA的DEMO: InputFocus.zip (1.43 MB, 下载次数: 66)
填坑过程中产生的一个可以独立出来的东西
  1. =begin

  2. InputFocus
  3. Author: leav

  4. 功能:
  5. 解除使用Input的对象之间的耦合,让每个对象管理自己的焦点,
  6. 而不必知道其他对象的激活情况

  7. 应用:
  8. 自制UI,复杂的机关等

  9. =end

  10. module Input
  11.   class << self
  12.     #--------------------------------------------------------------------------
  13.     # ● 返回焦点堆栈
  14.     #--------------------------------------------------------------------------
  15.     def get_focus_stack
  16.       return @focus_stack || @focus_stack = []
  17.     end
  18.     #--------------------------------------------------------------------------
  19.     # ● 返回object是否处于焦点
  20.     #--------------------------------------------------------------------------
  21.     def focus?(object)
  22.       focus = self.get_focus_stack.last
  23.       return focus == nil || focus == object
  24.     end
  25.     #--------------------------------------------------------------------------
  26.     # ● 焦点object
  27.     #--------------------------------------------------------------------------
  28.     def focus(object)
  29.       raise "Input.focus() cannot have nil parameter" if object == nil
  30.       unfocus(object)
  31.       get_focus_stack.push(object)
  32.     end
  33.     #--------------------------------------------------------------------------
  34.     # ● 取消object焦点
  35.     #--------------------------------------------------------------------------
  36.     def unfocus(object)
  37.       raise "Input.unfocus() cannot have nil parameter" if object == nil
  38.       get_focus_stack.reject! do |item|
  39.         item == object
  40.       end
  41.     end
  42.     #--------------------------------------------------------------------------
  43.     # ● 重定义Input方法
  44.     #    Input只会对处于焦点的对象有响应
  45.     #--------------------------------------------------------------------------   
  46.     if @input_focus_old_defined == nil
  47.       %w[press? trigger? repeat?].each do |symbol|
  48.         eval("
  49.           alias :input_focus_old_#{symbol} :#{symbol}
  50.           def #{symbol}(key, object = nil)
  51.             if focus?(object)
  52.               return input_focus_old_#{symbol}(key)
  53.             else
  54.               return false
  55.             end
  56.           end
  57.         ")
  58.       end
  59.       %w[dir4 dir8].each do |symbol|
  60.         eval("
  61.           alias :input_focus_old_#{symbol}  :#{symbol}
  62.           def #{symbol}(object = nil)
  63.             if focus?(object)
  64.               return input_focus_old_#{symbol}()
  65.             else
  66.               return 0
  67.             end
  68.           end
  69.         ")
  70.       end
  71.       @input_focus_old_defined = true
  72.     end
  73.   end
  74. end
复制代码





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