当前位置:首页 > RMXP初初级脚本教程
提示:RM默认分辨率是640×480,即打开RM之后窗口最大能显示的区域。如果你把窗口的宽和高修改为了400和300,为了让其居中显示,X坐标便是(640-400)/2=120,Y坐标是(480-300)/2=90。算不过来的可以开计算器(……
核心语句B:@xxxxx_window.x (y/width/height) = xxx
在修改窗口参数的过程中,有时你会发现即使在super里修改了它们的X坐标和Y坐标,好像测试时还是没有改变。这是因为它们的这些参数在Scene里被重新定义过了。比如在Scene_Menu里面,你会看到这样一段:
# 生成状态窗口
@status_window = Window_MenuStatus.new @status_window.x = 160 @status_window.y = 0
Window_MenuStatus即是代表那个在主菜单里显示我方队员信息的大窗口。在这里它同@status_window这个变量关联起来了,所以@status_window就是这个窗口。然后,下面那句@status_window.x = 160,将这个窗口的X坐标固定在了160。所以即使你在Window_MenuStatus里的super后面修改了X坐标参数,也不会在游戏里看到它改变。但是如果你把@status_window.x = 160修改为180或者别的数字之后,你就会看到它的X坐标改变了。同理,Y坐标也是,将那个0改为其他数字,即可改变此窗口的Y坐标。
窗口的宽和高虽然在Scene里看到的比较少,但你也可以用.width和.height进行重新定义。如果在上面的脚本后面加上一句@status_window.height = 360,你就会发现Super里定义过的高度被改掉了。当然,因此也会出现一些显示缺失的BUG——这就是日后在自己做窗口的时候需要考虑的排版问题了。多数Scene是不会重定义宽高的,想修改的话直接在Window的脚本里修改Super中的参数即可。
练习题:重新给Scene_Menu(主菜单)排版,将金钱窗口、步数窗口、时间窗口等诸多窗口换成不一样的坐标。必要时可试着缩小这些窗口的大小。 提示:按照上面范例所教,@status_window = Window_MenuStatus.new这一句即表示状态窗口是Window_MenuStatus,其宽高可回到
Window_MenuStatus里修改super。金钱窗口之类的同理。可参考注释找到相对应的窗口脚本。
核心语句C:self.x(y/z/width/height/opacity/back_opacity) = xxx
这一句还是在Window里面看到的。其中x、y、width和height都不赘述,和核心语句2里讲到的功能一样,是重定义窗口参数的,会覆盖super的定义数据。然后是这个z值——它是指代窗口的优先级,就像显示图片时的序号一样,越大的窗口就在越上面。Opacity和back_opacity是透明度参数,最小0最大255,前者是整个窗口的透明度,后者不包含窗口的边框。
这些参数在Window里修改过后也会直观地体现效果。比如你在Window_Item里的super语句下面插入一句self.back_opacity = 100,然后进入看看效果如
何吧。
注意:z和opacity/back_opacity参数在核心语句2里也可以用到。比如说你可以在Scene_Menu上述提到的部分里插入一句@status_window.back_opacity = 100,然后看看效果。另外,增加z参数可以调整窗口的优先级,对排版也能起到一定作用。
2、进阶:修改战斗计算式,角色战斗图排布坐标
核心内容:基本数学运算法则
学习这一章的时候请同时打开F1,数学水平不好的建议再打开计算器(喂)。我将以修改RMXP的默认战斗数据计算方法和角色站位坐标为例进行讲解——想要用自己的战斗计算式,或者想打造横板或45度战斗的同学需要的效果,这一部分即可实现。
首先是自设战斗计算式。在F1里面的默认战斗计算式中,找到伤害计算的部分。拿普通攻击为例,可以看到在默认的计算式里它的基础伤害是这样计算的——
普通攻击
威力 = A 的攻击力 - (B 的物理防御 ÷ 2) 放大率 = 20 + A 的力量 分散度 = 15
然后,在下面还能找到最终伤害的语句——
伤害 = 威力 × 放大率 ÷ 20 × 属性修正 × 必杀修正 × 防御修正 ( ± 分散度 %)
看上去很晕很绕对吧。属性修正必杀修正和防御修正暂且不说,基础威力的计算就很麻烦,在填数据的时候为了掌握平衡度,设定起来也会比较繁琐。那么,要是想把普通攻击的计算式直接改成―威力 = A的攻击力 – B的物理防御‖,并且把放大率直接改成A的力量,要怎么做呢?
在脚本里找到Game_Battler 3。它便是掌管『游戏里的战斗者』的脚本(有点英文基础的应该一眼能看懂),然后第三部分负责战斗中的数据计算。在38行你可以看到注释写着―应用通常攻击效果‖,这便是普通攻击的计算部分。49行下开始,有这么一小段:
# 计算基本伤害
atk = [attacker.atk - self.pdef / 2, 0].max self.damage = atk * (20 + attacker.str) / 20
这就是在F1的计算式里提到的那两句威力的计算方式了。只要修改这两句,即可改掉计算方式。
不过修改之前要插一些解说——关于RM里的数字运算符号问题。在脚本中,加号就是―+‖,减号就是―-‖,但是乘号不是―×‖而是―*‖,除号则是―/‖。(是向左撇的斜杠方向别搞反)然后,小括号的用法和数学里一样,但是中括号的用法不同。如果想要括号里套括号,直接都用小括号即可。等号就是―=‖,表示赋值(令a等于xxx),然后你在脚本里应该还会看到一个和等号样子很像的符号―==‖(双等号),它是用来判断两个变量或数值『是否相等』的,不要和等号搞混。关于比较符号我们在下一章讲变量开关用法时会详细提到。
在运算上,加法、减法和乘法都和数学计算没区别,但除法有点不同。在脚本计算里面,除法运算的结果并不含小数位,而且会直接将小数位省略,不会四舍五入。比方说,如果你在式子里写了1 / 2的话,脚本对其的计算结果是0,而不是0.5或者1。如果你写了4 / 3的话,结果就是1而不是1.333333……。
另外,还有一个比较特殊的计算符号―%‖,它表示取余数。比如说,4 % 3 = 1,6 % 2 = 0。能看明白意思么?只要除不尽有余数的话,余数就是答案,而如果能除尽,就等于0。
简而言之,这些内容大多数都还是诸位小学时候的数学知识,只要回顾起来,修改伤害计算式就一点不难。
还是不会的……别改脚本了,先去让小学数学老师揍你一顿再说吧。(喂喂)
基础补完,我们继续回到上面提及的两句脚本。不妨将中文版本的计算式拿来对应着看看,马上就能发现,这里atk就是威力(基础伤害),attacker.atk就是A的攻击力,self.pdef就是B的物理防御力。至于那个中括号[attacker.atk - self.pdef / 2, 0].max这个内容,现阶段不需要理解也没关系(一定要理解的话,在帮助手册里搜索max可以查到其解说:返回最大的元素。在这里,表示在―A攻击力 – B防御力除以2‖的计算结果和0之间取一个最大值。这就避免了万一A攻击力减去B防御力之后为负,导致攻击敌人反倒给敌人加血的囧状)。我们只要会改计算的那一部分就够了。按照目标,我们想要威力单纯等于攻击力 – 敌方防御,那么就修改成如下内容:
atk = [attacker.atk - self.pdef, 0].max
下面那句稍显复杂,不过稍微研究一下也能看出来是有关放大率的内容。那个20 + attacker.str,正好和计算式里―20 + A 的力量‖对应。那么,如果想让放大率只等于A的力量,把前面的―20 +‖和包在外面的那个括号删掉即可。
再然后,可以注意到那个―/ 20‖,它对应的就是最终威力里的―放大率 ÷ 20‖了。如果不想再多此一举地计算,连它也可以删掉。这样经过修改之后,你的计算式就变成了——
普通攻击伤害 = (A的攻击力 – B的防御)× A的力量 ×分散度 ×各种其他影响系数
相比之下,是不是显得简洁些了呢。当然如果你想要繁琐的话,只要在相应变
量后面加上数字运算就行了。比如把基础威力设计为―(attacker.atk * 10 +
attacker.str) - self.pdef / 5‖的话,基础威力就等于―A的攻击力×10 + A的力量 – B的物理防御/5‖……(= =)
而且经过对应之后,你应该能够看得出来,战斗计算式里的各种参数在Game_Battler 3里,分别都是哪些语句。
练习题:修改技能的基本威力计算式为―威力 = 技能的数据库威力 – (B的魔法防御 / 2 +B的物理防御)‖,然后再按照自己的喜好修改影响最终威力的放大率等。
提示:技能伤害的计算部分在99行下―应用特技效果‖那段。
接下来,我们转到角色战斗图坐标的修改。
在RM默认战斗中,角色都是在画面下方一字排开的。如何将其修改为横版,或者45度的战斗模式呢?其实只要改掉战斗图的数字坐标就能做到。在脚本列表里,找到Game_Actor。这里就是关于游戏的角色的数据控制。一路向下拖到570行,―取得战斗画面的 X 坐标‖,可看到下面的这段脚本。
def screen_x
# 返回计算后的队伍 X 坐标的排列顺序 if self.index != nil
return self.index * 160 + 80 else
return 0 end end
这里解释一下self.index的含义,它代表队伍成员序号(并非角色编号),概念上和你在使用事件指令的『强制行动』时指令角色的那个1人2人一样,也就是目前在队的角色的序号。所以self.index最大数目是3,最小数目是0(在这里0代表队伍里第一个角色)。所以,在这个计算式里,角色战斗图的X坐标就是——第一个角色为80,第二个角色为240,第三个角色为400,第四个角色为560(当self.index分别为0、1、2、3时将其代入self.index * 160 + 80计算可得)要改动角色在画面上的垂直位置,改动这个self.index * 160 + 80就可以了。
同理,下面那一截关于Y坐标的脚本也一样,只不过因为角色在水平线上一字排开,所以Y坐标是一样的。要改得不一样的话,照猫画虎地把X坐标里那堆复制粘贴下来再修改数字就行了。Z坐标(讲窗口时提到过它指代优先级系数,没忘记吧?)也是一样,默认的是4-self.index,序号越大优先级越小,你可以把大家的优先级都调得一致,或者反过来直接改成self.index,这样序号越大优先级就越大了。
修改的过程就不用特别废话了,可以先设定好角色的坐标在哪里,也可以自己慢慢地代入数字来尝试。以下是一个改好的横版范例(附截图),你也可以改一改你自己喜欢的排布坐标然后在游戏里看看效果。
共分享92篇相关文档