Project1

标题: 【脚本求助】如何获取变量的数值? [打印本页]

作者: 梦想始终会醒    时间: 2017-4-25 11:05
标题: 【脚本求助】如何获取变量的数值?
小弟在写脚本遇有一事不明.
就是如何在脚本中获取事件变量数值
如在事件定义一个变量.  
(ID名称83)金钱 = 9000(常量)

如何在脚本中获取事件83金钱的常量?   
麻烦了各位请教了.
@芯☆淡茹水
作者: 梦想始终会醒    时间: 2017-4-25 11:29
这么复杂? 那是否还有别种方法来代替呢?

@芯☆淡茹水
作者: soulsaga    时间: 2017-4-25 11:37
$game_variables[83]
作者: 芯☆淡茹水    时间: 2017-4-25 11:49
本帖最后由 芯☆淡茹水 于 2017-4-25 11:51 编辑

比如下面我们可以用 Game_System 来储存事件的金钱, 这个类在存档时也会储存的。

  1. #==============================================================================
  2. class Game_System
  3.   #--------------------------------------------------------------------------
  4.   def initialize
  5.     @map_interpreter = Interpreter.new(0, true)
  6.     @battle_interpreter = Interpreter.new(0, false)
  7.     @timer = 0
  8.     @timer_working = false
  9.     @save_disabled = false
  10.     @menu_disabled = false
  11.     @encounter_disabled = false
  12.     @message_position = 2
  13.     @message_frame = 0
  14.     @save_count = 0
  15.     @magic_number = 0
  16.     # 比如生成一个哈希表储存事件金钱。
  17.     @event_gold = {}
  18.   end
  19.   #--------------------------------------------------------------------------
  20.   # 读取事件金钱的定义
  21.   def ev_gold(key)
  22.     # 如果哈希记录中没有该事件,返回 0 。
  23.     return 0 unless @event_gold.keys.include?(key)
  24.     # 返回记录的对应事件的金钱数值。
  25.     return @event_gold[key]
  26.   end
  27.   #--------------------------------------------------------------------------
  28.   # 增减事件金钱的定义
  29.   def add_ev_gold(key, n)
  30.     # 如果有记录,就在原记录上增减。
  31.     if @event_gold.keys.include?(key)
  32.       @event_gold[key] += n
  33.     else
  34.       #如果没有记录,新增加该事件的金钱记录。
  35.       @event_gold[key] = n
  36.     end
  37.     # 校正金钱数值,最小为 0 。
  38.     @event_gold[key] = [@event_gold[key], 0].max
  39.   end
  40. end
  41. #--------------------------------------------------------------------------
  42. # 这样就可以用事件脚本,来读取和增加某个事件的金钱。
  43. #--------------------------------------------------------------------------
  44. # 读取:$game_system.ev_gold(key)
  45. #       括号里的 key ,必须代入一个数组参数:[地图ID, 事件ID]
  46. #       比如要读取 2 号地图的 32 号事件金钱:$game_system.ev_gold([2,32])
  47. #       比如要读取 10 号地图的 5 号事件金钱:$game_system.ev_gold([10,5])
  48. #
  49. # 增减金钱:$game_system.add_ev_gold(key,n)
  50. #       括号里的 key 同上, n 为增减的金钱数, 正为加,负为减 。
  51. #       比如 3 号地图的 12 号事件金钱加8000 :$game_system.add_ev_gold([3,12],8000)
  52. #       比如 9 号地图的 6 号事件金钱减2000 :$game_system.add_ev_gold([9,6],-2000)
  53. #==============================================================================
复制代码


上面的脚本可以直接使用。
作者: 梦想始终会醒    时间: 2017-4-25 11:52
soulsaga 发表于 2017-4-25 11:37
$game_variables[83]

感谢大佬回答,但是它好像是读ID的呢.
p 出来是0数值的.
作者: 梦想始终会醒    时间: 2017-4-25 11:53
芯☆淡茹水 发表于 2017-4-25 11:49
比如下面我们可以用 Game_System 来储存事件的金钱, 这个类在存档时也会储存的。

非常感谢.感谢前辈详细解明.
作者: guoxiaomi    时间: 2017-4-25 12:36
如果是给事件添加一个属性,让这个事件有自己的变量,F1里有这样的内容:
RUBY 代码复制
  1. module RPG
  2.   class Event
  3.     def initialize(x, y)
  4.       @id = 0
  5.       @name = ""
  6.       @x = x
  7.       @y = y
  8.       @pages = [RPG::Event::Page.new]
  9.     end
  10.     attr_accessor :id
  11.     attr_accessor :name
  12.     attr_accessor :x
  13.     attr_accessor :y
  14.     attr_accessor :pages
  15.   end
  16. end

可以清楚的看出事件默认有以下属性:编号id,名称name,坐标x,坐标y,事件页pages
那么只需要添加一个属性gold就行了,由于可能初始化的时候会有问题,所以没有直接用 attr_accessor :gold
RUBY 代码复制
  1. module RPG
  2.   class Event
  3.     def gold
  4.       @gold || 0 # 没有设置gold,在第一次调用gold时返回0
  5.     end
  6.     def gold=(gold)
  7.      @gold = gold
  8.     end
  9.   end
  10. end

现在就可以直接这样用
RUBY 代码复制
  1. _gold = $game_map.events[1].gold
  2. $game_map.events[1].gold = 20

作者: fux2    时间: 2017-4-25 13:16
做这种事情不知道是为了什么,觉得楼主可能走了弯路。
4楼的方法消耗大,但可以储存。
楼上的方法消耗小,不能储存。

但按照楼主的意思应该是读事件的内容,应该是
  1. cmd = $game_map.events[83].list.find{|e| e.code==125}
  2. p cmd.parameters[1]==1 ? -cmd.parameters[2] : cmd.parameters[2]
复制代码


作者: 芯☆淡茹水    时间: 2017-4-25 13:42
本帖最后由 芯☆淡茹水 于 2017-4-25 13:59 编辑

加菲猫的这个还缺少关键性的一步
  1. class Game_Event < Game_Character
  2.   def gold
  3.     return @event.gold
  4.   end
  5.   def gold=(gold)
  6.     @event.gold = gold
  7.   end
  8. end
复制代码


只是这样做的话,和直接定义在 Game_Event 里面没有多大的区别,

RUBY 代码复制
  1. class Game_Event < Game_Character
  2.   def gold
  3.     return @gold || 0
  4.   end
  5.   def gold=(gold)
  6.     @gold = gold
  7.   end
  8. end

同样转换地图会重置
因为 Game_Map 里面的一句:@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))

如果在第一个脚本里面再加点储存

RUBY 代码复制
  1. class Game_Event < Game_Character
  2.   def gold
  3.     return @event.gold
  4.   end
  5.   def gold=(gold)
  6.     @event.gold = gold
  7.     save_data($game_map.map, sprintf("Data/Map%03d.rxdata", $game_map.map_id))
  8.   end
  9. end
  10. class Game_Map
  11.   def map
  12.     return @map
  13.   end
  14. end

不知道这样有没效果。但本人觉得动RM的 rxdata 不是很好的选择。


如果默认脚本的 Game_Event  能保存的话,那么默认脚本的 独立开关 就应该定义在 Game_Event 里了,这样省了很多事。
作者: 【蛋塔】    时间: 2017-4-27 22:45
我觉得楼上所有办法都太复杂了,这是我认为最简洁的办法:

用事件脚本:
RUBY 代码复制
  1. File.new("01.rxdata","w")

以上意思是在游戏工程中新建一个空文件,然后:
RUBY 代码复制
  1. save_data\
  2. ($game_variables[1],"01.rxdata")

上面这条事件脚本的意思是:将1号变量存入01.rxdata文件中
再一个就是读取,依旧是事件脚本:
RUBY 代码复制
  1. $game_variables[2]=load_data("01.rxdata")


以上意思就是将01文件中的变量取出来,并且存到2号变量中
以上这些思路虽然看起来很简单,但是懂得灵活运用的话 可以做出很多有趣的功能




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