Project1

标题: 超级菜鸟也能看懂?教你如何在Title界面做作者简介 [打印本页]

作者: DemonPanda    时间: 2009-8-2 14:30
标题: 超级菜鸟也能看懂?教你如何在Title界面做作者简介
本帖最后由 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的前面试一试~

好啦,大功告成咧(累并笑着说)~

赶快打开游戏试一试吧~

作者简介DemonPanda.rar

298.9 KB, 下载次数: 232

DemonPanda作者简介.rar

298.88 KB, 下载次数: 127

DemonPanda作者简介.rar

298.88 KB, 下载次数: 125


作者: 小闵    时间: 2009-8-2 21:09
不错,很强大...
只可惜在下是纯脚本小白,看不懂脚本。所以想下范例参考参考...
不过...阁下的范例貌似“能下不能解压”哦。(提示解压文件已损坏...)
...看来只能期待LZ:DemonPanda大大再重新上传一个了。
作者: DemonPanda    时间: 2009-8-2 21:18
恩,已经修改好了,现在可以下载了~
作者: 小闵    时间: 2009-8-2 21:26
恩,已经修改好了,现在可以下载了~
DemonPanda 发表于 2009-8-2 21:18

很遗憾...还是不能解压,我在上帖就已经提到“能下不能解压”,就是下载是没问题,但解压
就解压不能。
作者: DemonPanda    时间: 2009-8-2 21:28
看置顶啦:关于附件损坏的临时解决方案
http://rpg.blue/viewthread.php?tid=130261&extra=page%3D1
作者: 仲秋启明    时间: 2009-8-3 08:18
我现在已经用时间标题了
作者: DemonPanda    时间: 2009-8-3 08:45
事件标题?
呃~偶这个东西主要是针对脚本的哈~
其实我也喜欢用事件标题喔~
作者: DemonPanda    时间: 2009-8-3 08:45
事件标题?
呃~偶这个东西主要是针对脚本的哈~
其实我也喜欢用事件标题喔~
作者: 神龙出世    时间: 2009-8-7 09:14
呃,嗯……修复之后,ms Lz忘了吧一个文件放进去喽~
作者: 水野·迪尔    时间: 2009-8-9 13:06
跳过标题+鼠标图片响应
想在标题做什么都行...
作者: ★星な守望者    时间: 2009-8-9 18:25
提示: 作者被禁止或删除 内容自动屏蔽
作者: DeathKing    时间: 2009-8-10 08:39
虽说我会RGSS,但是看到LZ的排版,顿晕。
作者: 金阿点    时间: 2009-8-28 12:03
啊哈哈。。。。。。。。。。看不懂。。。。莫非俺比菜鸟还菜鸟。。。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1