Project1

标题: 技能书 修改Scene_Item [打印本页]

作者: zhouzhuofan1    时间: 2013-12-28 20:14
标题: 技能书 修改Scene_Item
本帖最后由 zhouzhuofan1 于 2013-12-28 20:27 编辑
经常会看到有人问RMXP的技能书的技能书怎么制作,回答经常是状态法,但是,如果角色很多的话,用状态法实在太麻烦了,所以就有了这个脚本。

看到@天地有正气 写了个有关技能书的脚本,于是嘛。。。
我也动手写了个。。。思路不同。。。
用法:
替换原来的Scene_Item
"技能书"物品的分散度为 100
SP 回复量 为 所学习技能的 ID
如果还是不会的话请看楼下截图或范例。。。
先上脚本(脚本修改的地方前面带“★”、“☆”):
  1. #==============================================================================
  2. # ■ Scene_Item
  3. #------------------------------------------------------------------------------
  4. #  处理物品画面的类。
  5. #   "技能书"物品的分散度为 100
  6. #   SP 回复量 为 所学习技能的 ID
  7. #   ━━By zx56783586
  8. #==============================================================================
  9. class Scene_Item
  10.   #--------------------------------------------------------------------------
  11.   # ● 主处理
  12.   #--------------------------------------------------------------------------
  13.   def main
  14.     # 生成帮助窗口、物品窗口
  15.     @help_window = Window_Help.new
  16.     @item_window = Window_Item.new
  17.     # 关联帮助窗口
  18.     @item_window.help_window = @help_window
  19.     # 生成目标窗口 (设置为不可见・不活动)
  20.     @target_window = Window_Target.new
  21.     @target_window.visible = false
  22.     @target_window.active = false
  23.     # 执行过度
  24.     Graphics.transition
  25.     # 主循环
  26.     loop do
  27.       # 刷新游戏画面
  28.       Graphics.update
  29.       # 刷新输入信息
  30.       Input.update
  31.       # 刷新画面
  32.       update
  33.       # 如果画面切换就中断循环
  34.       if $scene != self
  35.         break
  36.       end
  37.     end
  38.     # 装备过渡
  39.     Graphics.freeze
  40.     # 释放窗口
  41.     @help_window.dispose
  42.     @item_window.dispose
  43.     @target_window.dispose
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● 刷新画面
  47.   #--------------------------------------------------------------------------
  48.   def update
  49.     # 刷新窗口
  50.     @help_window.update
  51.     @item_window.update
  52.     @target_window.update
  53.     # 物品窗口被激活的情况下: 调用 update_item
  54.     if @item_window.active
  55.       update_item
  56.       return
  57.     end
  58.     # 目标窗口被激活的情况下: 调用 update_target
  59.     if @target_window.active
  60.       update_target
  61.       return
  62.     end
  63.   end
  64.   #--------------------------------------------------------------------------
  65.   # ● 刷新画面 (物品窗口被激活的情况下)
  66.   #--------------------------------------------------------------------------
  67.   def update_item
  68.     # 按下 B 键的情况下
  69.     if Input.trigger?(Input::B)
  70.       # 演奏取消 SE
  71.       $game_system.se_play($data_system.cancel_se)
  72.       # 切换到菜单画面
  73.       $scene = Scene_Menu.new(0)
  74.       return
  75.     end
  76.     # 按下 C 键的情况下
  77.     if Input.trigger?(Input::C)
  78.       # 获取物品窗口当前选中的物品数据
  79.       @item = @item_window.item
  80.       # 不使用物品的情况下
  81.       unless @item.is_a?(RPG::Item)
  82.         # 演奏冻结 SE
  83.         $game_system.se_play($data_system.buzzer_se)
  84.         return
  85.       end
  86.       # 不能使用的情况下
  87.       unless $game_party.item_can_use?(@item.id)
  88.         # 演奏冻结 SE
  89.         $game_system.se_play($data_system.buzzer_se)
  90.         return
  91.       end
  92.       # 演奏确定 SE
  93.       $game_system.se_play($data_system.decision_se)
  94.       # 效果范围是我方的情况下
  95.       if @item.scope >= 3
  96.         # 激活目标窗口
  97.         @item_window.active = false
  98.         @target_window.x = (@item_window.index + 1) % 2 * 304
  99.         @target_window.visible = true
  100.         @target_window.active = true
  101.         # 设置效果范围 (单体/全体) 的对应光标位置
  102.         if @item.scope == 4 || @item.scope == 6
  103.           @target_window.index = -1
  104.         else
  105.           @target_window.index = 0
  106.         end
  107.       # 效果在我方以外的情况下
  108.       else
  109.         # 公共事件 ID 有效的情况下
  110.         if @item.common_event_id > 0
  111.           # 预约调用公共事件
  112.           $game_temp.common_event_id = @item.common_event_id
  113.           # 演奏物品使用时的 SE
  114.           $game_system.se_play(@item.menu_se)
  115.           # 消耗品的情况下
  116.           if @item.consumable
  117.             # 使用的物品数减 1
  118.             $game_party.lose_item(@item.id, 1)
  119.             # 再描绘物品窗口的项目
  120.             @item_window.draw_item(@item_window.index)
  121.           end
  122.           # 切换到地图画面
  123.           $scene = Scene_Map.new
  124.           return
  125.         end
  126.       end
  127.       return
  128.     end
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 刷新画面 (目标窗口被激活的情况下)
  132.   #--------------------------------------------------------------------------
  133.   def update_target
  134.     # 按下 B 键的情况下
  135.     if Input.trigger?(Input::B)
  136.       # 演奏取消 SE
  137.       $game_system.se_play($data_system.cancel_se)
  138.       # 由于物品用完而不能使用的场合
  139.       unless $game_party.item_can_use?(@item.id)
  140.         # 再次生成物品窗口的内容
  141.         @item_window.refresh
  142.       end
  143.       # 删除目标窗口
  144.       @item_window.active = true
  145.       @target_window.visible = false
  146.       @target_window.active = false
  147.       return
  148.     end
  149.     # 按下 C 键的情况下
  150.     if Input.trigger?(Input::C)
  151.       # 如果物品用完的情况下
  152.       if $game_party.item_number(@item.id) == 0
  153.         # 演奏冻结 SE
  154.         $game_system.se_play($data_system.buzzer_se)
  155.         return
  156.       end
  157.       # 目标是全体的情况下
  158.       if @target_window.index == -1
  159.         #★
  160.         if @item.variance == 100
  161.           case $game_party.actors.size
  162.           when 1
  163.             $game_party.actors[0].learn_skill(@item.recover_sp)
  164.           when 2
  165.             $game_party.actors[0].learn_skill(@item.recover_sp)
  166.             $game_party.actors[1].learn_skill(@item.recover_sp)
  167.           when 3
  168.             $game_party.actors[0].learn_skill(@item.recover_sp)
  169.             $game_party.actors[1].learn_skill(@item.recover_sp)
  170.             $game_party.actors[2].learn_skill(@item.recover_sp)
  171.           when 4
  172.             $game_party.actors[0].learn_skill(@item.recover_sp)
  173.             $game_party.actors[1].learn_skill(@item.recover_sp)
  174.             $game_party.actors[2].learn_skill(@item.recover_sp)
  175.             $game_party.actors[3].learn_skill(@item.recover_sp)
  176.           end
  177.           $game_party.lose_item(@item.id, 1)
  178.           @item_window.draw_item(@item_window.index)
  179.         else
  180.           used = false
  181.           for i in $game_party.actors
  182.             used |= i.item_effect(@item)
  183.           end
  184.         end
  185.         #☆
  186.         # 对同伴全体应用物品使用效果
  187.       end
  188.       # 目标是单体的情况下
  189.       if @target_window.index >= 0
  190.         #★
  191.         if @item.variance == 100
  192.           $game_party.actors[@target_window.index].learn_skill(@item.recover_sp)
  193.           $game_party.lose_item(@item.id, 1)
  194.           @item_window.draw_item(@item_window.index)
  195.         else
  196.           # 对目标角色应用物品的使用效果
  197.           target = $game_party.actors[@target_window.index]
  198.           used = target.item_effect(@item)
  199.         end
  200.         #☆
  201.       end
  202.       # 使用物品的情况下
  203.       if used
  204.         # 演奏物品使用时的 SE
  205.         $game_system.se_play(@item.menu_se)
  206.         # 消耗品的情况下
  207.         if @item.consumable
  208.           # 使用的物品数减 1
  209.           $game_party.lose_item(@item.id, 1)
  210.           # 再描绘物品窗口的项目
  211.           @item_window.draw_item(@item_window.index)
  212.         end
  213.         # 再生成目标窗口的内容
  214.         @target_window.refresh
  215.         # 全灭的情况下
  216.         if $game_party.all_dead?
  217.           # 切换到游戏结束画面
  218.           $scene = Scene_Gameover.new
  219.           return
  220.         end
  221.         # 公共事件 ID 有效的情况下
  222.         if @item.common_event_id > 0
  223.           # 预约调用公共事件
  224.           $game_temp.common_event_id = @item.common_event_id
  225.           # 切换到地图画面
  226.           $scene = Scene_Map.new
  227.           return
  228.         end
  229.       end
  230.       # 无法使用物品的情况下
  231.       unless used
  232.         # 演奏冻结 SE
  233.         $game_system.se_play($data_system.buzzer_se)
  234.       end
  235.       return
  236.     end
  237.   end
  238. end
复制代码
@protosssonny   

数据库.png (46.52 KB, 下载次数: 35)

数据库.png

技能书.rar

187.18 KB, 下载次数: 124


作者: 天地有正气    时间: 2013-12-28 20:53
本帖最后由 天地有正气 于 2013-12-28 20:56 编辑

嗯哪,LZ不厚道的直接用了我技能书的开头呢~
然后就是脚本部分,虽然功能和我的差不多,但是目前感觉不如我的好呢~希望LZ以后能够修改下既然修改了Scene_Item那就改的彻底点
因为首先脚本比我的长的多,LZ还复制了很多没有修改的脚本,这些都是不必要的~
其次从兼容性角度说,我那个是添加了新方法,LZ则是重定义了update_target这个方法,如果其他人的脚本也要用到 update_target,那就很有可能冲突呢~
以上就是我的个人感觉,LZ不喜欢的话请无视呢~
LZ如果学会了alias那么这个脚本一定会非常好的!加油~
(p.s.P叔啊为什么我的技能书脚本没给糖啊测试可用啊~)
作者: zhouzhuofan1    时间: 2013-12-28 20:53
本帖最后由 zhouzhuofan1 于 2013-12-28 21:03 编辑

不用状态,不用公共事件,
能否完爆“状态法”?求“捉虫”。
好吧,每次看到契约的人总会有种莫名其妙的抵触感。。。
@亿万星辰  @凝冰剑斩  
作者: qq1353826915    时间: 2013-12-28 21:30
默默点赞=-=~这个系统帮了我很大的忙!

作者: chd114    时间: 2013-12-28 21:32
这样做出来其实没什么特别的嘛···如果实在要动sceneitem,那么数据库就不该有这种麻烦的手动添加···
作者: 看花飞花落    时间: 2013-12-28 21:37
一般都是直接用的公共事件……
作者: chd114    时间: 2013-12-28 21:48
主要是你的脚本比事件学习技能显得更复杂但是却并没从本质上改变···也就是说其实你的脚本和楼上正气的脚本实际上是一种效果···而且他的脚本还要少些···如果你能在不占用数据库物品的情况下做出技能书那么这个脚本就会发生质的改变了
作者: chd114    时间: 2013-12-28 22:00
其实你和正气的技能书脚本都有致命缺陷——技能书种类+物品种类绝对不能超过数据库物品最大值···否则就要用到使游戏变卡的扩张数据库物品的脚本,而且技能书多了如果需要修改或者增减也不方便
作者: 819617949    时间: 2015-7-10 10:56
为什么我用不了啊
其他都设置好了
就是使用物品时无效就是用不了
我设置消耗品啊
作者: 819617949    时间: 2015-7-11 10:37
819617949 发表于 2015-7-10 10:56
为什么我用不了啊
其他都设置好了
就是使用物品时无效就是用不了

谢谢,我已经弄好了
原来是我的技能弄得是匕首才能释放
而我玩家是剑的所以不能用
谢谢而,你这脚本帮了我的大忙




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