Project1
标题:
谢谢!明白如何Update了 可惜代码还是出错
[打印本页]
作者:
kula1900
时间:
2010-12-11 19:13
标题:
谢谢!明白如何Update了 可惜代码还是出错
本帖最后由 kula1900 于 2010-12-11 19:57 编辑
module Graphics
alias oldupdate update
def update
oldupdate
$game_bass.update()
end
end
提示错误!
作者:
IamI
时间:
2010-12-11 19:39
直接挂Graphics的update里即可……
开线程的话用Thread类
作者:
kula1900
时间:
2010-12-11 19:43
恩啊!谢谢啦 在写 BASS模块 能吧 BGM 减掉 支持OGG只要有解码器的话 呵呵!
kula1900于2010-12-11 19:55补充以下内容:
那在弱弱的问下 为啥这样不行哟
module Graphics
alias oldupdate update
def update
oldupdate
$game_bass.update()
end
end
作者:
苏小脉
时间:
2010-12-11 21:51
本帖最后由 苏小脉 于 2010-12-12 09:09 编辑
回复
kula1900
的帖子
因为在模块上下文中用 alias 通过符号查找方法的时候,其接收端是模块的实例上下文(模块实例的上下文,而不是模块对象的单例上下文。当然模块不能有实例,但这个模块实例上下文却可以和其后定义的 class 进行 mixin 后重新建立)。Graphics.update 这个方法是 Graphics 的模块方法,严谨地说是 Graphics 这个 Module 对象的单例方法,故而属于 Graphics 模块对象的单例上下文(模块上下文),所以在 Graphics 的实例上下文中是找不到 update 的。
你可以通过 Ruby 匿名单例类的语法去重新获取 Graphics 的单例上下文:
class << Graphics
alias oldupdate update
def update
oldupdate
$game_bass.update()
end
end
复制代码
除此之外还有些别的途径,利用 Object#instance_eval 也可以重新获取 Graphics 模块对象的单例上下文:
Graphics.instance_eval do
alias oldupdate update
def update
oldupdate
$game_bass.update()
end
end
复制代码
你还可以通过 Object#method 方法去获取并绑定一个模块、类的单例方法对象(Method 对象),然后在 update 中通过 Method#call 调用。Object#method 之所以能获取到 update,是因为 Object#method 可以任意指定接收者,而如果在模块上下文中,不指定接收者就默认为 self(模块对象本身)了。要注意在定义方法时必须要显示指定 self (或直接指定 Graphics)表明是定义模块对象单例方法。
module Graphics
@@oldupdate = method(:update)
def self.update
@@oldupdate.call
$game_bass.update()
end
end
复制代码
或者:
@@oldupdate = Graphics.method(:update)
def Graphics.update
@@oldupdate.call
$game_bass.update()
end
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1