个人认为公共事件是用在需要重复多次的批量指令上的。
然而在游戏中,我们常常要通过使用物品实现某些功能,这些功能只需要简单的几个指令,却只能通过调用公共事件来实现,
所以,“宝贵”的公共事件就这样被“浪费”了,用在区区几个简单的指令上。
为了改变这种浪费的现象,本人通过多日的“努力”,研究出了这个脚本,在使用物品时,能把物品编号赋给某个变量,
并且这个赋值是在物品调用公共事件前,所以调用公共事件时就能用这个变量判断调用它的是哪个物品,然后发挥相应的作用。
这样,就可以实现所有物品调用同一公共事件,还能发挥自己的作用
- #################################################################################●变量编号################################################################################module HGSJ #输出的变量编号 VAR = 1end#################################################################################●脚本正文################################################################################class Scene_Item #-------------------------------------------------------------------------- # ● 刷新画面 (物品窗口被激活的情况下) #-------------------------------------------------------------------------- def update_item # 按下 B 键的情况下 if Input.trigger?(Input::B) # 演奏取消 SE $game_system.se_play($data_system.cancel_se) # 切换到菜单画面 $scene = Scene_Menu.new(0) return end # 按下 C 键的情况下 if Input.trigger?(Input::C) # 获取物品窗口当前选中的物品数据 @item = @item_window.item################################################################################ $game_variables[HGSJ::VAR] = @item.id################################################################################ # 不使用物品的情况下 unless @item.is_a?(RPG::Item) # 演奏冻结 SE $game_system.se_play($data_system.buzzer_se) return end # 不能使用的情况下 unless $game_party.item_can_use?(@item.id) # 演奏冻结 SE $game_system.se_play($data_system.buzzer_se) return end # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 效果范围是我方的情况下 if @item.scope >= 3 # 激活目标窗口 @item_window.active = false @target_window.x = (@item_window.index + 1) % 2 * 304 @target_window.visible = true @target_window.active = true # 设置效果范围 (单体/全体) 的对应光标位置 if @item.scope == 4 || @item.scope == 6 @target_window.index = -1 else @target_window.index = 0 end # 效果在我方以外的情况下 else # 公共事件 ID 有效的情况下 if @item.common_event_id > 0 # 预约调用公共事件 $game_temp.common_event_id = @item.common_event_id # 演奏物品使用时的 SE $game_system.se_play(@item.menu_se) # 消耗品的情况下 if @item.consumable # 使用的物品数减 1 $game_party.lose_item(@item.id, 1) # 再描绘物品窗口的z项目 @item_window.draw_item(@item_window.index) end # 切换到地图画面 $scene = Scene_Map.new return end end return end endendclass Scene_Battle #-------------------------------------------------------------------------- # ● 刷新画面 (角色命令回合 : 选择物品) #-------------------------------------------------------------------------- def update_phase3_item_select # 设置物品窗口为可视状态 @item_window.visible = true # 刷新物品窗口 @item_window.update # 按下 B 键的情况下 if Input.trigger?(Input::B) # 演奏取消 SE $game_system.se_play($data_system.cancel_se) # 选择物品结束 end_item_select return end # 按下 C 键的情况下 if Input.trigger?(Input::C) # 获取物品窗口现在选择的物品资料 @item = @item_window.item################################################################################ $game_variables[HGSJ::VAR] = @item.id################################################################################ # 无法使用的情况下 unless $game_party.item_can_use?(@item.id) # 演奏冻结 SE $game_system.se_play($data_system.buzzer_se) return end # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 设置行动 @active_battler.current_action.item_id = @item.id # 设置物品窗口为不可见状态 @item_window.visible = false # 效果范围是敌单体的情况下 if @item.scope == 1 # 开始选择敌人 start_enemy_select # 效果范围是我方单体的情况下 elsif @item.scope == 3 or @item.scope == 5 # 开始选择角色 start_actor_select # 效果范围不是单体的情况下 else # 物品选择结束 end_item_select # 转到下一位角色的指令输入 phase3_next_actor end return end endend复制代码
复制代码发现bug:无目标的物品的编号无法输出,现已解决,代码已更新。
再附上两张图吧
如果认为这个脚本太麻烦,可以参阅5楼对默认脚本进行修改,可实现相同效果。
本帖来自P1论坛作者tk4215342,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:
https://rpg.blue/forum.php?mod=viewthread&tid=312878 若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。