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 来储存事件的金钱, 这个类在存档时也会储存的。
- #==============================================================================
- class Game_System
- #--------------------------------------------------------------------------
- def initialize
- @map_interpreter = Interpreter.new(0, true)
- @battle_interpreter = Interpreter.new(0, false)
- @timer = 0
- @timer_working = false
- @save_disabled = false
- @menu_disabled = false
- @encounter_disabled = false
- @message_position = 2
- @message_frame = 0
- @save_count = 0
- @magic_number = 0
- # 比如生成一个哈希表储存事件金钱。
- @event_gold = {}
- end
- #--------------------------------------------------------------------------
- # 读取事件金钱的定义
- def ev_gold(key)
- # 如果哈希记录中没有该事件,返回 0 。
- return 0 unless @event_gold.keys.include?(key)
- # 返回记录的对应事件的金钱数值。
- return @event_gold[key]
- end
- #--------------------------------------------------------------------------
- # 增减事件金钱的定义
- def add_ev_gold(key, n)
- # 如果有记录,就在原记录上增减。
- if @event_gold.keys.include?(key)
- @event_gold[key] += n
- else
- #如果没有记录,新增加该事件的金钱记录。
- @event_gold[key] = n
- end
- # 校正金钱数值,最小为 0 。
- @event_gold[key] = [@event_gold[key], 0].max
- end
- end
- #--------------------------------------------------------------------------
- # 这样就可以用事件脚本,来读取和增加某个事件的金钱。
- #--------------------------------------------------------------------------
- # 读取:$game_system.ev_gold(key)
- # 括号里的 key ,必须代入一个数组参数:[地图ID, 事件ID]
- # 比如要读取 2 号地图的 32 号事件金钱:$game_system.ev_gold([2,32])
- # 比如要读取 10 号地图的 5 号事件金钱:$game_system.ev_gold([10,5])
- #
- # 增减金钱:$game_system.add_ev_gold(key,n)
- # 括号里的 key 同上, n 为增减的金钱数, 正为加,负为减 。
- # 比如 3 号地图的 12 号事件金钱加8000 :$game_system.add_ev_gold([3,12],8000)
- # 比如 9 号地图的 6 号事件金钱减2000 :$game_system.add_ev_gold([9,6],-2000)
- #==============================================================================
复制代码
上面的脚本可以直接使用。
作者: 梦想始终会醒 时间: 2017-4-25 11:52
感谢大佬回答,但是它好像是读ID的呢.
p 出来是0数值的.
作者: 梦想始终会醒 时间: 2017-4-25 11:53
非常感谢.感谢前辈详细解明.
作者: guoxiaomi 时间: 2017-4-25 12:36
如果是给事件添加一个属性,让这个事件有自己的变量,F1里有这样的内容:
module RPG
class Event
def initialize(x, y)
@id = 0
@name = ""
@x = x
@y = y
@pages = [RPG::Event::Page.new]
end
attr_accessor :id
attr_accessor :name
attr_accessor :x
attr_accessor :y
attr_accessor :pages
end
end
module RPG
class Event
def initialize(x, y)
@id = 0
@name = ""
@x = x
@y = y
@pages = [RPG::Event::Page.new]
end
attr_accessor :id
attr_accessor :name
attr_accessor :x
attr_accessor :y
attr_accessor :pages
end
end
可以清楚的看出事件默认有以下属性:编号id,名称name,坐标x,坐标y,事件页pages
那么只需要添加一个属性gold就行了,由于可能初始化的时候会有问题,所以没有直接用 attr_accessor :gold
module RPG
class Event
def gold
@gold || 0 # 没有设置gold,在第一次调用gold时返回0
end
def gold=(gold)
@gold = gold
end
end
end
module RPG
class Event
def gold
@gold || 0 # 没有设置gold,在第一次调用gold时返回0
end
def gold=(gold)
@gold = gold
end
end
end
现在就可以直接这样用
_gold = $game_map.events[1].gold
$game_map.events[1].gold = 20
_gold = $game_map.events[1].gold
$game_map.events[1].gold = 20
作者: fux2 时间: 2017-4-25 13:16
做这种事情不知道是为了什么,觉得楼主可能走了弯路。
4楼的方法消耗大,但可以储存。
楼上的方法消耗小,不能储存。
但按照楼主的意思应该是读事件的内容,应该是
- cmd = $game_map.events[83].list.find{|e| e.code==125}
- p cmd.parameters[1]==1 ? -cmd.parameters[2] : cmd.parameters[2]
复制代码
作者: 芯☆淡茹水 时间: 2017-4-25 13:42
本帖最后由 芯☆淡茹水 于 2017-4-25 13:59 编辑
加菲猫的这个还缺少关键性的一步
- class Game_Event < Game_Character
- def gold
- return @event.gold
- end
- def gold=(gold)
- @event.gold = gold
- end
- end
复制代码
只是这样做的话,和直接定义在 Game_Event 里面没有多大的区别,
class Game_Event < Game_Character
def gold
return @gold || 0
end
def gold=(gold)
@gold = gold
end
end
class Game_Event < Game_Character
def gold
return @gold || 0
end
def gold=(gold)
@gold = gold
end
end
同样转换地图会重置
因为 Game_Map 里面的一句:@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
如果在第一个脚本里面再加点储存
class Game_Event < Game_Character
def gold
return @event.gold
end
def gold=(gold)
@event.gold = gold
save_data($game_map.map, sprintf("Data/Map%03d.rxdata", $game_map.map_id))
end
end
class Game_Map
def map
return @map
end
end
class Game_Event < Game_Character
def gold
return @event.gold
end
def gold=(gold)
@event.gold = gold
save_data($game_map.map, sprintf("Data/Map%03d.rxdata", $game_map.map_id))
end
end
class Game_Map
def map
return @map
end
end
不知道这样有没效果。但本人觉得动RM的 rxdata 不是很好的选择。
如果默认脚本的 Game_Event 能保存的话,那么默认脚本的 独立开关 就应该定义在 Game_Event 里了,这样省了很多事。
作者: 【蛋塔】 时间: 2017-4-27 22:45
我觉得楼上所有办法都太复杂了,这是我认为最简洁的办法:
用事件脚本:
File.new("01.rxdata","w")
File.new("01.rxdata","w")
以上意思是在游戏工程中新建一个空文件,然后:
save_data\
($game_variables[1],"01.rxdata")
save_data\
($game_variables[1],"01.rxdata")
上面这条事件脚本的意思是:将1号变量存入01.rxdata文件中
再一个就是读取,依旧是事件脚本:
$game_variables[2]=load_data("01.rxdata")
$game_variables[2]=load_data("01.rxdata")
以上意思就是将01文件中的变量取出来,并且存到2号变量中
以上这些思路虽然看起来很简单,但是懂得灵活运用的话 可以做出很多有趣的功能
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |