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

Project1

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

快进游戏

[复制链接]

…あたしは天使なんかじゃないわ

梦石
0
星屑
2207
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

跳转到指定楼层
1
发表于 2015-2-4 18:43:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 taroxd 于 2015-2-10 14:44 编辑

RUBY 代码复制
  1. #----------------------------------------------------------------------------
  2. # ● 快进游戏
  3. #----------------------------------------------------------------------------
  4. #
  5. #  使用方法:
  6. #    Taroxd::FastForward.call(frame, *keys)
  7. #      跳过 frame 帧。keys 为这 frame 帧按下的按键。
  8. #      每一帧都视为重新按下按键。
  9. #
  10. #    示例:
  11. #      Taroxd::FastForward.call(999, :C)
  12. #        跳过 999 帧。每帧都视为重新按下确定键。
  13. #
  14. #----------------------------------------------------------------------------
  15.  
  16. module Taroxd
  17.  
  18.   dirs = {DOWN: 2, LEFT: 4, RIGHT: 6, UP: 8}
  19.  
  20.   # 获取 dir4, dir8。
  21.   # 与 Input.dir4, Input.dir8 不同的是,没有方向键按下时会返回 5, 5。
  22.   dir_4_8 = lambda do |keys|
  23.     dir8 = dirs.inject(5) do |dir, (key, value)|
  24.       keys.include?(key) ? dir + value - 5 : dir
  25.     end
  26.  
  27.     return dir8, dir8 if [2, 4, 5, 6, 8].include?(dir8)
  28.     keys.reverse_each { |key| return dirs[key], dir8 if dirs[key] }
  29.     [5, 5] # 理论上不会执行
  30.   end
  31.  
  32.   FastForward = lambda do |frame, *keys|
  33.     # 保留原方法的哈希表
  34.     # 方法名(Symbol)为键,method 对象为值
  35.     graphics_methods = {}
  36.     input_methods = {}
  37.  
  38.     # 重定义 Graphics 的方法
  39.     define_graphics_method = lambda do |name, &block|
  40.       graphics_methods[name] = Graphics.method(name)
  41.       Graphics.define_singleton_method(name, block)
  42.     end
  43.  
  44.     # 重定义 Input 的方法
  45.     define_input_method = lambda do |name, &block|
  46.       input_methods[name] = Input.method(name)
  47.       Input.define_singleton_method(name, block)
  48.     end
  49.  
  50.     # 将方法恢复到原先的状态
  51.     restore = lambda do
  52.       input_methods.each do |name, method|
  53.         Input.define_singleton_method(name, method)
  54.       end
  55.       graphics_methods.each do |name, method|
  56.         Graphics.define_singleton_method(name, method)
  57.       end
  58.     end
  59.  
  60.     # 重定义 dir4, dir8 方法。value:方法的返回值
  61.     define_dir_method = lambda do |name, value|
  62.       define_input_method.call(name) { value } unless value == 5
  63.     end
  64.  
  65.     # 重定义持续一段时间的 Graphics 模块方法。effect:该方法的副作用
  66.     define_duration_method = lambda do |name, &effect|
  67.       define_graphics_method.call name do |*args|
  68.         duration = args.first || 1
  69.         if frame < duration
  70.           restore.call
  71.           send name, *args
  72.         else
  73.           frame -= duration
  74.           effect.call(*args) if effect
  75.           nil
  76.         end
  77.       end
  78.     end
  79.  
  80.     unless keys.empty?
  81.       [:trigger?, :press?, :repeat?].each do |name|
  82.         define_input_method.call(name) { |key| keys.include?(key) }
  83.       end
  84.     end
  85.  
  86.     dir4, dir8 = dir_4_8.call(keys)
  87.     define_dir_method.call(:dir4, dir4)
  88.     define_dir_method.call(:dir8, dir8)
  89.     define_graphics_method.call(:freeze) {}
  90.     define_duration_method.call :update
  91.     define_duration_method.call :wait
  92.     define_duration_method.call(:fadeout) { self.brightness = 0 }
  93.     define_duration_method.call(:fadein) { self.brightness = 255 }
  94.     define_duration_method.call :transition do
  95.       graphics_methods[:transition].call(0)
  96.     end
  97.   end
  98. end
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

GMT+8, 2024-5-1 18:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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