赞 | 68 |
VIP | 397 |
好人卡 | 580 |
积分 | 22 |
经验 | 311270 |
最后登录 | 2022-3-9 |
在线时间 | 4033 小时 |
…あたしは天使なんかじゃないわ
- 梦石
- 0
- 星屑
- 2208
- 在线时间
- 4033 小时
- 注册时间
- 2010-10-4
- 帖子
- 10779
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 taroxd 于 2015-2-10 14:44 编辑
#---------------------------------------------------------------------------- # ● 快进游戏 #---------------------------------------------------------------------------- # # 使用方法: # Taroxd::FastForward.call(frame, *keys) # 跳过 frame 帧。keys 为这 frame 帧按下的按键。 # 每一帧都视为重新按下按键。 # # 示例: # Taroxd::FastForward.call(999, :C) # 跳过 999 帧。每帧都视为重新按下确定键。 # #---------------------------------------------------------------------------- module Taroxd dirs = {DOWN: 2, LEFT: 4, RIGHT: 6, UP: 8} # 获取 dir4, dir8。 # 与 Input.dir4, Input.dir8 不同的是,没有方向键按下时会返回 5, 5。 dir_4_8 = lambda do |keys| dir8 = dirs.inject(5) do |dir, (key, value)| keys.include?(key) ? dir + value - 5 : dir end return dir8, dir8 if [2, 4, 5, 6, 8].include?(dir8) keys.reverse_each { |key| return dirs[key], dir8 if dirs[key] } [5, 5] # 理论上不会执行 end FastForward = lambda do |frame, *keys| # 保留原方法的哈希表 # 方法名(Symbol)为键,method 对象为值 graphics_methods = {} input_methods = {} # 重定义 Graphics 的方法 define_graphics_method = lambda do |name, &block| graphics_methods[name] = Graphics.method(name) Graphics.define_singleton_method(name, block) end # 重定义 Input 的方法 define_input_method = lambda do |name, &block| input_methods[name] = Input.method(name) Input.define_singleton_method(name, block) end # 将方法恢复到原先的状态 restore = lambda do input_methods.each do |name, method| Input.define_singleton_method(name, method) end graphics_methods.each do |name, method| Graphics.define_singleton_method(name, method) end end # 重定义 dir4, dir8 方法。value:方法的返回值 define_dir_method = lambda do |name, value| define_input_method.call(name) { value } unless value == 5 end # 重定义持续一段时间的 Graphics 模块方法。effect:该方法的副作用 define_duration_method = lambda do |name, &effect| define_graphics_method.call name do |*args| duration = args.first || 1 if frame < duration restore.call send name, *args else frame -= duration effect.call(*args) if effect nil end end end unless keys.empty? [:trigger?, :press?, :repeat?].each do |name| define_input_method.call(name) { |key| keys.include?(key) } end end dir4, dir8 = dir_4_8.call(keys) define_dir_method.call(:dir4, dir4) define_dir_method.call(:dir8, dir8) define_graphics_method.call(:freeze) {} define_duration_method.call :update define_duration_method.call :wait define_duration_method.call(:fadeout) { self.brightness = 0 } define_duration_method.call(:fadein) { self.brightness = 255 } define_duration_method.call :transition do graphics_methods[:transition].call(0) end end end
#----------------------------------------------------------------------------
# ● 快进游戏
#----------------------------------------------------------------------------
#
# 使用方法:
# Taroxd::FastForward.call(frame, *keys)
# 跳过 frame 帧。keys 为这 frame 帧按下的按键。
# 每一帧都视为重新按下按键。
#
# 示例:
# Taroxd::FastForward.call(999, :C)
# 跳过 999 帧。每帧都视为重新按下确定键。
#
#----------------------------------------------------------------------------
module Taroxd
dirs = {DOWN: 2, LEFT: 4, RIGHT: 6, UP: 8}
# 获取 dir4, dir8。
# 与 Input.dir4, Input.dir8 不同的是,没有方向键按下时会返回 5, 5。
dir_4_8 = lambda do |keys|
dir8 = dirs.inject(5) do |dir, (key, value)|
keys.include?(key) ? dir + value - 5 : dir
end
return dir8, dir8 if [2, 4, 5, 6, 8].include?(dir8)
keys.reverse_each { |key| return dirs[key], dir8 if dirs[key] }
[5, 5] # 理论上不会执行
end
FastForward = lambda do |frame, *keys|
# 保留原方法的哈希表
# 方法名(Symbol)为键,method 对象为值
graphics_methods = {}
input_methods = {}
# 重定义 Graphics 的方法
define_graphics_method = lambda do |name, &block|
graphics_methods[name] = Graphics.method(name)
Graphics.define_singleton_method(name, block)
end
# 重定义 Input 的方法
define_input_method = lambda do |name, &block|
input_methods[name] = Input.method(name)
Input.define_singleton_method(name, block)
end
# 将方法恢复到原先的状态
restore = lambda do
input_methods.each do |name, method|
Input.define_singleton_method(name, method)
end
graphics_methods.each do |name, method|
Graphics.define_singleton_method(name, method)
end
end
# 重定义 dir4, dir8 方法。value:方法的返回值
define_dir_method = lambda do |name, value|
define_input_method.call(name) { value } unless value == 5
end
# 重定义持续一段时间的 Graphics 模块方法。effect:该方法的副作用
define_duration_method = lambda do |name, &effect|
define_graphics_method.call name do |*args|
duration = args.first || 1
if frame < duration
restore.call
send name, *args
else
frame -= duration
effect.call(*args) if effect
nil
end
end
end
unless keys.empty?
[:trigger?, :press?, :repeat?].each do |name|
define_input_method.call(name) { |key| keys.include?(key) }
end
end
dir4, dir8 = dir_4_8.call(keys)
define_dir_method.call(:dir4, dir4)
define_dir_method.call(:dir8, dir8)
define_graphics_method.call(:freeze) {}
define_duration_method.call :update
define_duration_method.call :wait
define_duration_method.call(:fadeout) { self.brightness = 0 }
define_duration_method.call(:fadein) { self.brightness = 255 }
define_duration_method.call :transition do
graphics_methods[:transition].call(0)
end
end
end
|
|