Project1

标题: [RM中级讨论] 跟我从头学脚本(教学翻译)(已发布) [打印本页]

作者: frantice    时间: 2006-7-24 16:48
标题: [RM中级讨论] 跟我从头学脚本(教学翻译)(已发布)
{/gg}

[LINE]1,#dddddd[/LINE]

电子书版本:http://rpg.blue/web/htm/dj79.htm
整理完整版
http://rpg.blue/upload_program/files/上.doc
http://rpg.blue/upload_program/files/中.doc
http://rpg.blue/upload_program/files/下.doc
另外补上战斗系统讲学.....{/gg},这个战斗教学主要讲的是算法。。
http://rpg.blue/upload_program/files/战斗教学.doc
RGSS游戏系统术语列表(比之前那个Near的完整多了)
http://rpg.blue/upload_program/files/RGSSreference--1.doc
http://rpg.blue/upload_program/files/RGSSreference--2.doc

最后的是事件版SLG,变量的超级运用汉化版因为脚本地方失误所以无法全部完成。 操作: 战斗中按B查看行动力AP和敌人数, 按Z地图上攻击
工程:http://rpg.blue/upload_program/files/LnSmiTactcl.rar
脚本部分修改不完整参照(不要代替工程中的脚本, 因为没有完整地找出所有改动地方, 请新建工程查看)http://rpg.blue/upload_program/files/Scripts中文.rar

以上全部转自Creation Asylum
[LINE]1,#dddddd[/LINE]

原作者: Dubealex 以及 :Near Fantastica(特别讲)
主讲人(翻译): frantice  (充其量新人一个…..)

已翻译时间;853分钟
补充说明:
为了保证规范,一些重要的术语援引原文不翻译,请见谅!本人基础语法不过关,纯实干派,错误的地方请指出!还有,如果大家觉得不好的话,直接回帖叫我不要更新即可,我不介意的…………还有因为电脑关系,贴上来的时候把半角的都弄成全角了,大家注意改下,不然会出错

这里是开学宣言

大家好,我就是传说中的女F。^0^
今天开始我来边翻译边讲述一些关于RGSS和Ruby的教学,
在翻译的基础上融合了大量自己的心得体会,希望能给大家带来一些收获。对于不知道什么是RGSS和Ruby的新人们,我的建议是先把事件弄懂了,然后再看这个教程.我们这个教学的目标是:能够写出属于自己的简单脚本!

教学大纲:
第一讲: Ruby 和RGSS的概况  
第二,三讲: 基本词汇和语法
特别讲: Near Fantastica的RGSS语法列表
第四,五讲: 变量和常量
第六,七,八讲: 条件语句
第九讲:Loop专题
第十讲:Inheritance专题
第十一-----十七讲(重点): Scene和Window 专题
第十八-----二十讲(也是重点): Selectable/Command 窗口专题



第一讲 什么是Ruby?什么是RGSS?

首先请在工程中按下F1看基本知识
我不重复别人说的话了.Ruby它诞生于1993年2月24日,它是面向对象的解释性语言(即00),任何一种00语言都包含以下4个部分:



-Class 类
-Methods 方法
-Messages
-Arguments
-Variables/Constants 变量和常量
它们之间的关系:---------我讨厌贴图
http://ftp2.66rpg.com/3/临时� ...  Battle Arena/1.JPG


一个对象的例子
假设class为一个汽车制造厂 ,那么目标就是汽车. 汽车制造厂包含所有来制造汽车的功能,每辆车都是一种同样东西的不同形式.这些不同的汽车形式也是不同的对象,也可以在不改变其他汽车对象的基础上在加以改造.当汽车公司需要另一辆汽车的时候, 他们只用简单地向汽车制造厂要求制造一辆新车,只要盖好了一个工厂(就是class-类)你就不需要每次都去重复地对汽车(object 对象)操作了.

一个处理对象的例子
在 RPG Maker XP里, 你的人物都有很多属性,如”名字””HP””等级”等等,这些在游戏里都能打开菜单看到.它们是靠后台执行你所发出的指令来完成显示的.

一种方法事实上定义了目标对象接收到什么信息,接受到会发生什么.所以说,每次消息传送或接收,对象都是和它的制造者(class-类)所关联,靠相关的方法来执行.

回到人物的例子,我们就知道了有一种类专门定义人物,这个类有种为你发给目标对象的信息而生成的方法.然后我们就找到一种叫”name”的方法

什么是RGSS?
“Ruby Game Scripting System”是RGSS的全称,它不是一种语言.鉴于大家都知道它是音乐测试左边那个按扭,其他不多说了.
下面看个例子,一行描绘图片的脚本:

image = Sprite.new
image.bitmap = RPG::Cache.picture(name of picture)

理论上,要在屏幕上显示出图片需要2行脚本,因为你要使用一个叫”Sprite”的类, "Sprite" 在RMXP中已事先编好(不在脚本编辑器中).也需要一个module模块 (也不在脚本编辑器中)

RGSS编辑器
脚本里的字体各有颜色,不同的颜色都有什么含义呢?
蓝色: 语法, 如 def, class, end, when, if, case…..
红色: 数字, 如 1, 2, 3, 4,………….
浅蓝色: 符号, 如+, * , = , || ,
绿色: 注释, 不被执行的内容
紫色: 自己看- -

常用快捷键
Control+F  本脚本页中寻找
Control+Shift+F 全局搜索
Control + H  替换
Control + G  转到第几行
http://ftp2.66rpg.com/3/临时� ...  Battle Arena/2.JPG


第二讲 基本词汇和语法(上)


一些基本的废话将完了,我们直接进入正题^0^..接下来的请大家一起跟我实践~
先在RGSS编辑器中新建一个脚本,插入这些:
class Say_Something
  def initialize
    print “I am therefore I’m coded”
  end
end
然后找个npc并在他事件页的脚本那里写入Say_Something.new
点他后我们看到什么了呢?冒出来一个写着” I am therefore I’m coded”的窗口.
这是为什么呢?让我们来一行一行地看:
class Say_Something  这里我们创建了一个叫Say_Something 的class (类)
def initialize  这里我们定义了一种新的方法叫Initialize (初始化)
print “I am therefore I’m coded” 我们增加了当”initialize”的方法被调用时执行的东西
两个end是语法

我们再进一步学习:
“initialize” 是一种默认的方法,当你在事件中调用脚本时候执行. 脚本语句”Say_Something.new” 你用”new”的信息命令 RMXP 来创建Say_Something的对象
关于end:
哪些词语需要用end来结束呢?看看这个.是不是清楚了点呢?:
http://ftp2.66rpg.com/3/临时� ...  Battle Arena/3.JPG

好了,我们回头看看事件页写的那行” Say_Something.new” ,注意到了吗, 它前面没有写对象, 我们可以试着改为” my_object = Say_Something.new” , 效果是一样的,不过心里舒坦了点吧…….这是为什么呢???
这里我们创建了一个新的目标对象叫”my_object” ,它应该是在”Say_Something”这个class里的,但是我们开头那个”Say_Something “,除了一条信息外空空如也..所以我们没必要在事件那里多一个对象.

那么,我们来给这个空空如也的”Say_Something “类多点什么吧!
重新替换开头那行脚本为:
class Say_Something
attr_accessor :greeting
attr_accessor :name
  def initialize(greeting, name)
    @greeting=greeting
    @name=name
  end
  def say
    print @greeting + “ “ + @name
  end
end
然后在那个npc事件脚本里重新写为:
message1=Say_Something.new(“Hello”, “Alex”)
message2=Say_Something.new(“Hello”, “Peter”)
print message1.name
print message2.name
message1.say
message2.say

执行看,是不是华丽多了?我们看到4个冒出来的窗口.分别显示”Alex”,”Peter”,”Hello Alex”和”Hello Peter”
这里我们创建了两个目标”message1”和”message2”他们都依靠”Say_Something”类,就像第一讲里那个汽车厂的例子一样,改变一个是不会影响另一个的.
那么他是如何运行的呢?请看第三讲.


作者: frantice    时间: 2006-7-24 16:48
标题: [RM中级讨论] 跟我从头学脚本(教学翻译)(已发布)
{/gg}

[LINE]1,#dddddd[/LINE]

电子书版本:http://rpg.blue/web/htm/dj79.htm
整理完整版
http://rpg.blue/upload_program/files/上.doc
http://rpg.blue/upload_program/files/中.doc
http://rpg.blue/upload_program/files/下.doc
另外补上战斗系统讲学.....{/gg},这个战斗教学主要讲的是算法。。
http://rpg.blue/upload_program/files/战斗教学.doc
RGSS游戏系统术语列表(比之前那个Near的完整多了)
http://rpg.blue/upload_program/files/RGSSreference--1.doc
http://rpg.blue/upload_program/files/RGSSreference--2.doc

最后的是事件版SLG,变量的超级运用汉化版因为脚本地方失误所以无法全部完成。 操作: 战斗中按B查看行动力AP和敌人数, 按Z地图上攻击
工程:http://rpg.blue/upload_program/files/LnSmiTactcl.rar
脚本部分修改不完整参照(不要代替工程中的脚本, 因为没有完整地找出所有改动地方, 请新建工程查看)http://rpg.blue/upload_program/files/Scripts中文.rar

以上全部转自Creation Asylum
[LINE]1,#dddddd[/LINE]

原作者: Dubealex 以及 :Near Fantastica(特别讲)
主讲人(翻译): frantice  (充其量新人一个…..)

已翻译时间;853分钟
补充说明:
为了保证规范,一些重要的术语援引原文不翻译,请见谅!本人基础语法不过关,纯实干派,错误的地方请指出!还有,如果大家觉得不好的话,直接回帖叫我不要更新即可,我不介意的…………还有因为电脑关系,贴上来的时候把半角的都弄成全角了,大家注意改下,不然会出错

这里是开学宣言

大家好,我就是传说中的女F。^0^
今天开始我来边翻译边讲述一些关于RGSS和Ruby的教学,
在翻译的基础上融合了大量自己的心得体会,希望能给大家带来一些收获。对于不知道什么是RGSS和Ruby的新人们,我的建议是先把事件弄懂了,然后再看这个教程.我们这个教学的目标是:能够写出属于自己的简单脚本!

教学大纲:
第一讲: Ruby 和RGSS的概况  
第二,三讲: 基本词汇和语法
特别讲: Near Fantastica的RGSS语法列表
第四,五讲: 变量和常量
第六,七,八讲: 条件语句
第九讲:Loop专题
第十讲:Inheritance专题
第十一-----十七讲(重点): Scene和Window 专题
第十八-----二十讲(也是重点): Selectable/Command 窗口专题



第一讲 什么是Ruby?什么是RGSS?

首先请在工程中按下F1看基本知识
我不重复别人说的话了.Ruby它诞生于1993年2月24日,它是面向对象的解释性语言(即00),任何一种00语言都包含以下4个部分:



-Class 类
-Methods 方法
-Messages
-Arguments
-Variables/Constants 变量和常量
它们之间的关系:---------我讨厌贴图
http://ftp2.66rpg.com/3/临时� ...  Battle Arena/1.JPG


一个对象的例子
假设class为一个汽车制造厂 ,那么目标就是汽车. 汽车制造厂包含所有来制造汽车的功能,每辆车都是一种同样东西的不同形式.这些不同的汽车形式也是不同的对象,也可以在不改变其他汽车对象的基础上在加以改造.当汽车公司需要另一辆汽车的时候, 他们只用简单地向汽车制造厂要求制造一辆新车,只要盖好了一个工厂(就是class-类)你就不需要每次都去重复地对汽车(object 对象)操作了.

一个处理对象的例子
在 RPG Maker XP里, 你的人物都有很多属性,如”名字””HP””等级”等等,这些在游戏里都能打开菜单看到.它们是靠后台执行你所发出的指令来完成显示的.

一种方法事实上定义了目标对象接收到什么信息,接受到会发生什么.所以说,每次消息传送或接收,对象都是和它的制造者(class-类)所关联,靠相关的方法来执行.

回到人物的例子,我们就知道了有一种类专门定义人物,这个类有种为你发给目标对象的信息而生成的方法.然后我们就找到一种叫”name”的方法

什么是RGSS?
“Ruby Game Scripting System”是RGSS的全称,它不是一种语言.鉴于大家都知道它是音乐测试左边那个按扭,其他不多说了.
下面看个例子,一行描绘图片的脚本:

image = Sprite.new
image.bitmap = RPG::Cache.picture(name of picture)

理论上,要在屏幕上显示出图片需要2行脚本,因为你要使用一个叫”Sprite”的类, "Sprite" 在RMXP中已事先编好(不在脚本编辑器中).也需要一个module模块 (也不在脚本编辑器中)

RGSS编辑器
脚本里的字体各有颜色,不同的颜色都有什么含义呢?
蓝色: 语法, 如 def, class, end, when, if, case…..
红色: 数字, 如 1, 2, 3, 4,………….
浅蓝色: 符号, 如+, * , = , || ,
绿色: 注释, 不被执行的内容
紫色: 自己看- -

常用快捷键
Control+F  本脚本页中寻找
Control+Shift+F 全局搜索
Control + H  替换
Control + G  转到第几行
http://ftp2.66rpg.com/3/临时� ...  Battle Arena/2.JPG


第二讲 基本词汇和语法(上)


一些基本的废话将完了,我们直接进入正题^0^..接下来的请大家一起跟我实践~
先在RGSS编辑器中新建一个脚本,插入这些:
class Say_Something
  def initialize
    print “I am therefore I’m coded”
  end
end
然后找个npc并在他事件页的脚本那里写入Say_Something.new
点他后我们看到什么了呢?冒出来一个写着” I am therefore I’m coded”的窗口.
这是为什么呢?让我们来一行一行地看:
class Say_Something  这里我们创建了一个叫Say_Something 的class (类)
def initialize  这里我们定义了一种新的方法叫Initialize (初始化)
print “I am therefore I’m coded” 我们增加了当”initialize”的方法被调用时执行的东西
两个end是语法

我们再进一步学习:
“initialize” 是一种默认的方法,当你在事件中调用脚本时候执行. 脚本语句”Say_Something.new” 你用”new”的信息命令 RMXP 来创建Say_Something的对象
关于end:
哪些词语需要用end来结束呢?看看这个.是不是清楚了点呢?:
http://ftp2.66rpg.com/3/临时� ...  Battle Arena/3.JPG

好了,我们回头看看事件页写的那行” Say_Something.new” ,注意到了吗, 它前面没有写对象, 我们可以试着改为” my_object = Say_Something.new” , 效果是一样的,不过心里舒坦了点吧…….这是为什么呢???
这里我们创建了一个新的目标对象叫”my_object” ,它应该是在”Say_Something”这个class里的,但是我们开头那个”Say_Something “,除了一条信息外空空如也..所以我们没必要在事件那里多一个对象.

那么,我们来给这个空空如也的”Say_Something “类多点什么吧!
重新替换开头那行脚本为:
class Say_Something
attr_accessor :greeting
attr_accessor :name
  def initialize(greeting, name)
    @greeting=greeting
    @name=name
  end
  def say
    print @greeting + “ “ + @name
  end
end
然后在那个npc事件脚本里重新写为:
message1=Say_Something.new(“Hello”, “Alex”)
message2=Say_Something.new(“Hello”, “Peter”)
print message1.name
print message2.name
message1.say
message2.say

执行看,是不是华丽多了?我们看到4个冒出来的窗口.分别显示”Alex”,”Peter”,”Hello Alex”和”Hello Peter”
这里我们创建了两个目标”message1”和”message2”他们都依靠”Say_Something”类,就像第一讲里那个汽车厂的例子一样,改变一个是不会影响另一个的.
那么他是如何运行的呢?请看第三讲.


作者: 咸蛋超人XY    时间: 2006-7-24 17:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: frantice    时间: 2006-7-24 17:10
……
很复杂的,特别是后面详细得要命……
是字符串…?我改改, 他写的应该是text, 我就直接翻成文章了……= =
开头那几讲翻得不好,自己都看不懂。后面的就好多了
作者: 咸蛋超人XY    时间: 2006-7-24 17:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: frantice    时间: 2006-7-24 17:17
{/dk}{/dk}{/dk}
直接删了,跑去看原文…………
作者: saterick    时间: 2006-7-24 18:08
感觉写得不错,为什么没有下文了?
作者: frantice    时间: 2006-7-24 23:01
第三讲 基本词汇和语法(下)


大家应该没忘记上回的内容吧^0^,好,不废话了,今天继续!
我们来看看他的脚本是怎么写的,因为说明较长,所以给脚本标上了行数:

1 class Say_Something   
我们这里创建了一个新的对象叫"message1"它将做为Say_Something的一个instance来使用.也就是说我们对这个对象的任何操作都是在这个Say_Something类里来定义的".我们已经在这个类的initialize方法里添加了Argument 接收器(不明白的见第一讲的图示), 我们需要发送这些argument .那么怎么发送到这个类里呢?和我们处理它的方法一样,在这个类名里列出他们就行了
2 attr_accessor :greeting
我们在这里定义了一个ATTR 值,全称是 Attribute. 我们可以简单地用ATTR_ACCESSOR 来定义一个新的可读可写,适用于由Say_Something创建的任何对象的instance的功能.我们第一个ATTR 的名字叫greeting.
3 attr_accessor :name
定义另一个ATTR, 名字叫name
4 def initialize(greeting, name)
我们定义了一个新的方法initialize.看过前面教学,你大家应该明白这个initialize 的方法是在一个对象由class类创建时,第一个执行的方法.所以我们添加Argument 接受器,那么这个方法可以被接收到了. 在这个例子中, 这些"argument" (ATTR)是"greeting" 和 "name". 我们在冒号的两边放上这些argument接收器和方法的名字. 注意这些"Argument 接受器是 " "接收者"; 也就是说逗号两边的都是变量名,它们在后来还是有用途的.
5 @greeting=greeting
这里我们新定义了一个"Instance 变量" , 他们把"greeting"这个数据传送出去..一个 instance 变量都由 @ 开头,在同类的每个方法中都非常有用.它们都在方法中定义 通过这样我们就能命令RMXP接收"greeting" 并把它放在"@greeting" 里以便其他方法中调用
6 @name=name
同上,不过这回的attribute是”name”
7 end
结束方法initialize
8 def say
定义一个新的叫”say”的方法
9 print @greeting + " " + @name
我们这样编码,当”say”这个信息被对象接收了会怎么样.这里是显示"@greeting"的内容, 一个空号后加入"@name".的内容.
10 end
结束say的方法定义
11 end
结束 Say_Something 这个类

好了,脚本是看完了,再完整地看一遍:
class Say_Something
attr_accessor :greeting
attr_accessor :name
  def initialize(greeting, name)
    @greeting=greeting
    @name=name
  end
  def say
    print @greeting + “ “ + @name
  end
end
是不是不那么扑朔迷离了??

那么接下来看事件页脚本,我们也一行一行地看^0^.
1 message1=Say_Something.new("Hello", "Alex")
我们创建了一个新的目标对象叫"message1" ,它是类"Say_Something"的一个instance (也就是说我们对这个对象的任何操作都是在这个Say_Something类里来定义的).我们在这个类的initialize 方法里已经添加了 "Argument 接受器" , 我们就要发送这些 argument.
2 message2=Say_Something.new("Hello", "Peter")
同1
3 print message1.name
我们用Ruby 的命令"print" 来显示对象"message1"中储存的name名字.大家可以看到, 只用这个类的ATTR中定义过的name 名字就能获得对象的attributes (内容)
4 print message2.name
同3
5 message1.say
我们现在发送了信息给对象"message1",这个信息就是"say". 然后,你告诉"message1" 执行"say”的功能; 再然后,"message1"在它的类"Say_Something"寻找定义过的命令.就这样,目标对象就返回到了class类中定义过的动作,也就是在屏幕中显示.
6 message2.say
同5

完整地看下事件页这几行脚本:
message1=Say_Something.new("Hello", "Alex")
message2=Say_Something.new("Hello", "Peter")
print message1.name
print message2.name  
message1.say
message2.say

好了,今天的教学就到这了,好好回顾一下前三讲的东西,主要是理论部分较多,需要好好理解~接下来我们就主要学习如何编码了,基础要掌握好才能建好高楼哦~~
作者: frantice    时间: 2006-7-24 23:03
说明一下,刚找到了十七讲后的内容,终于可以往下学了,可惜的是还是不完整的…………{/gg}{/gg}

另外,CMS教学打算取消掉,满世界追着那个作者跑也追不到下文了{/gg}{/gg}
作者: 忧郁    时间: 2006-7-24 23:27
加精,快发~
作者: frantice    时间: 2006-7-24 23:39
特别讲其实是一张词汇表,暂时没处理好(其实是不想处理了- -)

第四讲: 变量和常量(上)


大家好,我们今天开始学习新的内容^0^
变量有很多种,我们一一看来:
1: Local变量.(局部变量)只能和它的方法存在.我们先看下面这个例子:
class Local_Variable
  def method_1
    local_variable=2
  end
  def method_2
    local_variable=3
  end
end
2: Instance 变量.以 @ 开头,必须在方法中被创建..这种变量能在任何同个类的方法中被调用.下面的例子中,方法1创建的Instance 变量和方法2的是一样的.在2中我们把它变为4. 一个Instance变量在一个类中是全局的.
class Instance_Variable
  def method_1
    @instance_variable=2
  end
  def method_2
    @instance_variable=4
  end
end
3: Class变量.以 @@ 开头,只要不在方法中,就必须在类中被创建.建议将它放在类名定义的下面. 一个Class 变量在同类中是通用的,所有此类中的方法都能使用它. 下面的例子中我们创建了一个记数的类.
class Class_Variable
  @@class_variable=0
  def initialize
    @@class_variable+=1
  end
end
4: Global变量(全局变量)在整个游戏中存在,一旦被创建,任何一个类中都能使用它.下面的例子中,我们在一个类中创建了一个全局变量,我们在另一个类中增加了1.
class Global_Variable_1
  def initialize
    $global_variable=0
  end
end
class Global_Variable_2
  def initialize
    $global_variable+=1
  end
end



第五讲: 变量和常量(下)


学习完变量了,现在来学习常量.
常量像一个容器,装载着某个值.它本来不能被改变,但是在Ruby中可以.. 但是只能在这个类中你可以改变它,它的值总是和你给它定义的时候保持一致.下面的例子中,我们可以看到三个类中常量的如何使用.
A_CONSTANT=100
class Constant_Test_1
  ANOTHER_CONSTANT=50
  def initialize
  print ANOTHER_CONSTANT
  print A_CONSTANT
  end
end
class Constant_Test_2
  def initialize
    print Constant_Test_1::ANOTHER_CONSTANT
    print A_CONSTANT
  end
end
class Constant_Test_3
  A_CONSTANT+=1
  def initialize
    print A_CONSTANT
  end
end
首先,我们创建了一个全局变量A_CONSTANT,值为 100. 我们看到这个全局变量是在类之外创建的,它在游戏的每个类中都通用.第一个class类中,我们创建了常量,它是在类中使用的,但是在另一个类中使用正确的语法也能调用它第二个类中我们事实上获得了第一个类中定义的变量.它的句法是这样:
Class_Name::CONSTANT_NAME

使用这样的句法,我们就能在一个类中定义一个常量.也能让其他的类中能使用它.在第三个例子中,我们给全局变量"A_CONSTANT"增加了1, 显示出来就是101.

好了,让我们来测试几遍! 加入脚本后在事件页里写上:
Constant_Test_1.new
Constant_Test_2.new
Constant_Test_3.new
Constant_Test_1.new
这样的格式应该不陌生了吧^0^

我们会发现常量"A_CONSTANT" 在执行Constant_Test_3.new的时候会保持在101这.是因为它一直使用静止不变的"A_CONSTANT"的值也就是 100. 简单地说,常量就是常量,不会改变的量.一定要记住常量不能在方法中被创建或者修改哦~~~


作者: 小湖    时间: 2006-7-25 00:39
看了开头一点 受益匪浅~~~
作者: 血腥蓝    时间: 2006-7-25 01:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雷欧纳德    时间: 2006-7-25 01:29
真得不错!择日发布!
作者: Yurrica    时间: 2006-7-25 01:40
好东东出现鸟~~!!{/se}
作者: isul    时间: 2006-7-25 05:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: 天狼星1110    时间: 2006-7-25 06:43
顶一个……
作者: frantice    时间: 2006-7-25 16:15

第六讲: 条件语句(上)


今天我们来学习条件语句,即常说的”If语句”
首先看两句句子:
if my_variable=0     
if my_variable==0   
看出它们的区别了吗?
后者是正确的,前者是错误的,这是Ruby的基本语法哦~~
好了,说完无关紧要的,我们来测试一下几个例子:
例1:
class If_Statement_1
  @@a_class_variable=10
  def initialize
    @@a_class_variable+=1
    a_local_variable=13
    if @@a_class_variable==a_local_variable
      print "Yay, we are equal !"
    else
      print "Arg, it's not fair !"
    end   
  end
end
脚本放入后事件中调用(应该很熟悉了吧~~):
If_Statement_1.new
If_Statement_1.new
If_Statement_1.new
If_Statement_1.new

出现什么情况?
第三个窗口会是"Yay, we are equal !",因为我们每次调用这个类时都给它的值增加了1, 刚好第三次的时候这个类的值等于了局部变量,也就是@@a_class_variable==a_local_variable RMXP是按以下的程序运行的:
第一次:
@@a_class_variable=10+1 --> 得11
a_local_variable=13
IF语句判断了两个大小,从而得出他们不相等,于是它执行了else的情况.
第二次:
@@a_class_variable=11+1 --> 得12
还是不相等,仍是else
第三次:
相等了,于是显示 "Yay, we are equal !"
第四次以及以后:
都不相等,同1,2.

例2:
class If_Statement_1
  @@a_class_variable=10
  def initialize
    @@a_class_variable+=1
    a_local_variable=13
    if @@a_class_variable==a_local_variable then print "Yay" else print "Arg" end
  end   
end   
看到那行特别长的了吗? 它是没有错误的,因为我们可以把If语句写在一行,当然了,不够美观不够方便.它用于一些小场合.以下是另外两个例子:

例3:
class If_Statement_1
  @@a_class_variable=10
  def initialize
    @@a_class_variable+=1
    a_local_variable=13
    print @@a_class_variable
    if @@a_class_variable==a_local_variable : print "Yay"  end
  end   
end   
比较下例2,我们发现我们可以用” : ”来替换原句中的”then”.继续往下看~

例4:
class If_Statement_1
  @@a_class_variable=10
  def initialize
    @@a_class_variable+=1
    a_local_variable=13
    print @@a_class_variable
    print "Yay" if @@a_class_variable==a_local_variable
  end   
end
这个例子里我们把”end”都省略掉了^0^.看起来更清爽了不? 因为我们重新改造了句子的结构,把结果print "Yay" 加了个”if”显示在” @@a_class_variable 等于 a_local_variable. “的条件前.所以,我们现在知道了If语句有多种表达方式.更高级的例子,留给明天讨论吧,今天学得不少了~~


第七讲: 条件语句(中)


紧接着昨天的if, 我们可以把elsif连在一起使用~先看例子:

class If_Statement_1
  @@a_class_variable=10
  def initialize
    @@a_class_variable+=1
    a_local_variable=13
    if @@a_class_variable==a_local_variable
      print "We Are Equal !"
      elsif @@a_class_variable==12
        print "I Equal 12 !"
        elsif @@a_class_variable != a_local_variable
          print "We aren't equal !"
    end
  end   
end

看清楚哦,是elsif 不是 elseif ~~

使用elsif语句会时程序在if语句中选择,而且不会同时选择两个.否则,当@@a_class_variable 的值等于12,我们就会看到两条信息了就是"I Equal 12 !"和 "We Aren't Equals". 但是事实上条件句只显示第一条信息并跳过了其他的语句返回true值。想做成这样的话,只用简单的用新的elsif作为IF语句,程序就会检查所有语句,然后执行true值时候的情形:
class If_Statement_1
  @@a_class_variable=10
  def initialize
    @@a_class_variable+=1
    a_local_variable=13
    if @@a_class_variable==a_local_variable
      print "We Are Equal !"
    end
    if @@a_class_variable==12   
      print "I Equal 12 !"
    end
    if @@a_class_variable != a_local_variable
      print "We aren't equal !"
    end   
  end
end   
运行看看,我们就能看到当@@a_class_variable的值等于12时能出现两条信息, "I Equal 12 !" 和 "We Aren't Equal". 不过是不是觉得很累赘呢? 因为大部分情况下, 用这么多个 else if , 还不如用下面的Case 语句.

Case 语句是用来检查给出的变量的内容,并列出一组满足每个给定的值时应执行的动作.在  Scene (场景)和Menus (菜单)中会大量出现.我们继续使用上面的例子class_variable:来说明.要记住的是,我们这回要改变事件页脚本那里的写法了^0^
将If_Statement_1.new 改为 Case_Statement_1.new
例1:
class Case_Statement_1
  @@a_class_variable=0
  def initialize
    @@a_class_variable+=1
  case @@a_class_variable
    when 1
      print "I am 1"
    when 2
      print "I am 2"
    when 3
      print "I am 3"
    else
      print "What Am I ?"
    end   
  end
end   
运行下看看, 是不是觉得比那么多个else if 要来得清楚明了呢? 这就是case 语句的优点,
当然了,我们照样可以用”:” 来代替”then”,所以我们可以把语句缩合成这样:
例2:
class Case_Statement_1
  @@a_class_variable=0
  def initialize
    @@a_class_variable+=1
  case @@a_class_variable
    when 1: print "I am 1"
    when 2: print "I am 2"
    when 3: print "I am 3"
    else  print "What Am I ?"
  end   
  end
end   

好了, 大家试试看~今天就讲这么多~
作者: frantice    时间: 2006-7-25 16:17
第八讲: 条件语句(下)


我们今天来学习条件语句的最后一部分”Ranges”
Range (范围) 是由一个起始值和结束值来定义的, 它就是在两个值的中间点上几点. (我们会在今后进一步讲述.)先看下它的基本格式:
开始 .. 结束    -->包括结束的值(两个点)
开始 ...  结束  -->不包括结束的值(三个点)

它具体怎么用呢?让我们继续前几讲的例子:
例1:
class Case_Statement_1
  @@a_class_variable=0
  def initialize
    @@a_class_variable+=1
  print @@a_class_variable
  case @@a_class_variable
    when 1..3: print "I am between 1 and 3"
    when 4..6: print "I am between 4 and 6"
    when 7..9: print "I am between 7 and 9"
    else  print "What Am I ?"
  end   
  end
end
测试的话我们需要在事件中调用更多的Case_Statement_1.new, 10个就能看完效果了

当然了,我们不一定非得用数字的, 我们可以使用字符, 看下面的例子:
例2:
class Case_Statement_1
  @@a_class_variable="a"
  def initialize
    @@a_class_variable.next!
  case @@a_class_variable
    when "b": print "I am B"
    when "c": print "I am C"
    when "d": print "I am D"
    else  print "What Am I ?"
  end   
  end
end   
这个例子我们有一个.next! 的命令,它是干吗用的呢?它是用来增加一个字符到它下一个逻辑值,而逻辑值取决于它在字符最右边的字母.不是很明白吧, 我们再看下几个例子:
a_string="ab"
a_string.next!
--> a_string 的值等于 "ac"

another_string="name102"
another_string.next!
--> another_string的值等于 "name103"

好了^0^, 回到我们的Case 例子,我们看到它也是运用字符的,明白了.next! 的原理相信结合起来理解没有问题了吧~今天就到这, 下次我们又要学习新的内容啦~~
作者: frantice    时间: 2006-7-25 16:22
台风过境,乌飞兔走……先更到制作窗口前。昨天晚上全部翻完了。{/gg}

第九讲 Loop 专题

我们先来看看几行脚本:
例1:
class For_Loop_Sample
  def initialize
    a_local_variable=0
    for i in 1..10
      a_local_variable+=1
      print a_local_variable
    end   
  end
end
这是个重复10次给"a_local_variable"增加1 并显示出结果的功能. 从 1 到 10, 包括 10. 还记得上次我们学过的Range的基本格式吧^0^ 它和我们今天要学的for.. loop格式是一致的. 所以我们如果写成"0...10" 而不是 "1..10"的话,结果还是一模一样的.
顺便说下, 大家发现里面有个i 了吗? 它代表什么呢?.为什么是i 而不是o , m 等等呢?
其实i 是 "Iteration"的缩写, Iteration 就是重复的意思.

我们今天要学习的For .. Loop 就是不断执行动作直到达到结束值为止For .. Loop 就是一直重复着动作并储存变量i 的数量. 我们可以用任何数字(字符)作为起始值和结束值来完成For .. Loop语句. 我们刚学过Range 使用两个点(..) 或三个点 (...). 两个点说明它从起始值开始循环到结束值,并包括结束值. 三个点则不包括结束值.我们看下例子:
例2:
  1. class For_Loop_Sample
  2.   def initialize
  3.     for i in 1..4
  4.       print $game_actors[i].name
  5.     end   
  6.   end
  7. end  
复制代码


默认情况下测试,我们就能看到显示出4个人物的名字.它是怎么样运行的呢?
i = 1 时: 我们得到ID为1 的人物的名字, i 是个变量, $game_actors[ i].name 是值id 为i 的角色的名字(可以参考特别讲Near Fantastica 的RGSS语法列表)
i = 2 , i = 3 , i =4 时类推

这种写法在RGSS中大量出现,特别是在Window_MenuStatus中, 因为RMXP 在这里用For..Loop.列出了人物. 这是很常用的写法, 今后我们还会接触到很多, 所以要好好掌握哦~~
最后我们看看下面这行脚本:
例3:
  1. class For_Loop_Sample
  2.   def initialize
  3.     a_loacal_variable=1
  4.     another_local_variable=4
  5.     for i in a_loacal_variable..another_local_variable
  6.       print $game_actors[i].name
  7.     end   
  8.   end
  9. end  
复制代码

和例2有点不同对不对??但是它们的效果是一样的.是不是有点启发了??


第十讲 Inheritance专题

在学习loop之后我们学习inheritance. 什么是inheritance 呢? 用中文讲是 “传承”, 我们可以用一个类来”继承”另一个类的方法和数据(变量).互相”继承”的类分别叫”父类”和”子类”,也就是”超级类”(superclass)和”附属类”(subclass).我们看下例子:
例1:
class Inheritance_Sample_1
  def initialize
    @a_local_variable=1     
  end
end  

class Inheritance_Sample_2 < Inheritance_Sample_1
  def initialize
    super
    print @a_local_variable
  end
end  
测试一下, 插入脚本后在事件脚本里写:
Inheritance_Sample_2.new

看到效果吧^0^. 这是怎么做到的呢? 这就是类的继承.我们在一个类名右边写上< 号,再在右边写上它的超级类(父类)的名字 . 这个例子中"Inheritance_Sample_2" 是附属类 而"Inheritance_Sample_1" 是超级类.通俗地说也就是我们可以从Inheritance_Sample_1这个父类里拿出东西来给Inheritance_Sample_2用.
我们在"Inheritance_Sample_2"这个类里初始化方法下可以找到一个”super”它是做什么的? 它其实就是简单地执行在超级类中定义过的,并且有名字相同的方法.我们看下程序是如何运行的:
[接收 .new 命令]
-执行Inheritance_Sample_2中的初始化方法
-发现一个关键词"super"
-->检查它的超级类,在Inheritance_Sample_1 中找到了
- 执行在超级类Inheritance_Sample_1 中定义的方法
--> 初始化方法@a_local_variable=1
- 程序在Inheritance_Sample_2 中继续执行这个初始化方法
--> @a_local_variable等于 1
- 在屏幕上显示 @a_local_variable
-结束

进一步图说:----------我讨厌贴图= = 每次都贴不上去。。。



作为这一讲的收尾,也作为我们下一讲的语系,我列出RMXP中默认的所有窗口以及它们的父类.

基本窗口
类        内容        父类       
Window_Base        基本窗口        Window       
Window_Selectable        项目选择窗口        Window_Base       
其他窗口
类        内容        父类       
Window_Command        指令窗口(泛用)        Window_Selectable       
Window_Help        帮助窗口        Window_Base       
Window_Gold        显示金钱窗口        Window_Base       
Window_PlayTime        菜单画面用 游戏时间窗口        Window_Base       
Window_Steps        菜单画面用 步数窗口        Window_Base       
Window_MenuStatus        菜单画面用 状态窗口        Window_Selectable       
Window_Item        物品选择窗口        Window_Selectable       
Window_Skill        特技选择窗口        Window_Selectable       
Window_SkillStatus        特技画面用 状态窗口        Window_Base       
Window_Target        物品、特技画面用 对象选择窗口        Window_Selectable       
Window_EquipLeft        装备画面用 左侧窗口        Window_Base       
Window_EquipRight        装备画面用 右侧窗口        Window_Selectable       
Window_EquipItem        装备画面用 物品窗口        Window_Selectable       
Window_Status        状态画面用 状态窗口        Window_Base       
Window_SaveFile        存档、读档画面用 文件窗口        Window_Base       
Window_ShopCommand        商店画面用 商品选择窗口        Window_Selectable       
Window_ShopBuy        商店画面用 购买窗口        Window_Selectable       
Window_ShopSell        商店画面用 出售窗口        Window_Selectable       
Window_ShopNumber        商店画面用 数量输入窗口        Window_Base       
Window_ShopStatus        商店画面用 状态窗口        Window_Base       
Window_NameEdit        名称输入画面用 名称窗口        Window_Base       
Window_NameInput        名称输入画面用 文字选择窗口        Window_Base       
Window_InputNumber        数值输入窗口        Window_Base       
Window_Message        信息窗口        Window_Selectable       
Window_PartyCommand        战斗画面用 同伴指令窗口        Window_Selectable       
Window_BattleStatus        战斗画面用 状态窗口        Window_Base       
Window_BattleResult        战斗画面用 结果显示窗口        Window_Base       
Window_DebugLeft        调试画面用 左侧窗口        Window_Selectable       
Window_DebugRight        调试画面用 右侧窗口        Window_Selectable       
箭头光标
类        内容        父类       
Arrow_Base        箭头光标        Sprite       
Arrow_Enemy        敌人选择用 箭头光标        Arrow_Base       
Arrow_Actor        角色选择用 箭头光标        Arrow_Base       



作者: frantice    时间: 2006-7-25 16:25
特别讲 Near Fantastica的RGSS语法列表


今天主要地看下RGSS的重要代码,记忆是不要求的,但是这里由Near Fantastica 总结出的重要字对于今后脚本的修改编写都有非常重要的作用,女F特别给每个词都做出了解释,所以可以省去很多查找的麻烦啦^0^

1---有关Actors (人物) 数据   
代码: $data_actors[id].
id   ID,数字,人物编号
name 人物名字
class_id  职业ID
initial_level  初始等级
exp_basis 基本经验
character_name 角色文件名
character_hue 角色色相
battler_name 战斗者文件名
battler_hue  战斗者色相
weapon_id 武器ID
weapon_fix 武器固定
armor1_id  盾牌ID
armor2_id 头ID
armor3_id 身体防具ID
armor4_id 装饰品ID

2---有关Actors 的 Current 属性   
代码:  $game_actors[id].
maxhp  血最大量
maxsp  魔最大量
level 等级
exp 经验
str  力量
dex 灵巧
agi 速度
int 魔力
atk  攻击
pdef 物理防御
mdef 魔法防御
eva   回避修正


3 有关Armor (装备)
代码: $data_armors[id].
id  ID号
name  名字
icon_name 图标的名字
kind 种类
auto_state_id 自动状态ID
price  价格
pdef 物理防御
mdef 魔法防御
eva 回避修正
str_plus  增加的力量
dex_plus 增加的灵巧
agi_plus  增加的速度
int_plus  增加的魔力
guard_element_set[id] 属性防御

4 各种classes      
代码: $data_classes[id]
position 角色位置(前卫,中卫,后卫)
weapon_set 可装备武器
armor_set 可装备防具
state_ranks 状态有效度
element_rank 属性有效度
learnings[level,skill_id] 习得技能

5 有关公共事件         
代码: $data_common_events[id].
name 名字
trigger 获取目标
switch_id  开关ID

6 有关敌人     
代码: $data_enemies[id].
name 名
maxhp 最高HP
maxsp 最高SP
str 力量
dex 灵巧
agi 速度
int 魔力
atk 攻击
pdef 物理防御
mdef 魔法防御
animation1_id 普通攻击攻击方动画ID
animation2_id 普通攻击对象方动画ID
exp 经验
gold 金钱
item_id 物品ID
weapon_id 武器ID
armor_id 装备ID
treasure_prob 宝物出现率
battler_name 战斗者文件名
battler_hue  战斗者色相

7 有关物品  
代码: $data_items[id].
name 名
occasion 可以使用的时机
icon_name 图标文件名
description 描述
price 价格
common_event_id 公共事件ID
scope 使用的范围
consumable  消耗

8 有关技能  
代码: $data_skills[id].
icon_name 图标文件名
description 描述
scope 特技或是物品的范围
occasion 可以使用的时机
animation1_id 普通攻击攻击方动画ID
animation2_id 普通攻击对象方动画ID
common_event_id 公共事件ID
sp_cost  消费的SP
power 威力
atk_f 关联的攻击
eva_f 关联的回避
str_f 关联的力量
dex_f 关联的灵巧
agi_f 关联的速度
int_f 关联的魔力
hit 攻击
pdef_f 关联的物防
mdef_f 关联的魔防
variance 分散
element_set[id]

9 有关状态   
代码; $data_states[id].
animation_id 动画ID
restriction 限制
nonresistance 不可抵抗
zero_hp HP为0
cant_get_exp 不能获得经验
cant_evade 无法回避
slip_damage 连续伤害
rating 比例
hit_rate 命中率
eva 回避修正
battle_only 战斗后解除
hold_turn 自然解除
shock_release_prob 状态攻击解除
auto_release_prob 状态自动解除
plus_state_set[id] 状态变化为+
minus_state_set[id] 状态变化为-
guard_element_set[id] 防具防御属性


作者: ccen3020    时间: 2006-7-25 16:26
问下,这个是不是完结了?

我下回来看{/fd}
作者: frantice    时间: 2006-7-25 16:28
总共20讲,前面10讲(就是今天更新的)全部是基本知识,
11讲-17讲 主要教怎么制作窗口
18-20讲 是制作选项窗口(融合CMS教学)

剩下来的只能等作者更了,事实上他已经半年多没更了……
作者: ccen3020    时间: 2006-7-25 16:38
CMS是什么{/hx}
作者: frantice    时间: 2006-7-25 16:46
Custom Menu System
国外流行的菜单样式, 类似FF7菜单(神迹时代用的那个)的样子

CMS更偏向于一种泛称,即自己创建的菜单。
(本人理解……
其实菜单类是脚本中感觉最简单最容易上手的……)

作者: 非常白菜    时间: 2006-7-25 18:33
为啥没有自制战斗系统...{/ll}

老外们就重视外表的华丽...{/ll}
作者: isul    时间: 2006-7-25 19:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: koalli    时间: 2006-7-25 21:06
好详细。。。好多。。。看得好晕```
作者: frantice    时间: 2006-7-25 22:37
以下引用非常白菜于2006-7-25 10:33:53的发言:

为啥没有自制战斗系统...

老外们就重视外表的华丽...


脚本从菜单学起

不过我也一直在想作者已经写完菜单教学了,下一步会不会就是自制战斗{/cy}{/cy}
作者: link006007    时间: 2006-7-25 22:42
支持下...不过全部看下来还需要的点毅力{/gg}

针对楼下补上一句: "真是服了楼主了,全文翻译... ...膜拜下,我连看都不行"
作者: frantice    时间: 2006-7-25 22:45
以下引用link006007于2006-7-25 14:42:14的发言:

支持下...不过全部看下来还需要的点毅力


看看还费力气,那我翻呢?
我是边看原文边测试边翻的,有的还为了验证几个字测试好几遍。
三大部分总共翻了853分钟。不看就算了,我自己打印出来看。
自我陶醉也行。
作者: 柳柳    时间: 2006-7-25 22:47
正好和我签名暗合(写个从中级开始的教学,从入门开始的这里有了)

另,楼主的头像- -b
作者: 小湖    时间: 2006-7-25 22:52
以下引用柳柳于2006-7-25 14:47:55的发言:

正好和我签名暗合(写个从中级开始的教学,从入门开始的这里有了)

另,楼主的头像- -b

第一眼看到我以为是一只老鼠在上吊{/jk}………………(头上的羽毛看成绳子了……而且那个表情…………)
作者: frantice    时间: 2006-7-25 22:56
以下引用小湖于2006-7-25 14:52:11的发言:

第一眼看到我以为是一只老鼠在上吊………………(头上的羽毛看成绳子了……而且那个表情…………)


真是哪壶不开提哪壶…………
居然这么说我的头像…………
要不要出来决斗{/fn}
家伙自带{/fn}
担架准备一副,绷带若干,金疮药自行料理{/fn}

作者: 忧郁    时间: 2006-7-28 06:05
frantice为啥米继续了捏?
作者: OCTSJimmy    时间: 2006-7-28 07:16
非常好……我急需……极度感激中…………
作者: frantice    时间: 2006-7-28 17:58
来更了,先……


第十一讲: Scene和Window 专题一


终于开始动手实践创建自己的窗口了^0^, 这讲开始请务必跟着我一起实践^0^, 遇到什么不懂的地方请查看以往的教学~
我们先自己建立个脚本的,名字叫My_Window, 这样今后查看方便,而且测试时候也方便,只用在事件中调用:
My_Window.new 就行了

好了, 现在开始写脚本.
先给它一个父类, 我们这个窗口是不用于选择的, 所以就用Window_Base作为父类.
class My_Window < Window_Base
  def initialize
    super(0, 0, 200, 200)
  end
end
如果测试的话, 我们会发现它会等一会儿就消失了,这很正常,因为Scene_Map这个东西; 我们没有告诉它要刷新这个窗口.我们待会儿告诉它,我们现在只是建个简单的窗口.
我们用super(x坐标, y 坐标, 宽度, 高度)来建立了一个窗口
上一讲中学习过"super",那我们这里它继承什么东西呢?因为这里 Window_Base是父类, 所以我们看看父类中都初始化了什么东西^0^
def initialize(x, y, width, height)
super()
@windowskin_name = $game_system.windowskin_name
self.windowskin = RPG::Cache.windowskin(@windowskin_name)
self.x = x
self.y = y
self.width = width
self.height = height
self.z = 100
end
这个方法在每个window窗口中都被援引,它定义了窗口的大小,位置,皮肤等等特性.
那么它后面跟着的def initialize(x, y, width, height)是做什么的呢?
我们看看RMXP的运行过程吧~:
[编译super语句]
- 接收到 "super" 指令
--> 在 Window_Base中, 我们设定了以下东西, 用super 发送出去
-> x=0
-> y=0
-> width=200
->height=200
--> 窗口建成
-回到window 编码
[结束]

好了, 回到刚才编好的窗口, 它很难看, 什么都没有, 总得给它添加点什么吧^  ^

class My_Window < Window_Base
  def initialize
    super(0, 0, 200, 200)
    self.contents = Bitmap.new(width-32, height-32)
    self.contents.font.name = "黑体"   
    self.contents.font.size = 20
    self.contents.draw_text(0, 0, 200, 32, "Yay, some text !")
  end
end
必须要有3行来添加文字, 因为我们需要写明它的字体, 字号, 以及要写什么东西.3 好了,继续解释每行的原理:
self.contents = Bitmap.new(width-32, height-32)
这个是干什么的?我们知道了,我们窗口的内容都要是"Bitmap" 类型 (Bitmap不在脚本编辑器中定义). 这样我们就能在窗口中写入文章.
要知道为什么要减去32吗? 因为箭头指着的数据是仍然要被看到, 也许是因为bitmap事实上要比window 大一点吧^0^ .(这也就是文字会被窗口的边缘给咯擦掉的原因啦)
self.contents.draw_text(0, 0, 200, 32, "Yay, some text !")
这行真正地定义了你的文章, 它个格式就是(x坐标, y 坐标, 宽度, 高度,”内容”)

当然,有些文章是用另一个方法来写的,那就是 "refresh". 它只用于当窗口显示的时候需要改变内容的,如 Window_PlayTime (游戏时间), 不过不是 Window_Gold.哦~~

好了, 我们先做个笔记, 下面是我们要做出来的效果图. 我们需要创建3个window啦. (这个是英文原图,我后面会贴出中文图)



作者: link006007    时间: 2006-7-28 18:03
讲到Window类了,楼主辛苦了...
什么时候回到sprite类?那个很有趣的说{/cy}
作者: frantice    时间: 2006-7-28 18:06
以下引用link006007于2006-7-28 10:03:46的发言:

讲到Window类了,楼主辛苦了...
什么时候回到sprite类?那个很有趣的说


哼哼……翻完窗口我就扯周边(地图,事件之类去了)




作者: link006007    时间: 2006-7-28 18:12
以下引用frantice于2006-7-28 10:06:59的发言:
哼哼……翻完窗口我就扯周边(地图,事件之类去了)

那个应该要先扯的啊...既然都到窗口了,那就顺理成章的讲sprite或scence吧.要循序渐进,不要拐啊拐的... ...
唉,你是楼主你决定,无所谓啊~~~~~无所谓啊~~~~~
作者: frantice    时间: 2006-7-28 18:16
以下引用link006007于2006-7-28 10:12:27的发言:

那个应该要先扯的啊...既然都到窗口了,那就顺理成章的讲sprite或scence吧.要循序渐进,不要拐啊拐的... ...
唉,你是楼主你决定,无所谓啊~~~~~无所谓啊~~~~~


我是楼主又怎么样,人家作者都不写了啊…………
{/ll}{/ll}{/ll}{/ll}{/ll}{/ll}

再说了,不是有这个:
以下引用柳柳于2006-7-25 14:47:55的发言:

正好和我签名暗合(写个从中级开始的教学,从入门开始的这里有了)


吗………………{/hx}{/hx}{/hx}

我最近又对对话框和血条比较感兴趣……对菜单没兴趣了…………
作者: link006007    时间: 2006-7-28 18:24
以下引用frantice于2006-7-28 10:16:13的发言:
我是楼主又怎么样,人家作者都不写了啊…………

汗...sprite无望
再说了,不是有这个:

以下引用柳柳于2006-7-25 14:47:55的发言:

正好和我签名暗合(写个从中级开始的教学,从入门开始的这里有了)

这个消息放出有点年头了


作者: frantice    时间: 2006-7-28 23:10
第十二讲: Scene和Window 专题二


我们讲到哪了?嗯嗯,我们已经建立了一个空空的窗口,现在需要再加入三个新的窗口.
窗口1
第一个窗口应该是在顶端,显示游戏时间,金钱和地图ID.(见示意图)这个窗口是最简单的.我们在脚本编辑器里把三个显示的scene都放在一页便于修改.但是作为教程,我们还是各自建立一个窗口比较好.所以呢,我们先插入新的空脚本,名字就叫Window_1
(牢记: 我们必须在超级类的下面插入自己的脚本- 这就是为什么我们一直要把脚本插在紧贴MAIN前的原因.)
脚本:
class Window_1 < Window_Base
  #BLOCK 1
  def initialize
    super(0, 0, 640,100)
    self.contents = Bitmap.new(width-32, height-32)
    self.contents.font.name = "黑体"   
    self.contents.font.size = 20
    refresh
  end
  #BLOCK 2
  def refresh
    self.contents.clear
    self.contents.font.color = text_color(6)
    self.contents.draw_text(0, 0, 100, 32, "游戏时间:")
    #显示游戏时间 (从 Window_PlayTime中Copy来)
    @total_sec = Graphics.frame_count / Graphics.frame_rate
    hour = @total_sec / 60 / 60
    min = @total_sec / 60 % 60
    sec = @total_sec % 60
    text = sprintf("%02d:%02d:%02d", hour, min, sec)
    self.contents.font.color = normal_color
    self.contents.draw_text(100, 0, 120, 32, text)
    # 结束显示游戏时间的编码
    #BLOCK 3
    self.contents.font.color = text_color(6)
    self.contents.draw_text(250, 0, 50, 32, "金钱:")
    self.contents.font.color = text_color(0)
    self.contents.draw_text(305, 0, 100, 32, $game_party.gold.to_s)
    #BLOCK 4
    self.contents.font.color = text_color(6)
    self.contents.draw_text(400, 0, 100, 32, "地图 ID:")
    self.contents.font.color = text_color(0)
    self.contents.draw_text(480, 0, 100, 32, $game_map.map_id.to_s)
  end
  #BLOCK 5
  def update
    if Graphics.frame_count / Graphics.frame_rate != @total_sec
      refresh
    end
  end
end
为了便于教学,我分开了5个 blocks, 这样一行一行讲下来:^0^
BLOCK 1:
1 def initialize
2 super(0, 0, 640,100)
3 self.contents = Bitmap.new(width-32, height-32)
4 self.contents.font.name = "黑体"
5 self.contents.font.size =20
6 refresh
7 end
很熟悉吧,对,就是我们上一讲里学过的.不过多了一个refresh, 也就是刷新. 当然了, 单单一个refresh 是不行的, 还没定义过呢~!
BLOCK 2:
1 def refresh
2 self.contents.clear
3 self.contents.font.color = text_color(6)
4 self.contents.draw_text(0, 0, 100, 32, "游戏时间:")
5 #显示游戏时间 (从 Window_PlayTime里copy而来)
6 @total_sec = Graphics.frame_count / Graphics.frame_rate
7 hour = @total_sec / 60 / 60
8 min = @total_sec / 60 % 60
9 sec = @total_sec % 60
10 text = sprintf("%02d:%02d:%02d", hour, min, sec)
11 self.contents.font.color = normal_color
12 self.contents.draw_text(100, 0, 120, 32, text)
13 #结束编写显示游戏时间
1-2行   我们上面说了refresh还没定义过, 所以这里就给它定义了. 它都干些什么呢?我们看到,第一件事情就是把窗口的内容给清空了,那为什么我们要先把它给清空呢?..那是因为我们要在后面的scene里对这个的窗口的内容进行刷新来显示游戏时间, 我们不需要这个文章显示一遍又一遍,所以把它清理干净会比较清爽^0^ .
3-4行   他们是显示”游戏时间”这4个字的,上一课也讲过. 那么self.contents.font.color = text_color(6) 是干什么的?它是描绘文章的字体颜色的..括号里的数字6显示的颜色是在Window_Base (父类) 中定义的.
6行  这里创建了一个新变量叫@total_sec, 并让它的值等于游戏的时间.怎么计算的呢?我们应该知道FPS吧, 它是frame per seconds的缩写, 意思就是每秒的桢数.游戏时间就等于总共的桢数/每秒的桢数.比如说
- 游戏已运行了12450 桢
- 游戏的 FPS (每秒的桢数) 是 30.
- 那么12450/30=415 --> 415 秒就是游戏时间.
7行  知道总秒数了,可是总不能就那么当游戏时间让人看吧=.=, 还得转换为几小时几分几秒.这行就是计算小时的.RMXP是没有小数的,所以当不满1小时的时候就为0
8行  看到这里大家会不解了, “ % “是什么东西?? 为了方便起见,我们就把它理解为余数,比如说17%3, 答案应该是2, 60/60=1, 那么60%60=0. (415 / 60) % 60 = 6.916 --> 6 分 (RMXP中不显示小数)
10 行 又是一个难懂的表达, sprintf("%02d:%02d:%02d", hour, min, sec) .首先要解释什么是sprintf, Ruby 的 sprintf 格式与 C 语言的 sprintf(3) 基本相同. 但还是有些差别, 比如它没有如 short 或 long 等针对 C 特有类型的修饰符, 它包含 2 进制数的指示符, 它不支持 sprintf 的方言式的语法. 这是引用RMXP帮助的说法, 那里解释得比较详细. 我这里就用图来说明吧~如果不懂没关系的, 我们只要知道是什么东西就知道了^0^


11行和12行就不详细说了, 好了,今天要学的就到这里了~
作者: fbean    时间: 2006-7-29 05:30
真糟糕,我来早了,已经没有了~
作者: OCTSJimmy    时间: 2006-7-29 23:38
我准备制作一个
《跟我从头学脚本(教学翻译)》的CHM……不知是否可行?……
作者: OCTSJimmy    时间: 2006-7-30 00:38
跟我从头学脚本(教学翻译)的CHM文件已经做好了,请F过目,撒花……

谢谢……

点此下载(链接已过期)
作者: frantice    时间: 2006-7-31 17:03
第十三讲: Scene和Window 专题三


我们继续上一将的内容, 今天开始分析BLOCK3:
BLOCK 3:
1 self.contents.font.color = text_color(6)
2 self.contents.draw_text(250, 0, 50, 32, "Gold:")
3 self.contents.font.color = text_color(0)
4 self.contents.draw_text(305, 0, 100, 32, $game_party.gold.to_s)

我们对前3行都应该不陌生了,现在着重看下第4行.末尾的 to_s 是把前面的$game_party.gold转换为字符串, 这样我们就能把它作为文章显示出来. 所以呢,如果我们把一个包含数值的变量放在前面,那么就会报错"Cannot convert Fixnum into String".

BLOCK4 基本和3一样, 只是用地图ID代替了金钱, 所以我们直接跳过去,看最后一快,update.

BLOCK 5:
1 def update
2 if Graphics.frame_count / Graphics.frame_rate != @total_sec
3 refresh
4 end
5 end
6 end
这里我们定义了update方法. 我们会发现, 这种方法不在window内使用, 而是在scene里使用,它更新已存在的窗口, 因为我们在scene 里让它更新.不需要update 的窗口没有任何update 方法, 在后面的Scene 里我们会有更好的了解.
我们现在看第2行.它是什么意思呢? 它是个if 语句, != 代表”不等于”,那么这里的if 就是当时间发生变化的时候, 就刷新. 这样, 新的时间就出来了.

好了,这么一个窗口就做好了, 我们来做第2个窗口, 就是左边显示人物名字和职业的那栏(见示意图)在原先的Window_1下面添加Window_2.
代码:
  1. class Window_2 < Window_Base
  2.   #BLOCK 1
  3.   def initialize
  4.     super(0, 0, 200,380)
  5.     self.contents = Bitmap.new(width-32, height-32)
  6.     self.contents.font.name = "黑体"   
  7.     self.contents.font.size = 20
  8.     #BLOCK 2
  9.     for i in 0...$game_party.actors.size
  10.       x = 0
  11.       y = i * 90
  12.       actor = $game_party.actors[i]
  13.       self.contents.font.color = text_color(6)
  14.       self.contents.draw_text(x, y, 200, 32, actor.name)
  15.       self.contents.font.color = text_color(4)
  16.       self.contents.draw_text(x, y+32, 200, 32, actor.class_name)
  17.     end
  18.   end
  19. end

复制代码

这里我们继续给它分成2块.
BLOCK1 和前面的一样,不多解释了,
BLOCK2
第一行:这是个for… loop语句. .size 是ruby的一个命令,用来知道一个数组,或者一个字符串的大小. $game_party.actors就是一个数组变量, 它包含了当前队伍中的人物. 要知道的是数组的编号是从0开始, 而不是从1 开始的.也就是说, 你队伍中的第一个人的ID不是1, 而是0 . 所以呢,这里的for…loop就从0开始, 到当前队伍总人数为止.(3个点, 不包括这个数) 那为什么不能包括最后一个数呢? 假设有4个人的队伍, 那么i 的值就应该是0, 1, 2, 3. 也就是for i in 0…4 ,明白了吗? 4是人物数量, 但是不能算进去.
第二,三行 因为我们还在loop的循环中, 所以我们这里的计算并不是一次完成的. x=0, 就创建了一个局部变量,值为0,  y = i * 90,也创建了一个局部变量, 值应该是为0, 90, 180, 270.
第四行;  这行是来节省空间的, 并不是必须的一行.但是它很管用, 因为它使下面几行变得更容易理解.看看它是怎么工作的吧:
首先它创建了一个局部变量叫actor, 让它为$game_party.actors[ i ].
--> 然后呢,下面几行中,我们就能用actor.name 的表达来代替$game_party.actors[ID].name , 是不是很方便呢?
第六行:  因为有了第四行,我们这里的表达也清爽多了^0^
第八行:  和第六行类似,除了y 坐标..我们用 y+32 因为我们需要在角色的名字下面显示他的职业(要记住y 值越大显示得就越下面哦) 之所以是32是因为我们什么地方都是32的高度,而且这样也很合适.



第十四讲: Scene和Window 专题四


还有最后一个window ^0^, 就是右边那个显示人名, 等级, HPSP, 以及经验的那部分.新建个脚本Window_3
代码:
  1. class Window_3 < Window_Base
  2.   #BLOCK 1
  3.   def initialize
  4.     super(0, 0, 440,380)
  5.     self.contents = Bitmap.new(width-32, height-32)
  6.     self.contents.font.name = "黑体"   
  7.     self.contents.font.size = 20
  8.     #BLOCK 2
  9.     for i in 0...$game_party.actors.size
  10.       x = 0
  11.       y = i * 150
  12.       if i >= 2
  13.         x=250
  14.         y-=300
  15.       end      
  16.       actor = $game_party.actors[i]
  17.       self.contents.font.color = text_color(6)
  18.       self.contents.draw_text(x, y, 200, 32, actor.name)
  19.       offset_x=contents.text_size(actor.name).width+10
  20.       self.contents.font.color = text_color(4)
  21.       self.contents.draw_text(x+offset_x, y, 200, 32, "Lv: " + actor.level.to_s)
  22.       draw_actor_hp(actor, x, y+32)
  23.       draw_actor_sp(actor, x, y+64)
  24.       draw_actor_exp(actor, x, y+96)
  25.     end
  26.   end
  27. end
  28. BLOCK1  不说了, 大家应该都很熟悉了
  29. BLOCK2
  30. 1 for i in 0...$game_party.actors.size
  31. 2 x = 0
  32. 3 y = i * 150
  33. 4 if i >= 2
  34. 5 x=250
  35. 6 y-=300
  36. 7 end
  37. 8 actor = $game_party.actors[ i]
  38. 9 self.contents.font.color = text_color(6)
  39. 10 self.contents.draw_text(x, y, 200, 32, actor.name)
  40. 11 offset_x=contents.text_size(actor.name).width+10
  41. 12 self.contents.font.color = text_color(4)
  42. 13 self.contents.draw_text(x+offset_x, y, 200, 32, "Lv: " + actor.level.to_s)
  43. 14 draw_actor_hp(actor, x, y+32)
  44. 15 draw_actor_sp(actor, x, y+64)
  45. 16 draw_actor_exp(actor, x, y+96)
  46. 17 end
  47. 18 end
  48. 19 end
复制代码

第四-六行 为什么要多出这个呢?因为我们队伍中的队员不一定是只有2个的,当超过2个时, 我们的界面是把多出来的都给放到右边的, 所以4名队员的坐标应该分别是 (0, 0) , (0, 150), (250, 0), (250, 150 )
第十一行: 这里我们创建了一个新的局部变量叫"offset_x",它的值为角色名字的宽度+10 (留出一点空间) 这个干吗用呢?我们描绘角色的等级水平时用的. 因为我们要Level 描绘在角色名字的右边, 而角色名字又不是统一长度, 所以我们必须要用一个变量来确定level 文字的x 坐标. contents.text_size(actor.name).width 是一个命令,这样我们就能知道这个东西的长度了.我们可以用height替换width 来获得它的宽度.
第十三行: 这个是描绘角色等级水平的地方.我们看到了,它给已存在的x坐标增加了"offset_x" 的值..这样, level 就一直在角色名字的右边了^0^.. 还没忘记.to_s 吧.. 等级是一个integer (抽象的整数类), 我们必须把它转换为字符串.
第十四行: 这个draw_actor_hp哪来的? draw_actor_hp 事实上是一个方法名,(不是变量哦)i因为它后面的括号里有argument. 那么这个方法是哪里定义的呢?.父类 Window_Base 里咯.好,我们到它的父类里找,找到如下:
  def draw_actor_hp(actor, x, y, width = 144)
    # 描绘字符串 "HP"
    self.contents.font.color = system_color
    self.contents.draw_text(x, y, 32, 32, $data_system.words.hp)
    # 计算描绘 MaxHP 所需的空间
    if width - 32 >= 108
      hp_x = x + width - 108
      flag = true
    elsif width - 32 >= 48
      hp_x = x + width - 48
      flag = false
    end
    # 描绘 HP
    self.contents.font.color = actor.hp == 0 ? knockout_color :
      actor.hp <= actor.maxhp / 4 ? crisis_color : normal_color
    self.contents.draw_text(hp_x, y, 48, 32, actor.hp.to_s, 2)
    # 描绘 MaxHP
    if flag
      self.contents.font.color = normal_color
      self.contents.draw_text(hp_x + 48, y, 12, 32, "/", 1)
      self.contents.draw_text(hp_x + 60, y, 48, 32, actor.maxhp.to_s)
    end
  end
就是这里了^0^ . 我们先不管它父类怎么定义, 反正我们的3个window是都建立好了,接下来就是创建我们神奇的scene了^0^


作者: frantice    时间: 2006-7-31 17:06
以下引用OCTSJimmy于2006-7-29 16:38:36的发言:

跟我从头学脚本(教学翻译)的CHM文件已经做好了,请F过目,撒花……

谢谢……

点此下载


[本贴由作者于 2006-7-29 17:13:10 最后编辑]



首先,文件中有乱码。。。
然后,我觉得,还是不要作成CHM比较好。
我很敬佩Dubealex,所以在对他的教学做翻译的基础上不愿意把它做为其他任何形式的文件。




作者: 小天    时间: 2006-8-1 06:13
放在自己参与的主题中,以后好找....
作者: OCTSJimmy    时间: 2006-8-1 18:56
以下引用frantice于2006-7-31 9:06:09的发言:

以下引用OCTSJimmy于2006-7-29 16:38:36的发言:

跟我从头学脚本(教学翻译)的CHM文件已经做好了,请F过目,撒花……

谢谢……

点此下载

[本贴由作者于 2006-7-29 17:13:10 最后编辑]

首先,文件中有乱码。。。
然后,我觉得,还是不要作成CHM比较好。
我很敬佩Dubealex,所以在对他的教学做翻译的基础上不愿意把它做为其他任何形式的文件。

[本贴由作者于 2006-7-31 9:06:43 最后编辑]


首先我要说下……抱歉……我没有看到乱码啊……{/fd}……Orz……

其次,为了尊重尊敬的女F我这次只是把所有的文章做成了单独的HTML,并且打了个包,这样子要找也比较方便……不是吗?……

难道你想在一篇有无数回复的帖子里找某个字节?……

嗯……还是征求女F的意见……如果不满意的我立马取掉……

点击下载
[LINE]1,#dddddd[/LINE]
原CHM文件链接已取掉,恳请版主把文件删除,谢谢……
作者: frantice    时间: 2006-8-2 17:10
撤回


作者: link006007    时间: 2006-8-3 17:57
原来类变量的值是不会自己还原的啊... ...
if @@a_class_variable==a_local_variable then print "Yay" else print "Arg" end

嗯...加入收藏夹...待来日天晴气爽时细细看来~
作者: 小湖    时间: 2006-8-3 18:16
做成电子书多好{/hx}~
作者: 失狗的耗子    时间: 2006-8-5 09:49
哇~~~楼主好有心呀
{/wx}
说得那么生动,一定看看
作者: OCTSJimmy    时间: 2006-8-5 19:30
期待传说中的第15讲……
作者: 景天问见    时间: 2006-8-5 22:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: 小湖    时间: 2006-8-12 21:13
还是自己动手吧~
第一次做电子书,好像有点问题{/gg}……
方便不能经常上网的~~
下载地址:http://rpg.blue/upload_program/f ... 子书小湖版.rar

作者: strinmel    时间: 2006-8-20 08:15
女F{/se}{/se}{/se}
作者: 雷欧纳德    时间: 2006-8-20 11:18
发布到主站了,给女f加vip10,给小湖加vip5,鼓励一下~
作者: strinmel    时间: 2006-8-21 11:45
看完,感觉这对新人(偶素万年新人{/hx})比较有用,至少比那个冷冰冰的F1帮助好N(N <= 10)倍
期待下一话{/hx}

P.S. 无聊当散文看的万年新人留{/hx}{/hx}{/hx}
作者: zxp    时间: 2006-8-23 03:21
好东西呀,但这个rmxp没有关键字高亮显示,不方便写东西
作者: 8525078    时间: 2006-8-25 00:16
先收下~~~~~
作者: frantice    时间: 2006-10-18 06:52
挖坟来了.....{/gg}

补充完第16-20讲, scene和选择窗口的创建.....
是翻译原稿, word文档, 配有精美插图{/cy}

上已经全部发贴在前面了.
http://rpg.blue/upload_program/files/上.doc

中已经包括了第9讲开始到17讲
http://rpg.blue/upload_program/files/中.doc

下是18-20。比较简略, 注意理解。
http://rpg.blue/upload_program/files/下.doc


另外补上战斗系统讲学.....{/gg},这个战斗教学主要讲的是算法。。
http://rpg.blue/upload_program/files/战斗教学.doc
RGSS游戏系统术语列表(比之前那个Near的完整多了)
http://rpg.blue/upload_program/files/RGSSreference--1.doc
http://rpg.blue/upload_program/files/RGSSreference--2.doc

最后的是事件版SLG,变量的超级运用  
汉化版因为脚本地方有些失误所以没有全部完成, 这里提供英文原版. 如果执意要汉化过的工程请留言.
原工程: 操作: 战斗中按B查看行动力AP和敌人数, 按Z地图上攻击.
http://rpg.blue/upload_program/files/LnSmiTactcl.rar
脚本部分修改不完整参照(不要代替工程中的脚本, 因为没有完整地找出所有改动地方, 请新建工程查看)
http://rpg.blue/upload_program/files/Scripts中文.rar
作者: 天翔    时间: 2006-10-22 02:39
做个记号,以便下次再看~!
作者: OCTSJimmy    时间: 2006-10-22 16:52
好啊!!

出新的鸟……

有时间的话再来慢慢啃!!……
作者: kinoxp    时间: 2007-2-24 19:25
提示: 作者被禁止或删除 内容自动屏蔽
作者: 美兽    时间: 2007-2-24 19:28
那个中文范例地址似乎有误???
作者: frantice    时间: 2007-2-24 19:41
下划线加错地方{/gg}, 那个不是中文范例, 因为是用事件做的, 脚本部分的修改在原工程中没有任何标记. 所以我对照了下把脚本中修改过的地方做了标记, 就是最后下载那个.

作者: 美兽    时间: 2007-2-24 23:10
frantice看下吧,是否还有修改之处.
那两个范例没加,一是与教程本身关联不大,二是并没有想象般强悍,如果实在想加,我再补上.

ftp://[email protected]/个� ... 脚本电子书.rar
作者: frantice    时间: 2007-2-24 23:26
不用验货了, 至于"范例",我是因为整理电脑把没发过的东西都发上来罢了, 和教学没关系.
话说....那个电子书是怎么做的啊.用啥软件的不......(鸡蛋鸡蛋鸡蛋...{/gg})
作者: 美兽    时间: 2007-2-24 23:51
以下引用frantice于2007-2-24 15:26:20的发言:

不用验货了, 至于"范例",我是因为整理电脑把没发过的东西都发上来罢了, 和教学没关系.
话说....那个电子书是怎么做的啊.用啥软件的不......(鸡蛋鸡蛋鸡蛋...)


哦,是因为我把有些部分整理在一起,害怕将作者混淆,弄出笑话来.

电子书感觉编译性比较好的是E-BOOK,但排版还是要用WORD或DW什么的,电子书制作本身非常简单,累人的是资料整理的过程——

作者: 雪之祭曲    时间: 2008-8-19 02:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: ONEWateR    时间: 2008-8-19 02:48
耶!适合我的教学耶!

收藏之~!
作者: zmcted    时间: 2009-2-19 17:28
第二讲里的显示4个窗口时一次显示还是同时显示?
我的时一次显示
作者: 465889216    时间: 2009-3-15 02:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: 真实的喜欢    时间: 2010-8-1 10:36
提示: 作者被禁止或删除 内容自动屏蔽




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