设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2726|回复: 5
打印 上一主题 下一主题

[原创发布] 物品调用公共事件的合并——使用物品时输出物品编号

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
98 小时
注册时间
2011-1-14
帖子
46
跳转到指定楼层
1
发表于 2013-5-26 17:11:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 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, 下载次数: 26)

调用的事件

调用的事件

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

使用“补品”

使用“补品”

Project2.zip

206.8 KB, 下载次数: 93

范例

点评

建议直接在Game_Battler的effect_item上做文章吧==  发表于 2013-5-26 17:13

评分

参与人数 2星屑 +42 收起 理由
sai90306 + 12 好腳本!!!大愛!!
英顺的马甲 + 30 塞糖

查看全部评分

Lv1.梦旅人

梦石
0
星屑
50
在线时间
98 小时
注册时间
2011-1-14
帖子
46
2
 楼主| 发表于 2013-5-26 17:22:03 | 只看该作者
@英顺的马甲 如果是“平时使用”,也有效吗?

点评

不了,我知道是什么原因了,抱歉,是我忽略了有些物品不需要对象的情况==  发表于 2013-5-26 18:05
回复 支持 反对

使用道具 举报

Lv1.梦旅人

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
帖子
3225
3
发表于 2013-5-26 17:27:49 | 只看该作者
tk4215342 发表于 2013-5-26 17:22
@英顺的马甲 如果是“平时使用”,也有效吗?

平时使用=菜单中+战斗中
使用时都必须选择一个角色或敌人作为对象,
而角色和敌人都是归类于Game_Battler,
而Game_Battler对于物品效果的处理就是effect_item。

点评

不好意思,打错了,是经验不是分……我还没那么贪心……  发表于 2013-5-26 18:12
多谢你的帮助。另外,可以加几分吗?#^_^#  发表于 2013-5-26 18:09
刚挂上失败的那个工程,请看看是什么原因。  发表于 2013-5-26 17:55
这我就不知道了==,不过我只知道我打反了,是item_effect而不是effect_item==  发表于 2013-5-26 17:49
我刚刚试了一下,没用啊。  发表于 2013-5-26 17:40
本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到[email protected]咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

4
发表于 2013-6-2 15:53:20 | 只看该作者
其实这东西在RMXP的魔塔样板中很早就有了···而且比你这还方便
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
98 小时
注册时间
2011-1-14
帖子
46
5
 楼主| 发表于 2013-6-5 12:23:34 | 只看该作者
chd114 发表于 2013-6-2 15:53
其实这东西在RMXP的魔塔样板中很早就有了···而且比你这还方便

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

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

6
发表于 2013-6-5 15:03:25 | 只看该作者
tk4215342 发表于 2013-6-5 12:23
其实是相同的原理,只不过我是把它做成了外挂脚本,方便别人使用,而魔塔样板中是内置的。
总之,这个脚 ...

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

点评

技能的脚本我暂时不准备弄了,离高考只有两天了。  发表于 2013-6-5 18:04
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-27 01:48

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表