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

Project1

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

[原创发布] 【教程】不会写可以改!实战:战斗指令增加“状态”选项

[复制链接]

Lv2.观梦者

(?????)

梦石
0
星屑
713
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

跳转到指定楼层
1
发表于 2011-10-28 04:01:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 各种压力的猫君 于 2011-10-28 04:53 编辑

同学们好,咱是一只在6R潜水潜了5年,今年终于上浮的、承受着各种压力的猫 {:nm_6:}
首先来解释下标题的“不会写可以改”——这就是咱奉行的脚本学习理念,当然也是咱学习脚本的途径。
不出意外的话应该会变成系列教程吧 {:nm_4:} 新手向系列教程“不会写可以改”
本期我们来实现在战斗指令中增加一项“状态”这个实例来学习的Scene类 和Window类 脚本的简单修改。

本期实例问题传送门:XP提问区问题“战斗中如何看己方人物状态”

【效果】

点评

⊙_⊙不错哈!  发表于 2013-9-6 23:06

评分

参与人数 2星屑 +120 收起 理由
时光机 + 60 收了,给糖XD
Rion幻音 + 60 支持修改教程

查看全部评分

Lv2.观梦者

(?????)

梦石
0
星屑
713
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

2
 楼主| 发表于 2011-10-28 04:01:56 | 只看该作者
本帖最后由 各种压力的猫君 于 2011-10-28 05:01 编辑

【开始教学 {:nm_4:} 】
首先从分析上面的问题开始:
不是啦 是增加状态这个选项 可以看自己的攻击力啊 状态啊 装备啊什么的

OK,我们首先去Scene_Battle看看。

欸?分割了4个定义?!简单的都没学会我怎么可能学会分割定义的脚本啊!
有上面这种想法的立刻给我去墙角罚站{:nm_1:}
所谓“分割定义”,无非是这个脚本太长了,写在一页里不方便阅读和整理才分成多个的。
OK我们开始实战!
Scene_Battle 1  25-34行:
  1.         # 生成角色命令窗口
  2.         s1 = $data_system.words.attack
  3.         s2 = $data_system.words.skill
  4.         s3 = $data_system.words.guard
  5.         s4 = $data_system.words.item
  6.         @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
  7.         @actor_command_window.y = 160
  8.         @actor_command_window.back_opacity = 160
  9.         @actor_command_window.active = false
  10.         @actor_command_window.visible = false
复制代码
仿照原有的格式,加上状态项:
在第29行下面添加一行:
  1.         s5 = "状态"
复制代码
并修改原第30行:
  1.         @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4, s5])
复制代码
OK 我们保存一下工程,进战斗测试看效果:

啊咧……超出去了 {:nm_7:}
我们还需要把这个指令窗口向上挪动,修改y坐标。
脚本32行:
  1.         @actor_command_window.y = 160
复制代码
我们要修改这个160?当然这样可以。不过我们这里用另外一种方式:
  1.         @actor_command_window.y = 160 - 32
复制代码
直接计算,脚本是多么方便啊 {:nm_4:}

有位同学问:32这个数据是如何知道的呢?
看脚本31行:
  1.         @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4, s5])
复制代码
这里提到了Window_Command,于是我们再到Window_Command脚本去找找:
Window_Command 14-15行
  1.         # 由命令的个数计算出窗口的高
  2.         super(0, 0, width, commands.size * 32 + 32)
复制代码
看到*32了吧~
那位同学又问了:后面为什么还要+32呢?(十万个为什么啊你{:nm_1:})
打开帮助文档—RPG MAKER XP—素材规格—窗口皮肤说明
    B
    窗口的边框及箭头。四角的 16×16 边框照这样显示,剩下的边框(边框的一部分)在窗口中按 16 像素的设计形状连接。箭头则作为窗口内容滚动的图标使用。

上下边框16×2=32
好吧有的没的扯完了回到脚本的修改(别忘了保存一下,时刻保存好习惯{:nm_4:})

现在我们改完了窗口的坐标,但是这项还是不可用的呢。我们要给他加上跳转到状态的功能:
Scene_Battle 3 106-155行
  1.       #--------------------------------------------------------------------------
  2.       # ● 刷新画面 (角色命令回合 : 基本命令)
  3.       #--------------------------------------------------------------------------
  4.       def update_phase3_basic_command
  5.         # 按下 B 键的情况下
  6.         if Input.trigger?(Input::B)
  7.           # 演奏取消 SE
  8.           $game_system.se_play($data_system.cancel_se)
  9.           # 转向前一个角色的指令输入
  10.           phase3_prior_actor
  11.           return
  12.         end
  13.         # 按下 C 键的情况下
  14.         if Input.trigger?(Input::C)
  15.           # 角色指令窗口光标位置分之
  16.           case @actor_command_window.index
  17.           when 0  # 攻击
  18.             # 演奏确定 SE
  19.             $game_system.se_play($data_system.decision_se)
  20.             # 设置行动
  21.             @active_battler.current_action.kind = 0
  22.             @active_battler.current_action.basic = 0
  23.             # 开始选择敌人
  24.             start_enemy_select
  25.           when 1  # 特技
  26.             # 演奏确定 SE
  27.             $game_system.se_play($data_system.decision_se)
  28.             # 设置行动
  29.             @active_battler.current_action.kind = 1
  30.             # 开始选择特技
  31.             start_skill_select
  32.           when 2  # 防御
  33.             # 演奏确定 SE
  34.             $game_system.se_play($data_system.decision_se)
  35.             # 设置行动
  36.             @active_battler.current_action.kind = 0
  37.             @active_battler.current_action.basic = 1
  38.             # 转向下一位角色的指令输入
  39.             phase3_next_actor
  40.           when 3  # 物品
  41.             # 演奏确定 SE
  42.             $game_system.se_play($data_system.decision_se)
  43.             # 设置行动
  44.             @active_battler.current_action.kind = 2
  45.             # 开始选择物品
  46.             start_item_select
  47.           end
  48.           return
  49.         end
  50.       end
复制代码
参考已有的格式,在倒数第3个end上面加上:
  1.     when 4 # 状态
  2.     # 演奏确定 SE
  3.     $game_system.se_play($data_system.decision_se)
  4.     # 打开状态窗口
  5.     open_status_window
复制代码
如果现在测试绝对会报错退出,因为我们这里调用了open_status_window这个方法,
但是还没有对这个方法进行定义。接下来我们对这个方法进行定义,请看下一层楼。
回复 支持 反对

使用道具 举报

Lv2.观梦者

(?????)

梦石
0
星屑
713
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

3
 楼主| 发表于 2011-10-28 04:02:03 | 只看该作者
本帖最后由 各种压力的猫君 于 2011-10-28 05:01 编辑

在脚本编辑器左侧列表中点一下Scene_Shop将它选中,然后按Insert键插入一个空脚本,取名随意。
这里我就叫Scene_Battle 5啦{:nm_4:} 。内容如下:
  1. #==============================================================================
  2. # ■ Scene_Battle (分割定义 5)
  3. #------------------------------------------------------------------------------
  4. #  处理战斗画面的类。
  5. #==============================================================================

  6. class Scene_Battle
  7.   #--------------------------------------------------------------------------
  8.   # ● 打开状态窗口
  9.   #--------------------------------------------------------------------------
  10.   def open_status_window
  11.     # 生成状态窗口
  12.     @status_window = Window_Status.new($game_party.actors[@actor_index])
  13.     # 无效化角色指令窗口
  14.     @actor_command_window.active = false
  15.     @actor_command_window.visible = false
  16.   end
  17.   #--------------------------------------------------------------------------
  18.   # ● 关闭状态窗口
  19.   #--------------------------------------------------------------------------
  20.   def close_status_window
  21.     # 释放状态窗口
  22.     @status_window.dispose
  23.     @status_window = nil
  24.     # 有效化角色指令窗口
  25.     @actor_command_window.active = true
  26.     @actor_command_window.visible = true
  27.   end
  28. end
复制代码
某同学:这段脚本是怎么来的呢?
Scene_Battle 3 拉到最下面,参考“开始选择物品”和“结束选择物品”
其中有一句需要特别说明一下:
  1.     @status_window = Window_Status.new($game_party.actors[@actor_index])
复制代码
Window_Status接受一个传入参数,actor。
$game_party.actors[]可以获取队伍中第N个角色(N从0起)的actor。
@actor_index是Scene_Battle的一个局部变量,代表当前活动的角色序列。
配合帮助自己思考一下,这里不能很好的理解也无所谓,将来的教程(如果有)会详细讲解。

保存工程,战斗测试:

状态窗口被角色覆盖了 {:nm_9:}
既然这样,把生成状态窗口的地方稍加修改:
  1.     # 生成状态窗口
  2.     @status_window = Window_Status.new($game_party.actors[@actor_index])
  3.     @status_window.z = 9999
复制代码
这里偷个懒,把z坐标直接设到最高9999了,这里实际上设成102以上(含)就可以。

保存测试,发现我们可以打开状态窗口,但是关不掉了{:nm_7:}
如何关掉它呢?请看下一层楼
回复 支持 反对

使用道具 举报

Lv2.观梦者

(?????)

梦石
0
星屑
713
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

4
 楼主| 发表于 2011-10-28 04:02:13 | 只看该作者
本帖最后由 各种压力的猫君 于 2011-10-28 20:57 编辑

打开我们的Scene_Battle 5,在“打开状态窗口”的end上面加一段
  1.     # 循环
  2.     loop do
  3.       Graphics.update
  4.       Input.update
  5.       # 当按下确定键或取消键的时候
  6.       if Input.trigger?(Input::C) or Input.trigger?(Input::B)
  7.         # 演奏取消 SE
  8.         $game_system.se_play($data_system.cancel_se)
  9.         # 关闭状态窗口
  10.         close_status_window
  11.         # 中断循环
  12.         break
  13.       end
  14.     end
复制代码
其中
  1.       Graphics.update
  2.       Input.update
复制代码
这两个分别是图像的更新和输入的更新,必须有,否则10s备份脚本弹出 =x=

保存测试,可以听到SE但是却报错了:
(小技巧:Wndows系统的这类弹出窗口都可以用Ctrl+C键复制窗口内容,粘贴出来就是下面这种格式)
  1. ---------------------------
  2. 不会写可以改!战斗指令增加“状态”选项
  3. ---------------------------
  4. 脚本 'Scene_Battle 1' 的 254 行 发生了 NoMethodError。

  5. undefined method `update' for nil:NilClass
  6. ---------------------------
  7. 确定   
  8. ---------------------------
复制代码
打开脚本编辑器,会自动定位到出错的地方。

原来是默认的脚本已经定义了@status_window,当我们把他清空update更新就会报错了。
解决方法同样简单,打开我们的Scene_Battle 5,将所有的@status_window修改为@actor_status_window
(共4处,你可以试试按Ctrl+H或者右键菜单“替换”功能的“全部替换”按钮)
保存测试,效果实现,无脚本错误。

【至此,脚本修改完毕。{:nm_6:} 】

附:完整的Scene_Battle 5
  1. #==============================================================================
  2. # ■ Scene_Battle (分割定义 5)
  3. #------------------------------------------------------------------------------
  4. #  处理战斗画面的类。
  5. #==============================================================================

  6. class Scene_Battle
  7.   #--------------------------------------------------------------------------
  8.   # ● 打开状态窗口
  9.   #--------------------------------------------------------------------------
  10.   def open_status_window
  11.     # 生成状态窗口
  12.     @actor_status_window = Window_Status.new($game_party.actors[@actor_index])
  13.     @actor_status_window.z = 102
  14.     # 无效化角色指令窗口
  15.     @actor_command_window.active = false
  16.     @actor_command_window.visible = false
  17.     # 循环
  18.     loop do
  19.       Graphics.update
  20.       Input.update
  21.       if Input.trigger?(Input::C) or Input.trigger?(Input::B)
  22.         # 演奏取消 SE
  23.         $game_system.se_play($data_system.cancel_se)
  24.         # 关闭状态窗口
  25.         close_status_window
  26.         # 中断循环
  27.         break
  28.       end
  29.     end
  30.   end
  31.   #--------------------------------------------------------------------------
  32.   # ● 关闭状态窗口
  33.   #--------------------------------------------------------------------------
  34.   def close_status_window
  35.     # 释放状态窗口
  36.     @actor_status_window.dispose
  37.     @actor_status_window = nil
  38.     # 有效化角色指令窗口
  39.     @actor_command_window.active = true
  40.     @actor_command_window.visible = true
  41.   end
  42. end
复制代码
【下期预告 {:nm_5:} 】
本系列教程建立在实战之上 =w= 待提问区出现适合的问题之时咱就会出下一期了。
当然你有什么好的提议可以在下面回帖告诉我 {:nm_4:}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
85
在线时间
62 小时
注册时间
2010-9-18
帖子
17
5
发表于 2011-10-28 07:25:58 | 只看该作者
我想要关于战斗方面的修改  如角色头像的位置  角色站立的位置  期待楼主下期会给我带来
回复 支持 反对

使用道具 举报

Lv1.梦旅人 (暗夜天使)

永夜蟄居の玖瀨

梦石
0
星屑
71
在线时间
1018 小时
注册时间
2011-9-5
帖子
2813

开拓者贵宾

6
发表于 2011-10-28 10:36:30 | 只看该作者
猫君 有没有VX的教程啊

点评

同求  发表于 2011-10-28 16:13

回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
508
在线时间
1478 小时
注册时间
2011-9-17
帖子
1316

开拓者贵宾

7
发表于 2011-10-28 11:00:13 | 只看该作者
支持,版主君
我的问题是,在战斗的时候,要是产生MISS,稍微左右移动一下图片的效果(哈哈~这个简单吧~)
我帖子中要有是不HX的空白,请Ctrl + A
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
518 小时
注册时间
2010-6-16
帖子
1073
8
发表于 2011-10-28 13:02:34 | 只看该作者
很支持这种的教程,很多伸手党需要的效果明明修改些就行了却还要求脚本,
有些居然只是移动坐标修改宽高之类的……

总之猫君加油哦~~
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
4 小时
注册时间
2011-10-16
帖子
81
9
发表于 2011-10-28 13:32:51 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
49
在线时间
172 小时
注册时间
2011-10-19
帖子
474
10
发表于 2011-10-28 14:46:53 | 只看该作者
对新手很有用的说啊, 前排.(有是第10= =)
我是SB
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-21 06:04

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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