Project1

标题: 请教一下有关module的赋值操作。 [打印本页]

作者: 文雅夕露    时间: 2018-3-10 18:06
标题: 请教一下有关module的赋值操作。
比如这样写:
module A
age = 10
end
以上是module模块的一个数值。
我想在按键的时候改变他。
如下:
if Input.trigger?(Input::RIGHT)
  age = - age
  end
if Input.trigger?(Input::LEFT)
  age = age
  end
发现会出现语法错误。
请问该怎么样在场景里改变module模块里的数值?
作者: 张咚咚    时间: 2018-3-10 18:39
module A
  AGE = 10
end
A::AGE = 50
作者: 文雅夕露    时间: 2018-3-10 18:40
@SailCat
不行的说...
这么改会出现类型错误的。

作者: SixRC    时间: 2018-3-10 18:46
RUBY 代码复制
  1. module A
  2.   module_function
  3.   @a=1
  4.   def a
  5.     @a
  6.   end
  7.   def a=(a)
  8.     @a=a
  9.   end
  10. end
  11. p A.a
  12. A.a=2
  13. p A.a

或者
RUBY 代码复制
  1. module A
  2.   @a=1
  3. end
  4. class << A
  5.   def a
  6.     @a
  7.   end
  8.   def a=(a)
  9.     @a=a
  10.   end
  11. end
  12. p A.a
  13. A.a=2
  14. p A.a

模块也是实例变量
不过又有类的特殊性
你要去定义方法去取得实例变量的属性
第二个例子不能在 class << A 下面直接对 @a 赋值
是因为那个时候在虚拟类中 有点像一般类下的操作 你写 @a 不是自己的 @a 虽然虚拟类不能实例化 不信你试试
但是方法定义却又的的确确是自己用而不是实例化变量用的方法
有点乱吧 我也有点乱 可能说的不好或不对
请见谅
作者: 文雅夕露    时间: 2018-3-10 18:53
SixRC 发表于 2018-3-10 18:46
module A
  module_function
  @a=1

就是说要定义了才能在class内部给实例赋值咯?
我想在class里的update的按键处理下改变他的值。
并且在整体脚本运行中,马上实现改变他的值呈现的效果。
作者: 文雅夕露    时间: 2018-3-10 19:43
本帖最后由 文雅夕露 于 2018-3-10 19:46 编辑

RUBY 代码复制
  1. module Actor
  2.   module_function
  3.   @angle= 10
  4. end
  5.  
  6. def angle
  7.     @angle
  8.   end
  9.  
  10.   def angle=(angle)
  11.    @angle = angle
  12.   end
  13.  
  14. class Scene_A
  15. def main
  16.         @magic2= Sprite.new
  17.           @magic2.bitmap = RPG::Cache.picture("magic")
  18.     # 执行过渡
  19.     Graphics.transition
  20.     # 主循环
  21.     loop do
  22.      @magic.angle +=@angle
  23.       # 刷新游戏画面
  24.       Graphics.update
  25.       # 刷新输入信息
  26.       Input.update
  27.       # 刷新画面
  28.       update
  29.       # 如果切换画面就中断循环
  30.       if $scene != self
  31.         break
  32.       end
  33.     end
  34.     # 准备过渡
  35.     Graphics.freeze
  36.     # 释放窗口
  37.    @magic2.dispose
  38.     @magic2.bitmap.dispose
  39.   end
  40. #--------------------------------------------------------------------------
  41.   # ●刷新
  42.   #--------------------------------------------------------------------------
  43.   def update
  44.   #--------------------------------------------------------------------------
  45.   # ●按左时
  46.   #--------------------------------------------------------------------------
  47.    if Input.trigger?(Input::LEFT)
  48.     $game_system.se_play($data_system.cursor_se)
  49.    @angle = -@angle
  50.     return
  51.   end
  52.   #--------------------------------------------------------------------------
  53.   # ●按右时
  54.   #--------------------------------------------------------------------------
  55.    if Input.trigger?(Input::RIGHT)
  56.     $game_system.se_play($data_system.cursor_se)
  57.     @angle = @angle
  58.     return
  59.   end
  60. end


以上是脚本
@SixRC
作者: SixRC    时间: 2018-3-10 19:55
文雅夕露 发表于 2018-3-10 19:43
module Actor
  module_function
  @angle= 10

首先 module_function 表示下面定义的方法是单体方法 即它自己的而不是拿来继承的
并且这句语句不需要 end
其次 你的 angle 和 angle= 定义到哪里去了.. 没定义到模块里
再次 如我所例 你应该以 Module.xxx 来得到或改变某属性
最次 你最下面少了个 end?
嗯 先理解语法 再写脚本啦 不要急于求成
作者: SixRC    时间: 2018-3-10 20:19
本帖最后由 SixRC 于 2018-3-10 20:23 编辑
文雅夕露 发表于 2018-3-10 19:43
module Actor
  module_function
  @angle= 10


RUBY 代码复制
  1. module Actor
  2.   @angle = 10 # 这句话在 module_function 之前或之后都是没关系的
  3.   module_function #改变了此后定义的方法的属性
  4.   def angle
  5.     @angle
  6.   end
  7.   def angle=(angle)
  8.     @angle = angle
  9.   end
  10. end
  11. class Scene_A
  12.   def main
  13.     @magic2 = Sprite.new
  14.     @magic2.bitmap = RPG::Cache.picture("magic")
  15.     # 执行过渡
  16.     Graphics.transition
  17.     # 主循环
  18.     loop do
  19.       @magic.angle += Actor.angle
  20.       # 刷新游戏画面
  21.       Graphics.update
  22.       # 刷新输入信息
  23.       Input.update
  24.       # 刷新画面
  25.       update
  26.       # 如果切换画面就中断循环
  27.       # 此处也可以为 break if $scene != self 大概看喜好?
  28.       if $scene != self
  29.         break
  30.       end
  31.     end
  32.     # 准备过渡
  33.     Graphics.freeze
  34.     # 释放窗口
  35.     @magic2.dispose
  36.     @magic2.bitmap.dispose
  37.   end
  38. #--------------------------------------------------------------------------
  39.   # ●刷新
  40.   #--------------------------------------------------------------------------
  41.   def update
  42.   #--------------------------------------------------------------------------
  43.   # ●按左时
  44.   #--------------------------------------------------------------------------
  45.     if Input.trigger?(Input::LEFT)
  46.       $game_system.se_play($data_system.cursor_se)
  47.       # 这里你想表达按左就变负值吧?
  48.       Actor.angle = -Actor.angle.abs
  49.       # 末尾的 return 是可以省略的 默认传回最后的值
  50.       # 不需要传回值的情况也不需要特意的 return
  51.     end
  52.   #--------------------------------------------------------------------------
  53.   # ●按右时
  54.   #--------------------------------------------------------------------------
  55.     if Input.trigger?(Input::RIGHT)
  56.       $game_system.se_play($data_system.cursor_se)
  57.       Actor.angle = Actor.angle.abs
  58.     end
  59.   end
  60. end





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