设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1970|回复: 0
打印 上一主题 下一主题

[RMVA发布] 焦点输入 InputFocus

[复制链接]

Lv1.梦旅人

梦石
0
星屑
65
在线时间
400 小时
注册时间
2005-10-24
帖子
634
跳转到指定楼层
1
发表于 2015-8-12 12:40:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 叶子 于 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
复制代码

点评

Ruby的习惯不是一件事可以有多种方法么……, if object == ()  发表于 2015-8-12 14:30
@天地有正气 的确应该用.nil?  发表于 2015-8-12 13:05
↓看了下用户名,不会真是叶子大吧!  发表于 2015-8-12 13:02
有种诈尸的感觉  发表于 2015-8-12 13:01
34、42可以改成if object.nil?,这样可能更符合Ruby的习惯吧 = =  发表于 2015-8-12 12:59
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-22 13:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表