赞 | 0 |
VIP | 56 |
好人卡 | 0 |
积分 | 1 |
经验 | 6637 |
最后登录 | 2015-4-23 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 24 小时
- 注册时间
- 2007-2-9
- 帖子
- 397
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 DemonPanda 于 2009-8-2 22:42 编辑
咳咳~大家安静下,我们要开始咯~
事先说明哈,各位如果想学脚本的话,最好最好的入门方法就是看F1里的脚本入门咯(虾米?你问RGSS参考文件用不用看?那个当然不用看,但是在你以后使用脚本的过程中,这个参考文件可是超级超级重要的~)另外就是,一定要耐心看下去!记住,忍耐克己可以战胜一切!
这篇教程主要是“教你如何在Title界面做作者简介”,但是也会解释一些脚本入门里不太好理解的内容,所以,请参考脚本入门学习。本教程针对超级大菜鸟,另外本人也可以算是大菜鸟,所以本文算是技术交流了,有错误、问题请提出来,方便修改,谢谢哈~
这是本教程所用的工程范例下载地址:
DP作者简介.zip
(311.87 KB, 下载次数: 287)
打不开的请看5楼~
==========================================================
========================以下是正式内容=========================
==========================================================
第一步,打开RMVX
第二步,打开脚本编辑器(按F11也可以)
第三步,选择“场景”组中的第二个,也就是Scene_Title
(以上纯属防止超级大菜鸟迷路~)
哗……是不是看到右边一大堆乱七八糟的东西脑袋都大了?没关系哦,慢慢就会适应的~
首先找到第59行到第77行的“更新画面”部分
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update
super
@command_window.update
if Input.trigger?(Input::C)
case @command_window.index
when 0 #New game
command_new_game
when 1 # Continue
command_continue
when 2 # Shutdown
command_shutdown
end
end
end
所谓的update,就是更新画面的意思。
那么def是什么意思呢?def全名define,意为:“定义”。
这里def定义的是update方法。
那么“方法”又是什么意思呢?所谓的方法,也叫函数,打个比方吧,比如一台电视机,它上面有很多的按钮,可以实现不同的功能,那么这些按钮就相当于这里的“方法”。
而“class”则定义的是类。
什么又是类呢?类,就是对象(F1脚本入门里的“对象”说明得很清楚,在此不再赘述)的种类。还拿电视机打比方,这台电视机就相当于一个“类”,其中包含了很多可以针对对象实现功能的按钮(方法)的电视机。不同的电视机就相当于不同的“类”。
大家可以看到这里有一个“super”,它是一个实现重载(重新载入)的关键字。
所谓关键字,就是和普通字不一样的颜色是蓝色的东西呗~
super可以实现将父类中已定义的方法在子类中再次定义。简单来说,就是爹教儿子写字的方法,而儿子在此方法上要有所创新,又不能忘本,所以就要用到super~
大家再看@command_window.update
@command_window是实现创建窗口的一个实变量。
前面有一个@的变量就叫做实变量。实变量的命名规则与变量类似,具体请查阅F1脚本入门中的“变量”一讲。
实变量相当于对象的属性,就像水有液态的属性一样,所以,只要对象在,实变量也是一样在的。换句前辈的话说:实变量是在类定义结束以后才会死……
而 .update (注意!前面有一点!) 的意思是使用update方法。
有人要问咯,我们不是在定义update方法吗?怎么在定义的过程中还能使用啊?
实际上呢,这里用的是其父类Scene_Base的update方法~
至于if、case,太简单了,只要不是智障人士,看F1很快就能学会哦~
我要仔细说的是Input.trigger?(Input::C)
所谓Input,就是一个判断键盘输入情况的模块,具体不用太了解,只要会用就好了。具体可以在F1里搜索Input。“模块”嘛,按F1里的话,就是收集了各种方法的一个大箱子。
trigger? 是一个方法,其意思就是,按了某个键以后,返回true值(在if条件分歧中,如果变量返回的值是true,那么就会运行if一行下面的代码,如果不是,即返回值为false,就会运行else下面的代码);
press?是一直按着某键就会返回true值;
repeat?是一直按着某键每隔一段时间就会返回一个true值。
好啦,回归正题啦~
我们在command_shutdown一行后面加入一段代码:
when 3 #显示图片
command_picture
这段代码是为了让command_picture方法更新的。
有人要问了,为什么在这里用了command_picture方法,但是在脚本中却没有定义捏?
是这样的,command_picture相当于一个端口,是为了能够使用这个方法而创建的,真正的定义内容我放在后面了,不过你把定义放在前面也没人拦着你,就看你怎么喜欢了~
OK~进入下一段代码~
请看第149行到167行的代码
#--------------------------------------------------------------------------
# ● 生成命令窗口
#--------------------------------------------------------------------------
def create_command_window
s1 = Vocab::new_game
s2 = Vocab::continue
s3 = Vocab::shutdown
@command_window = Window_Command.new(172, [s1, s2, s3])
@command_window.x = (544 - @command_window.width) / 2
@command_window.y = 288
if @continue_enabled # 如果「继续」有效
@command_window.index = 1 # 将光标移至「继续游戏」
else # 否则则将「继续游戏」半透明化
@command_window.draw_item(1, false)
end
@command_window.openness = 0
@command_window.open
end
仔细看过数组的同学一定对第五行代码不会陌生, Window_Command.new(172, [s1, s2, s3])中,[s1, s2, s3]就是一个数组,不过它被使用的方法是不是有点奇怪呀?实际上呢,Window_Command功能就是创建一个对话框,可以根据需要修改数组中的数据,达到效果。其中“172”表示的是窗口的宽度。这句代码的含义是生成一个Window_Command类的实例。
所谓“实例”捏,其实和对象的含义是一样的哦,也可以使用对应类中的方法~
那么,原本的代码也可以写成
Window_Command.new(172, [Vocab::new_game, Vocab::continue, Vocab::shutdown])
的形式,但是这样明显很难以理解,所以我们把它分开写成了这样
s1 = Vocab::new_game
s2 = Vocab::continue
s3 = Vocab::shutdown
@command_window = Window_Command.new(172, [s1, s2, s3])
当然,也可以是这样
@command_window = Window_Command.new(172, [s1, s2, s3])
s1 = Vocab::new_game
s2 = Vocab::continue
s3 = Vocab::shutdown
其中Vocab::new_game、Vocab::continue和Vocab::shutdown都用到了Vocab模块的方法,事实上呢,还可以写成Vocab.new_game、Vocab.continue和Vocab.shutdown
好了,接下来我们把这段代码的第二行至第五行改为:
s1 = Vocab::new_game
s2 = Vocab::continue
s3 = Vocab::shutdown
s4 = "作者简介"
@command_window = Window_Command.new(172, [s1, s2, s3, s4])
现在打开游戏看看吧~
哈哈,是不是很兴奋呐?
但是,光标移动到“作者简介”选项上,再按空格,还是没有反应的。
那么接下来,我们就让它有反应吧~
在这之前,我们首先要做两件事情:
一、向外开放两个实变量并将其初始化;
二、定义一个生成图片的方法。
有人看见这个就会犯嘀咕了:好难啊~
其实一点也不难
且看下面的讲解
在定义“命令:离开游戏”的方法后面让我们写这样一段代码:
attr_accessor :a
attr_accessor :b
#--------------------------------------------------------------------------
# ● 初始化 @a @b
#--------------------------------------------------------------------------
def initialize(a = 0, b = 0)
@a = a
@b = b
end
针对F1里对生成实变量的解释,我需要扯两句:
def name #定义name(说白了就是创建一个名叫@name的实变量)
return @name #返回实变量@name
end
def name=(name) #大家注意,这里的是“name=”而不是“name”,其参数为name
@name = name #为@name赋值代入参数name
end
(至于“参数”,请参考F1的“函数”一讲,里面已经解释得很清楚了,在此不再赘述)
以上一段代码,其实表示的就是与
attr_accessor :name
相同的意思,都是创建一个名为@name的实变量,实在想不通的话,会用也可以~
然后我们再看“初始化实变量 @a @b”部分
至于“初始化”,我想F1的“类定义”一讲中已经讲得很清楚了,我只解释一下
(a = 0, b = 0)
这里是为参数a、b代入0,
@a = a
@b = b
然后再将实变量@a、@b分别代入赋值为a和b。
这样,对实变量@a、@b的初始化就结束了,只有当你再一次打开Title场景的时候,它才会再一次初始化。
然后,请在下一行加入以下代码:
#--------------------------------------------------------------------------
# ● 生成图片方法
#--------------------------------------------------------------------------
def creat_a
case @a
when 0
@b = Sprite.new
@b.bitmap = Bitmap.new("Graphics/Pictures/作者简介1")
@a += 1
when 1
@b = Sprite.new
@b.bitmap = Bitmap.new("Graphics/Pictures/作者简介2")
@a += 1
when 2
@b = Sprite.new
@b.bitmap = Bitmap.new("Graphics/Pictures/作者简介3")
@a += 1
when 3
@b = Sprite.new
@b.bitmap = Bitmap.new("Graphics/Pictures/作者简介4")
@a += 1
end
end
这段代码是很单纯的显示图片的代码,看过F1的人应该都能看懂。只不过我把作者简介分了4张图片显示了出来。
但是@a += 1又是什么意思呢?
这个算式是我为这个系统增加的一个小小的功能,就是说,当你进入作者简介后,再从里面退出,然后再进入,就可以显示下一张作者简介(不懂的可以看看范例)
哈哈,累了吗?那么大家赶紧休息休息,因为下面即将进入我们最重要的部分咯~
接着,在下面一行加入一下代码:
#------------------------------------------------------------------
# ● 命令:显示图片
#--------------------------------------------------------------------------
def command_picture
Sound.play_decision
close_command_window
Graphics.fadeout(60)
@a %= 4
creat_a
Graphics.fadein(30)
loop do
Graphics.update
Input.update
if Input.trigger?(Input::LEFT)
Sound.play_cursor
b.dispose
@a += 2
@a %= 4
creat_a
end
if Input.trigger?(Input::RIGHT)
Sound.play_cursor
b.dispose
@a += 4
@a %= 4
creat_a
end
break if Input.trigger?(Input::B)
end
Sound.play_cancel
Graphics.fadeout(60)
@b.dispose
Graphics.fadein(30)
open_command_window
end
哗!一下子懵了么?没关系,由我来给你一点一点抠里面的每个细节~
command_picture很熟悉吧~没错,就是刚才的那个端口所调用的方法,而这个方法我就放在了这里来进行定义。
先看其主体结构:
def command_pirture
loop do
Graphics.update
Input.update
break if Input.trigger?(Input::B)
end
end
非常简单吧~
这其实就是一个更新画面和输入的过程,如果按B键(即x或ESC键 RM里的键位可以在F1的Input中搜索到)。
接着往里面添东西:
def command_pirture
@a %= 4
loop do
Graphics.update
Input.update
if Input.trigger?(Input::LEFT)
b.dispose
@a += 2
@a %= 4
creat_a
end
if Input.trigger?(Input::RIGHT)
b.dispose
@a += 4
@a %= 4
creat_a
end
break if Input.trigger?(Input::B)
end
end
这里的@a %= 4意思是将@a的值除以4所得的余数代入赋值给@a,打个不恰当的比方,就是:
@a = @a % 4
前一个@a是得到赋值的@a,后面的则是赋值前的@a。
为什么要写这个呢?接着往下看
仔细看看这个:
if Input.trigger?(Input::LEFT)
b.dispose
@a += 2
@a %= 4
creat_a
end
用中文说,就是:
如果按了“左”键
释放b
给@a的值加2
给@a的值求余
使用creat_a方法(即显示图片的方法)
结束
那么为什么要释放b呢?请回头看“生成图片方法”部分,我们将@b生成了Sprite类的实例,并显示了图片,现在我们按了“左”键,要切换到另一张图片,自然要把原本的图片删掉,才能显示另一张图片,所以dispose方法就是用来释放图片的,也可以说是删除图片的。
为什么不是@b而是b呢?且看F1的“类定义”一讲中“实变量”小节所提供的代码:
class Person
def name
return @name
end
def name=(name)
@name = name
end
def hello
print "我是" + @name
end
end
alex = Person.new
alex.name = "阿莱库斯"
alex.hello
倒数第二行使用方法的道理与我们的@b、b的道理相通。
至于
@a += 2
@a %= 4
这个是用来计算目前显示的几号图片的,比如,当你按了“左”键,@a的值就会随之变为3(在“生成图片方法”中我们对@a进行了@a += 1运算,然后又有@a += 2和@a %= 4,所以@a的结果变成了3)而图片“作者简介4”所对应的正式@a = 3时的情况,于是,在释放原图片并更新画面后,“作者简介4”就呈现在了我们面前。
好了,接下来我们加一些无关大局的代码:
在def command_picture一行的后面加入一些代码,于是脚本变成了:
def command_picture
Sound.play_decision
close_command_window
Graphics.fadeout(60)
@a %= 4
creat_a
Graphics.fadein(30)
……………………………………
其中Sound.play_decision是播放“决定”音乐
这句就是调用Sound脚本的方法,可以自己找找看Sound有哪些方法可以调用。
常用的有(引自http://rpg.blue/viewthread.php?tid=79667):
Sound.play_decision 播放决定时的SE 大多在C按键按下的判定用
Sound.play_cancel 播放取消键时的SE 大多在B按键按下的判定用
Sound.play_cursor 播放游标移动的SE 大多在方向键按下的判定用
Sound.play_buzzer 播放无效按键时的SE
close_command_window就是关闭选择框的意思,与其对应的是open_command_window,打开选择框,这两个方法都是在Scene_Title里定义的,大家可以找一下。
至于Graphics.fadeout(60)和Graphics.fadein(30),它们是用来淡入淡出的方法,之所以将其分开来写,是因为只有执行完creat_a的方法以后才能让画面淡入,否则……嘿嘿,你可以把Graphics.fadein(30)放在creat_a的前面试一试~
好啦,大功告成咧(累并笑着说)~
赶快打开游戏试一试吧~ |
|