|
|
本帖最后由 TheRebirth 于 2014-10-18 22:55 编辑
我要争取早日拿到技术宅勋章!
本教程一周一更。
修正
第一节中的^=是加法运算,真正的乘方运算是“**=”。第四节中 Sprite 类还有"ox"和"oy"属性。
进入正题之前……
一、这是一个什么样的教程?
本教程主要面向无任何游戏制作经验但有志于游戏制作的个人或小规模团队,以RMVX为平台,教授游戏制作相关的知识,包括编程、美工、作曲等内容,但以编程为主。和其它多数RM教程不同,本教程将直接从脚本编辑器着手而抛弃数据库的绝大多数功能,只在少数时候使用一部分。此外,如标题所说,这是一个实战教程。这也就意味着,你做出来的游戏要面向大众的,是认认真真地要做一个游戏的,同时你要做好面对一大堆挑剔的玩家的准备。
二、本教程的门槛是什么?
可用的RPG Maker VX、FL Studio 10(需要携带FL Keys与Sytrus合成器)与PS(建议使用CS5)的软体,足够的耐心、时间和勇气,不太渣的电脑。
|
正题
进入第一节以前,请新建一个工程,打开脚本编辑器,删掉自带脚本,只保留图示栏目,并删除Scene_Title内脚本,保留如下图所示部分。
此外你还需要在第17行处写个 end 。
第一节 : 数学运算与对话框
这一节非常简单,你在这里将要学习的命令多数在游戏制作中将是最基础,也是最重要的,就在下面 :
x = x + y
x = x - y
x = x * y
x = x / y
各位应该都看得出来这是四则运算吧。我们先来讲一下这些语句的含义。抛开运算符号不说,“=”是赋值符,作用是用赋值符右边的值替换赋值符左边的值。赋值符右边是表达式,左边是变量。上述四个语句的等价命令如下 :
x += y
x -= y
x *= y
x /= y
它们和上面的四句完全等效,区别在于,这四句将使CPU经历更少的运算步骤,效率更高(省去了找 x 的值的步骤)。这四个运算各位应该都很熟悉,而以下运算各位见得可能就不是那么多了。
①x %= y # 等价于 x = x % y
②x ^= y # 等价于 x = x ^ y
③x = x << 10
④x = x >> 10
⑤x **= y # 等价于 x = x ** y
这三个语句的意思分别是 : ① x 除以 y 求余,并以余数作为结果。②求 x + y 的值。③ x 向左移位 10 位,求结果。④ x 向右移位 10 位,求结果。⑤①和②大家应该都能理解,③和④恐怕就有点陌生了。
我们首先假设 x = 3,将它转换为二进制数,也就是11,而 << 实际上就是在这个二进制数后加 10 个零。当 3 经过这种运算后,得到的结果转换为十进制数,结果应该是 3072 。>> 运算则与此相反,3072 >> 10 得 3 。
熟悉这些概念以后,我们来尝试一下,让RMVX给我们做计算题!
在这一节中,你暂且先记住,将你要写的计算步骤放在第一张图后面start或者post_start里面,我们在第二节里解释为什么这样做。
好的,首先我们写上这几句,如红框中所写的 ↓
然后保存工程,点击“游戏测试”按钮。(也就是那个绿色三角形)
如果操作没有问题,首先你会看见一个黑色窗口,过大约 1 秒后,你会看见一个对话框,里面写着65536。
这里再来介绍两个命令 : p 和 print。
它们的作用都是显示对话框,对话框中内容都是 p 或 print 后所写的语句。格式区别在于 :
p 值
print( 值 )
这里又涉及到了值的概念。有一种情况是,你可以把赋值符右边的表达式理解为“值”。这个值可以是数字和字符串。字符串的值一定是"字符串",也就是字两边有引号。而 p 和 print 的不同不止在书写格式上。如果你将这个值设置为 "c" ,使用 p 时,对话框中会显示 "c" ,而使用 print 时,对话框中显示 c 。
p 和 print 在学习过程中将会是很有用的两个命令,使用它们可以很直观便捷地得知数据的运算结果。
第一节到此结束。
| 第二节 : RMVX脚本结构及运行机理
你们应该可以看见,在开头我删脚本时我还保留了 Main 这一栏,实际上RMVX所作程序的一切都是从 Main 开始的。
请看下图。
可以认为begin和end里面所夹的就是程序开始时要做的事情。
Graphics.freeze的作用是冻结图像,多数时候是为渐变而做的准备工作。而渐变就是这一句 : Graphics.transition(30)。括号里面的参数就是渐变过程消耗的时间,单位为帧。在RMVX程式中,默认帧速率为 60FPS,也就是 60 帧 / 秒。
$scene = Scene.Title.new会将初始场景( Scene )设置为标题画面。$scene.main while $scene != nil的作用可表述为 : 如果$scene,也就是初始场景的值不是空值,则执行该初始场景的起始命令。
rescue Errno::ENOENT将会捕捉“找不到文件”这类错误,下方两句则是发现这类错误时的处理措施。
最上方的Font.dafault_name内储存了这个程序在默认情况下会采用的字体。
接下来转到Scene_Base。
Scene_Base是其它所有场景的祖宗,几乎所有场景都直接由Scene_Base衍生而来。main里面的start和post_start都是切换至该场景时做的初始化工作。perform_transition则是为了使过渡平滑而做的画面渐变操作loop do和离loop do最近的end之间包含了居于该场景中时必须进行的操作,包括刷新画面、检测按键输入和自定义的更新等。break if $scene != self表示当当前场景切换至另一个场景时,该场景的循环更新将中断,这时才会执行loop do...end之后的语句。其它场景的终止处理都是转向其它场景,而Title场景的终止处理(不是 terminate 命令)则是$scene = nil,也就是将场景设置为空,这样就可以退出游戏。
另外一个极为重要的类就是 Cache 。
RMVX程序以及其它绝大多数程序在载入图像时,都会或多或少地在缓存中存入图像以提高程序运行效率。举个例子,如果缓存中没有存入图片,那么在加载图像时,同一张图很可能就要重复加载 N 遍,这种赘余的工作当然不是我们希望它做的。而有了缓存,就好像先人给了你一张 0 ~ 90 度的三角函数值表,以后你和其它 N 人就不会在算 sin 74.25°的值上同样花很多的时间了,避免了重复与时间的浪费。Cache里面虽然有animation、battler、character、face等种类众多的图像载入函数,但它们的本质都是load_bitmap。
如上所述可以解释RMVX运行的起始和结末,这就是第二节要讲的核心内容,在第三节中我们将要讲RGSS2,也就是RMVX采用的编程语言的语法格式,要背的内容可能有点多。
第二节到此结束。
| 第三节 : RGSS脚本基础语法
在RGSS中,你可以定义以下这些东西 ↓
函数(RGSS中称为“方法”)
这是第一种定义。
第二种定义中,super则承载了父类中同名函数中已有的所有语句。
此外函数还可以附带参数,如 Method(arg1)、Method(arg1,arg2)等。arg1和arg2等参数可在函数定义中直接使用。
类
上面定义了一个独立的类。
而这个类则是Class1的子类,它将继承Class1的所有变量与方法,但initialize函数还是必须写上的。
此外还有Module。Module和类差不多,但类不能使用include。include应当使用于class内。include的对象是Module。
此外RGSS中还有变量类型之分。
var(等价于_var)、@var、@@var和$var分别是局部变量、实例变量、类变量、全局变量。局部变量的适用范围仅限于本函数。在被定义的函数外使用本变量时会报错提示未定义var。实例变量可在类中被调用,当调用该实例变量而该变量未被定义时,返回值为nil(不是“0”,是“空”。)。类变量需要在类中定义,在类外无法被调用。全局变量则在任何地方都可以被调用,且定义不是硬性规则(当然,未定义而被调用时返回值也是“nil”)。
同时RGSS自身也定义了如下变量 :
$DEBUG : 该系统是否处于DEBUG模式。
还有很多很重要的语法如下 ↓
关键字
在RGSS中(任何编程语言都是如此),关键字不能成为实例的名字(如类、变量),但$begin、$end等是可以使用的。
条件分歧
这是最简单的条件分歧。
这里的elsif和else都是可加可不加的东西。上图中的condition、condition2、conditon3都是条件,它们可以是布尔型变量、方法、不等式( a < 6等 )或等式( a == 6等 )。当条件返回值为TRUE时,将执行 if 和 end 内所夹语句。此外还有 if condition or condition2 表示两者满足其一为真与 if condition and condition2 表示两者皆满足为真,与 if not condition 表示不满足条件为真等。
while 和 if 类似,但没有elsif、else这样的额外条件分歧。while(0)表示无条件执行。
unless与until的执行条件和 if 与 while 相反。
case 也是一种条件分歧,上图中第二种 case 语法中,0..2表示 car 的值在 [0,2] 内,即 0≤car≤2。在上述条件分歧中,if 、while 、until 、unless 可以作为修饰符加于语句后方如 : a = 6 if b
循环
这两个 for 循环几乎完全等价,它们都从 i=0 开始循环三次,每循环一次 i += 1 ,循环结束时 i 都等于 2 。
在循环结构中,你还可以使用next。它的作用是跳到下一次循环。而 break 则中断循环,loop do ... end 中它可以用来终止整个循环,如下图。
加上这句以后,这个循环将在 a==6 时终止。如果没有break,loop循环将一直执行下去。
这节的内容会有点枯燥,不过第四、五、六节就会非常激动人心了!
第三节到此结束。
| 第四节 : 数学、轨迹与图形
我先来介绍几个运动。
平滑运动
这个运动应该说在很多游戏中都可以见到。实际上,这些运动之所以平滑,是因为它们在开头和结尾分别设置了一个加速与减速的过程。这个运动大致可以像下面这样表示。
上面这个就包含了一个匀加速,一个匀速和一个匀减速运动,时间分别是 [0,14] , [15,110] , [111,120] 。
匀速圆周运动
这个运动可能不像平滑运动那样常见,但实际上也是一种基本且重要的运动。
在这个表达式中 x0 表示圆心横坐标,以右为正,以窗口左顶点为 0。y0表示纵坐标,以下为正,以窗口上顶点为 0。
那么这俩东西能用来干啥呢?你可以把它加进 Sprite 类的子类的 update 函数里面!
而 Sprite 类就集成了显示图像与对图像操作所需的东西!
我来介绍一下。首先 Sprite1 是 Sprite 的子类,这样它就可以使用 Sprite 类内已经定义的变量和函数。intialize 函数是任何一个 Sprite 子类都必须拥有的,加 super 是必须的,否则加载时会报错提示"disposed sprite"。update 函数里面最好也加上 super ,尽管不是必须。bitmap 是这个类采用的位图,也就是它的长相,JPG、BMP、PNG格式都是支持的。src_rect 表示了原图要显示的部分。里面第一个参数是要显示的部分的左上顶点 X 坐标,第二个是 Y 坐标,第三个是宽度,第四个是高度。x 和 y 分别是这个 Sprite 左上顶点的横坐标和纵坐标,默认为 0。zoom_x 和 zoom_y 则是 X 缩放值和 Y 缩放值,1.00为原比例。angle 是该图片的旋转角度,旋转方向是逆时针。opacity 是不透明度,默认为 255,同时也是最大值。blend_type 是颜色混合方式,0 为覆盖,1 是颜色值相加,2 是颜色值相减。color 是要与这个 Sprite 混合的颜色。Color 的四个初始化参数分别是红、绿、蓝、不透明度。visible 表示本 Sprite 是否可见,默认为 true。此外它还有一个布尔型变量叫 mirror,默认为 false 。值为 true 时,将水平反转图像。两个变量 ox 和 oy ,分别是这个 Sprite 的中心 X 坐标和中心 Y 坐标。严格意义上说,initialize 函数里面 super 和 end 之间的变量都是可设可不设的。
而且要注意的是,self.bitmap 一般最好不填 Bitmap.new(filename) ,因为当你需要重复使用这张图时,这会造成资源的浪费,除非你明确知道这张图不会重复使用,否则最好填Cache.load_bitmap(folder,filename)。
对于这个 Sprite 本身,除了上面的 dispose 和 update 之外,你还可以使用这些函数 : width , height , flash(color,duration)。width 函数返回值是这个 Sprite 的宽度,height 则是高度。flash 则可以使这个 Sprite 以 color 为颜色,闪烁时长 duration 的时间,实际上就是用 color 与 Sprite 混合,然后使这个颜色在 duration 之后消失。
而对于 bitmap 中的 Bitmap 类,你还有很多文章可以做。
对于这个bitmap,width , height , dispose 也都可以使用。此外还有 : clear(擦完整张图),get_pixel( x,y )(取得对应位置的这张图的颜色),set_pixel( x , y , color )(将对应位置的颜色设置为 color ),blt( x, y, src_bitmap, src_rect[, opacity] )(将位图 src_bitmap 内 src_rect 区域内的图像填充至左上顶点为 (x,y) 的区域,opacity 可填可不填),stretch_blt(dest_rect, src_bitmap, src_rect[, opacity]) ( 将位图 src_bitmap 内 src_rect 区域内的图像填充至 dest_rect 该区域,图像将自动缩放,opacity 可填可不填 ),fill_rect(x, y, width, height, color) 或 fill_rect(rect, color)(将颜色 color 填充至指定区域),gradient_fill_rect(x, y, width, height, color1, color2[, vertical]) 或 gradient_fill_rect(rect, color1, color2[, vertical]) (在指定区域内渐变填充两种颜色,vertical 可填可不填,设置为 true 时颜色将垂直渐变,默认为水平方向渐变),clear_rect(x, y, width, height) 或 clear_rect(rect)(清除该位图指定区域内位图),blur(模糊位图),radial_blur(angle, division)(执行放射性模糊,angle为角度,division 为细分等级,等级越高,图像越平滑,而这个操作会耗费大量时间。),draw_text(x, y, width, height, str[, align]) 或 draw_text(rect, str[, align]) (在指定区域内显示文字 str ,align 为对齐方式,可填可不填,设置为 0 时靠左对齐,设置为 1 时居中,设置为 2 时靠右对齐)。对于 Bitmap 来说,所有函数都对 Bitmap 永久有效,不需要填写在 update 内以更新该位图,而且这些函数的计算成本都比较高。
有了这些东西,再加上键盘输入检测,你就可以做无声游戏了。
第四节到此结束。
|
喵玉特典一 : STG系统解析(未完成)
这是一个对初学者来说会有些难度,或者需要花很多时间去理解的课程,因为本课程中所写的代码很多,不推荐初学者学习。不过一旦过了这道坎,代码行数都是浮云了。一个STG游戏界面里面应该有什么?自机、敌机、自机的子弹、敌机的子弹、特效、背景、道具,还有计分板和暂停时应该能显示的菜单。在 class 里面定义它们吧,多数情况下这应该是最方便的。
自机
为了保险起见,你还需要在 update 后加 super 。
上图中还有一些注释没有解决的问题,比如:@animationtime,上图中我在 src_rect 的起始 X 坐标里使用了 floor(@animationtime/9),这表示对@animationtime取不大于它自身的最小整数。这样再把self.src_rect = Rect.new(floor(@animationtime/9)*60,0,128,128)加入 update 以后,就可以做出动画的效果。concat 的作用则是将某个合法的元素压入数组,排在最后一位。
@realx 和 @realy 存在的意义在于将现有像素细分,1 像素能抵 256 像素用,让 Sprite 的运动更加平滑。
然后…我在这张图中又犯了一个错误:忘了加self.ox = 496 if self.ox > 480,self.ox = 0 if self.ox < 0,self.oy = 0 if self.oy < 0,self.oy = 480 if self.oy > 480。这四行语句的作用是约束自机的坐标,防止它飞到屏幕外边去。
敌机
attr_accessor(value)的作用是定义一个可以在这个类之外,在另一个类里面自由读写的变量。
所有的敌机都应该会遵循一些特点,你可以将它们定义在所有 Enemy 共同的父类 Enemy 中,然后对不同种类的 Enemy 分别进行定义 ↓
不管是 initialize 还是 update 都一定要加 super !
敌机子弹
我又错了,self.bitmap后面应该写成Cache.load_bitmap("Graphics/","Bullet#{type}.png",hue)。
毫无疑问,敌机子弹应该有对自机中弹的判定。考虑到开根的运算成本很高,这里只用了 | ( x1-x2 ) |2 + | ( y1 - y2 ) |2。
在这个类初始化时,type 是多少,bitmap 就是 Bullet多少.png。radius 是中弹判定半径,hue 是子弹色相。
和敌机这个类一样,你最好也定义子类,调用时就调子类。
如果有需要,你还可以在 initialize 里面写上一句 @graze = false 将if (self.x-$player.x) ... self.dispose end这段代码复制一次,在@radius ** 2前面加32,后面再加 and @graze = false 去掉$player.damage,将@effect中第一个参数改成另外一个值,radius改成32+rand(96)作为擦弹时出现的火星能行走的距离,再在self.dispose前加@graze = true,$graze += 1,这样就可以做出擦弹的效果。
自机子弹
PlayerBullet的情况相对于EnemyBullet比较多变,因此这里不会在PlayerBullet中定义判定方法,而是将这些交给子类完成。
以上提到的所有类,update 里面都必须有 : @realx += @vx @realy += @vy self.ox = @vx >> 8 self.oy = @vy >> 8 这四句。
(未完待续)
|
第五节 : 键盘输入
这节倒是很简单(相对于第四节来说),只需要了解一半于第四节的内容。
大概就是,因为在所有 Scene 的父类 Scene_Base 的定义中已经加入了 Input.update ,所以如果你的 Sprite 要受键盘控制,能进行人机交互,假设你的 Sprite 就叫 Sprite1 ,那就把 Sprite1.update 加入这个 Scene 的 update 里面来,然后再在 Sprite1 的 update 里面说 if Input.怎么怎么样 就怎么怎么样 end 就可以了。
具体可以使用的条件如下:
Input.press?()(某键位处于被按下状态)
Input.trigger?()(某键位正在被按下中,只有在被按下的那一瞬间返回值为 true )
Input.repeat?()(某键位处于被按下状态,相对于 press? 而言,它会进行一个周期更长的重复判定,而不是每一帧都返回 true )
这三个函数里面又有这些是可以填的 ↓
DOWN LEFT RIGHT UP 上下左右,这不用我多说了吧
A B C X Y Z L R 这不是键盘上的ABCXYVLR键,对应的键位你可以在游戏手柄中看到。启动程序后按F1,或右击程序框图标点属性,然后你可以看到 Z 对应 C 键,X 对应 B 键等。ABCXYZLR是EB考虑到有人可能用手柄玩这游戏而设置的另外一个称呼。
SHIFT CTRL ALT 键盘上的 SHIFT , CTRL , ALT
F5 F6 F7 F8 F9 键盘上的 F5 到 F9
第五节到此结束。
| 第六节 : 音频操作
哦,我的天呐,这一节更TM简单! 除去这句话,你只会看到 5 个函数,除此之外就没有了。
Audio.bgm_play(filename,[volume, [pitch]]) → 播放文件路径值为 filename 的BGM,只有 filename 是必须参数。右边两个分别是音量和声调(可同时等同于播放速度)。BGM会循环播放。对于格式为OGG的文件,如果在千千静听中给该BGM文件的注释中加上LOOPSTART和LOOPLENGTH,BGM将会从LOOPSTART位置开始循环,循环片段长度为LOOPLENGTH。对于LOOPSTART和LOOPLENGTH来说,它们的单位都是采样数。对于采样率为44100的BGM来说,LOOPSTART和LOOPLENGTH对应的一秒的长度是44100;如果采样率是48K,这两个值会变成48000。
Audio.bgm_stop → 立即停止播放BGM。
Audio.bgm_fade(time) → 淡出BGM,时间为 time 毫秒。
Audio.se_play(filename,[volume, [pitch]]) → 播放文件路径值为 filename 的 SE,只有 filename 是必须参数。右边两个分别是音量和声调(可同时等同于播放速度)。不幸的是,如果你尝试用这个做鬼畜的声效的话,RMVX会自动把同一时间内尝试播放的其它SE过滤掉,因为先前的SE还没停下来。
Audio.se_stop → 立即停止播放该SE。
| 第七节 : 绘图(未完成)
让我们想想,做一个STG需要画哪些东西?人物肖像、子弹、泥土、石头、树木、叶丛、天空的纹理贴图(如果你要做3D场景的话)?如果你要做科幻风,你甚至还要画机器的贴图、星云等这些看着就让人感觉恐惧、没有自信下手的东西。然后还有,艺术字……那好吧,我们先从最简单的开始——
子弹!
以 32 px 的子弹为例。我的做法是,先用铅笔工具在中心处画一个圆,必须完美地处于中心!其中的道理不言而喻。如果你看到一个毛笔样的按钮,按下右键,那里才有铅笔工具。让它完美地处于中心可以通过缩放图片实现,如缩放至400%。
然后在图片中心处建立一个直径 48 px 的路径(点钢笔笔尖按钮,左上有三个按钮,经过描点的方形,有钢笔笔尖的描点方形和方形,点第二个。右边有一组按钮,点椭圆按钮,再点箭头,勾选固定大小,填 32px ,32px ,再在画布中点一下),稍微调小一些(点钢笔笔尖下面的黑色指针按钮,右键点击路径,点自由变换路径,W 和 H 就是宽和高),比如97%缩放。到橡皮工具内点画笔图案下方数字右边的箭头,将橡皮擦大小设置为 3 px,硬度 0% 。然后找到路径界面,在那个路径上点右键,选择描边,选择橡皮擦,确定。再描边 2、3 次(也可以点空心圆图标,此时使用的描边工具以最后一次使用的工具为准)。再在图层 1 上点右键,点混合选项,选择内发光,将不透明度设为100%,大小设为 12 px,源设置为居中,等高线设置为高斯(这个等高线看起来就好像一个拉直了的"S"),确定。不要点消除锯齿,这会使得白色区域不处于子弹中心,影响玩家判断。
然后就可以保存了!
你也可以考虑开头建立路径,再点路径界面里的实心圆按钮填充成红色,路径界面里面的填充工具填充的颜色是当前的前景色。然后走到调路径大小那里。
其他尺寸的子弹制作过程也是类似的,不过是改一下某些数值(路径固定大小,内发光大小,橡皮擦直径路径缩放大小)。
还有一种子弹,直径 64 px ,中间空心,边缘为白色的子弹。
开头步骤是类似的,只是要将画笔颜色换成白色,固定大小换成 64 px 。擦去边缘以后,你还要将路径大小通过自由变换调整至 19 % 左右。橡皮擦大小设置为 10 px ,硬度为 0% 。然后用橡皮擦描边。
然后再进入混合选项,按照下图所示设好参数。
然后也可以保存了。
还有一些样式的子弹,如星弹,心弹等。我只告诉你,混合选项中要加黑色描边,大小设置为 1 px 。其他的你完全可以自己解决。
那好,接下来,轮到泥土了。
新建一个大小稍大的画布,比如我的 512 × 512 。再按下 F5(我希望你没有改快捷键,不然就得 ALT + W 再点画笔)。
到这里,PS最重要的功能之一来了!就是对画笔的设置。说得夸张一点,要是没有这东西我早就抛弃 PS 了。刚碰上这窗口时仅仅是看看那些选项我都心动了!
首先选好画笔,选喷溅 59 像素(鼠标长期悬停在某一画笔窗口时会显示画笔名称)。然后按下图所示设置好。画笔颜色选个深一点的棕色。
你也可以考虑打开散布,勾选两轴,调到 180% 以上,涂满画布。就可以做成上图中右边的效果了。
不过要注意,因为这张图在平铺时能明显地看出裂隙,所以你要涂满整个场景。
草地也可以这样画,区别只有画笔的颜色。
(未完待续)
| 第九节 : 更完整的RGSS语法(未完成) 在RM中,Object是所有其他类的父类。这就是说,只要Object里面有什么东西,那么其他所有类也都可以用。
相对来说,较为实用的有 :
clone : 创建该类的拷贝,并且会复制它当前的状态(如是否被冻结等)。
dup : 复制该类,不会复制状态。
equal?(other) : 如果 other 就是自己这个类,它将返回 true ,不能被重定义。
freeze : 禁止修改该类。在启用此方法后仍尝试修改该类时会报错(TypeError)。
frozen? : 该类被冻结(freeze)时返回 true 。
Time 类里面包含的量只有时间。可用函数如下 :
Time.now : 返回为当前的时间。
self + other : 返回为一个 other 秒以后的时间。
self - other : 当 other 为时间时,返回为两时间的差值且数据类型为 float ,当 other 为数字时,让 self 这个 Time 类的时间提早 other 秒。
strftime(format) : 当 format 值为 ↓
%A 时,返回为星期几,%a 时返回为缩写。
%B 时,返回为月份,%b 依上类推。
%c 时,返回为日期和时间。
%d 时,返回为本月第几日。
%H 时,返回为本日第几个小时,%I 时功能同左,但左边的值的范围是00-24,右边是00-12。
%M 时,返回为本小时第几分钟,%S 时,返回为本分钟第几秒。
%j 时,返回为本年第几天,%U和%W都返回为本年第几周,但%U以周日为起点,%W以周一为起点。
%p 时,返回为上午或下午。
%w 时,返回为本周第几天。
%x 时,返回为日期。
%Y 时,返回为四位数年份,%y 时,返回为两位数年份。
sec : 返回为当前秒。
min : 返回为当前分钟。
hour : 返回为当前小时。
year : 返回为当前年。
mon : 返回为当前月份。
mday : 返回为当前所处星期。
(未完待续)
| 第九节 : 更完整的RGSS语法(未完成) RMVX的脚本中包含了对RMVX固有数据的定义,如角色、道具、动画等。
你可以在脚本编辑器中使用 class Class1 < Actor( 或者 Class、Enemy、Skill )等来将它定义为角色、职业、敌人、技能等。这些类又被集成在了一个叫“RPG”的类中。
下面是 Actor 类(角色)中定义的变量。
下面是 Enemy 类(敌人)中定义的变量。
id :编号。name :名字。battler_name :显示图像的文件名。
battler_hue :显示图像的色相。
maxhp :最大 HP 。
maxmp :最大 MP 。
atk :攻击力。
def :防御力。
spi :精神力。
agi :敏捷度。
hit :命中率。
eva :闪避率。
exp :携带经验。
gold :携带金钱。
drop_item1 :可掉落道具 1 。
drop_item2 :可掉落道具 2 。
levitate :是否悬空。
has_critical :是否可触发暴击。
element_ranks :该类型元素攻击对其有效程度。A - 双倍伤害;B - 1.5 倍伤害;C - 无加成;D - 0.5 倍伤害;E - 无效;F - 1 倍回血
state_ranks :状态对其有效程度,即能触发该状态的几率。A - 100%;B - 80%;C - 60%;D - 40%;E - 20%;F - 0%
actions :可能执行的动作。RPG::Enemy::Action类数组。
note :注释文字。
下面是 Armor 类(防具)中定义的变量。
下面是 Weapon 类(武器)中定义的变量。
下面是 Item 类(道具)中定义的变量。
price : 单价。consumable : 是否可消耗(不是指是否能够使用,而是使用后数量是否减少)。
hp_recovery_rate : HP 回复率。(百分比于最大 HP。)
hp_recovery : HP 回复值。
mp_recovery_rate : MP 回复率。(百分比于最大 MP。)
mp_recovery : MP 回复值。
parameter_type : 加成属性。0 - 无;1 - 最大 HP;2 - 最大 MP;3 - 攻击力;4 - 防御力;5 - 精神力;6 - 敏捷度
parameter_points : 加成点数。加成属性为 parameter_type 。
下面是 State 类(状态)中定义的变量。
id : 状态编号。name : 状态名。icon_index : 状态图标编号。restriction : 触发后对角色行为的限制。0 - 无;1 - 不能使用特技;2 - 只能作出普攻敌人的行为;3 - 只能作出普攻同伴的行为; 4 - 不能移动;5 - 不能移动或闪避priority : 触发优先级。atk_rate : 触发后攻击力与原攻击力的百分比。100 表示无变化。def_rate : 触发后防御力与原防御力的百分比。100 表示无变化。spi_rate : 触发后精神力与原精神力的百分比。100 表示无变化。agi_rate : 触发后敏捷度与原敏捷度的百分比。100 表示无变化。nonresistance : 是否不能抵抗该状态。offset_by_opposite : 是否可以抵消该状态。slip_damage : 是否会连续对状态被施加者造成伤害。伤害为最大 HP / 10 * 随机数(0.9 至 1.1)。reduce_hit_ratio : 是否降低命中率。battle_only : 是否只能在战斗中触发该状态。release_by_damage : 是否在受到伤害后解除。hold_turn : 持续回合数。auto_release_prob : hold_turn 回合数后状态消失的几率。message1 : 玩家被施加该状态时的提示文字。message2 : 敌人被施加该状态时的提示文字。message3 : 状态持续时的提示文字。message4 : 状态消失后的提示文字。element_set : 触发后可抵御的状态。编号数组。state_set : 触发时将取消的状态。编号数组。note : 注释。(未完待续)
|
我开学入高三了,平时会很忙,抽不出时间写教程,对此我表示抱歉。 求火求回复!
教程预告
喵玉特典一 : STG系统解析
第七节 : 绘图
第八节 : 文件输入与输出
第九节 : 更完整的RGSS语法
第十节 : 作曲
第十一节 : RGSS内置数据结构
第十二节 : WIN32API(选学)
第十三节 : 综合能力测试
喵玉特典二 : STG制作框架范例
|
评分
-
查看全部评分
|