Project1

标题: 物品调用公共事件的合并——使用物品时输出物品编号 [打印本页]

作者: tk4215342    时间: 2013-5-26 17:11
标题: 物品调用公共事件的合并——使用物品时输出物品编号
本帖最后由 tk4215342 于 2013-6-5 12:31 编辑

个人认为公共事件是用在需要重复多次的批量指令上的。
然而在游戏中,我们常常要通过使用物品实现某些功能,这些功能只需要简单的几个指令,却只能通过调用公共事件来实现,
所以,“宝贵”的公共事件就这样被“浪费”了,用在区区几个简单的指令上。
为了改变这种浪费的现象,本人通过多日的“努力”,研究出了这个脚本,在使用物品时,能把物品编号赋给某个变量,
并且这个赋值是在物品调用公共事件前,所以调用公共事件时就能用这个变量判断调用它的是哪个物品,然后发挥相应的作用。
这样,就可以实现所有物品调用同一公共事件,还能发挥自己的作用
  1. ################################################################################
  2. #●变量编号
  3. ################################################################################
  4. module HGSJ
  5.   #输出的变量编号
  6.   VAR = 1
  7. end
  8. ################################################################################
  9. #●脚本正文
  10. ################################################################################
  11. class Scene_Item
  12.   #--------------------------------------------------------------------------
  13.   # ● 刷新画面 (物品窗口被激活的情况下)
  14.   #--------------------------------------------------------------------------
  15.   def update_item
  16.     # 按下 B 键的情况下
  17.     if Input.trigger?(Input::B)
  18.       # 演奏取消 SE
  19.       $game_system.se_play($data_system.cancel_se)
  20.       # 切换到菜单画面
  21.       $scene = Scene_Menu.new(0)
  22.       return
  23.     end
  24.     # 按下 C 键的情况下
  25.     if Input.trigger?(Input::C)
  26.       # 获取物品窗口当前选中的物品数据
  27.       @item = @item_window.item
  28. ################################################################################
  29.         $game_variables[HGSJ::VAR] = @item.id
  30. ################################################################################
  31.       # 不使用物品的情况下
  32.       unless @item.is_a?(RPG::Item)
  33.         # 演奏冻结 SE
  34.         $game_system.se_play($data_system.buzzer_se)
  35.         return
  36.       end
  37.       # 不能使用的情况下
  38.       unless $game_party.item_can_use?(@item.id)
  39.         # 演奏冻结 SE
  40.         $game_system.se_play($data_system.buzzer_se)
  41.         return
  42.       end
  43.       # 演奏确定 SE
  44.       $game_system.se_play($data_system.decision_se)
  45.       # 效果范围是我方的情况下
  46.       if @item.scope >= 3
  47.         # 激活目标窗口
  48.         @item_window.active = false
  49.         @target_window.x = (@item_window.index + 1) % 2 * 304
  50.         @target_window.visible = true
  51.         @target_window.active = true
  52.         # 设置效果范围 (单体/全体) 的对应光标位置
  53.         if @item.scope == 4 || @item.scope == 6
  54.           @target_window.index = -1
  55.         else
  56.           @target_window.index = 0
  57.         end
  58.       # 效果在我方以外的情况下
  59.       else
  60.         # 公共事件 ID 有效的情况下
  61.         if @item.common_event_id > 0
  62.           # 预约调用公共事件
  63.           $game_temp.common_event_id = @item.common_event_id
  64.           # 演奏物品使用时的 SE
  65.           $game_system.se_play(@item.menu_se)
  66.           # 消耗品的情况下
  67.           if @item.consumable
  68.             # 使用的物品数减 1
  69.             $game_party.lose_item(@item.id, 1)
  70.             # 再描绘物品窗口的z项目
  71.             @item_window.draw_item(@item_window.index)
  72.           end
  73.           # 切换到地图画面
  74.           $scene = Scene_Map.new
  75.           return
  76.         end
  77.       end
  78.       return
  79.     end
  80.   end
  81. end
  82. class Scene_Battle
  83.   #--------------------------------------------------------------------------
  84.   # ● 刷新画面 (角色命令回合 : 选择物品)
  85.   #--------------------------------------------------------------------------
  86.   def update_phase3_item_select
  87.     # 设置物品窗口为可视状态
  88.     @item_window.visible = true
  89.     # 刷新物品窗口
  90.     @item_window.update
  91.     # 按下 B 键的情况下
  92.     if Input.trigger?(Input::B)
  93.       # 演奏取消 SE
  94.       $game_system.se_play($data_system.cancel_se)
  95.       # 选择物品结束
  96.       end_item_select
  97.       return
  98.     end
  99.     # 按下 C 键的情况下
  100.     if Input.trigger?(Input::C)
  101.       # 获取物品窗口现在选择的物品资料
  102.       @item = @item_window.item
  103. ################################################################################
  104.       $game_variables[HGSJ::VAR] = @item.id
  105. ################################################################################
  106.       # 无法使用的情况下
  107.       unless $game_party.item_can_use?(@item.id)
  108.         # 演奏冻结 SE
  109.         $game_system.se_play($data_system.buzzer_se)
  110.         return
  111.       end
  112.       # 演奏确定 SE
  113.       $game_system.se_play($data_system.decision_se)
  114.       # 设置行动
  115.       @active_battler.current_action.item_id = @item.id
  116.       # 设置物品窗口为不可见状态
  117.       @item_window.visible = false
  118.       # 效果范围是敌单体的情况下
  119.       if @item.scope == 1
  120.         # 开始选择敌人
  121.         start_enemy_select
  122.       # 效果范围是我方单体的情况下
  123.       elsif @item.scope == 3 or @item.scope == 5
  124.         # 开始选择角色
  125.         start_actor_select
  126.       # 效果范围不是单体的情况下
  127.       else
  128.         # 物品选择结束
  129.         end_item_select
  130.         # 转到下一位角色的指令输入
  131.         phase3_next_actor
  132.       end
  133.       return
  134.     end
  135.   end
  136. end
复制代码
发现bug:无目标的物品的编号无法输出,现已解决,代码已更新。

再附上两张图吧

如果认为这个脚本太麻烦,可以参阅5楼对默认脚本进行修改,可实现相同效果。

QQ截图20130529175742.png (24.89 KB, 下载次数: 23)

调用的事件

调用的事件

QQ截图20130529180230.png (93.4 KB, 下载次数: 21)

使用“补品”

使用“补品”

Project2.zip

206.8 KB, 下载次数: 93

范例


作者: tk4215342    时间: 2013-5-26 17:22
@英顺的马甲 如果是“平时使用”,也有效吗?
作者: 英顺的马甲    时间: 2013-5-26 17:27
tk4215342 发表于 2013-5-26 17:22
@英顺的马甲 如果是“平时使用”,也有效吗?

平时使用=菜单中+战斗中
使用时都必须选择一个角色或敌人作为对象,
而角色和敌人都是归类于Game_Battler,
而Game_Battler对于物品效果的处理就是effect_item。
作者: chd114    时间: 2013-6-2 15:53
其实这东西在RMXP的魔塔样板中很早就有了···而且比你这还方便
作者: tk4215342    时间: 2013-6-5 12:23
chd114 发表于 2013-6-2 15:53
其实这东西在RMXP的魔塔样板中很早就有了···而且比你这还方便

其实是相同的原理,只不过我是把它做成了外挂脚本,方便别人使用,而魔塔样板中是内置的。
总之,这个脚本相当简单,学过脚本的一眼就能看出原理,然后在自己的工程中制造出相同效果,和你说的魔塔样板一样方便。
另外,我是在看到魔塔的集成式公共事件后,才产生合并公共事件的想法。
不过,我可没剽窃魔塔样板的脚本,这个脚本是我自己弄出来的。
还有,有兴趣的可以在脚本编辑器搜索到@item = @item_window.item(所有脚本中有两个),在这句后面加上$game_variables[变量编号] = @item.id,就能产生与这个脚本相同的效果了。
作者: chd114    时间: 2013-6-5 15:03
tk4215342 发表于 2013-6-5 12:23
其实是相同的原理,只不过我是把它做成了外挂脚本,方便别人使用,而魔塔样板中是内置的。
总之,这个脚 ...

技能也是同理···我做的魔塔样板5161中的技能也是用这种方式做的




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