我本人并非专业的程序员,所以有些术语理解不到位的地方还请各位批评指正。
最近帮一位朋友改脚本。在交流中,我发现他遇到的困惑和我当年的困惑是类似的,姑且在这里写一点感想吧。
自己修改脚本无疑是要懂一点编程的。我之前也说过,无论是RGSS还是mv中的JS脚本,它们应该是一种框架,一种rpg游戏的框架。框架的好处是:即时不了解整个程序的流程,出东西也会很快。如果要熟练使用框架,当然要对它很了解。
所以我认为基础教程不但要包括语法,还要包括对默认脚本这个框架的介绍。
关于语法我一直不大愿意讲,主要原因其实是水平不够。其一因为语法涉及到很多细节,我并非js和ruby的专家,很多细节未必讲的清楚。其二是因为,语法本身是死的,与其看我转述,不如在网上看系统的语法介绍。(我记得10年前,大概07,08年的时候,ruby的教程在网上非常少,几乎搜索不到)
但是网上全面系统的语法教程也有个问题,比较分散和琐碎,初学者未必能在短时间内看的下去。为了帮助看到此篇文章的朋友快速入门,我粗略的介绍下语法。
程序有三种基本结构,顺序、循环、条件。举个简单的例子。
顺序结构
a=1
b=2
c=a
循环结构:
a=10
while(a>0){
a=a-1
}
选择结构:
a=10
a=3
}
以上是程序的三种基本结构。注意“=”这个符号,这个符号大家会读成“等号”,但是大多数程序语言中,这个符号表达的意思并不是相等,而是赋值。a=10的意思并不是a等于10,而是把10这个数值赋值于a。
ruby中有些数据类型,比如hash,数组。js中也有数组和对象,这些数据类型请自行查找资料,搜索ruby教程或者是js教程就行。
ruby和mv的js脚本编程都属于面对对象编程。
说到ruby不得不提这几个概念。类,实例,类变量,实例变量,类方法,实例方法。
类,关键字class,在默认脚本中很常见。
Class Actor
definitialize(w,h)
@width=w
@@height=h
end
end
这定义了一个类。
actor=new Actor()
actor这个变量就是Actor类的实例。initialize(w,h)是一个实例方法。类的实例变量可以调用类的实例方法。类中以@开头的变量称为实例变量,@@开头称为类变量。
实例变量属于类的实例,一个类可能有很多个实例,每个类的实例变量是独立的,修改某个实例的实例变量并不会改变其他实例的实例变量。
类变量属于整个类,修改该某个类实例的类变量,其他实例中类变量也会变化。()
同理,实例方法和类方法的概念也是类似的。
其他语言中,和类方法类似的概念叫静态方法。类方法和实例方法在使用的时候区别如下:
class Actor
def attack #实例方法
end
def Actor.name #静态方法
end
end
Actor.name() #类方法的使用,类名.方法名
actor=new Actor()
actor.attack() #实例方法的使用
ruby中如果方法不带参数的话,调用方法时可以省略括号。
RGSS3里还涉及到迭代器的使用,这方面我也不太熟悉,请参考网上比较系统的教程。
ruby和js语法上的的区别还是很大的。我本人对js算不上很了解,这里不在赘述js语法方面的问题。
接下来说一说我的个人感想。
我之前在国内某个著名rm论坛上看过一个说法,脚本化。这个说法估计是贴子作者自己提出来的。何谓脚本化?他的意思大概是,把现实生活中的概念,对应到脚本中。比如现实中英雄可以攻击,防御、使用魔法,脚本中就有一个英雄类,这个类中有攻击、防御、释放魔法几个方法。计算机里,这种行为应该称为抽象。
不过以我的经验来看,rm中需要自己设计类的地方非常少。对默认脚本方法的重定义能满足绝大多数的需求。
默认情况下,后插入的脚本可以覆盖前面的脚本。如果在后面的脚本里,某个类和之前的类名,方法名相同,则后面的方法会覆盖之前的方法。这也是大多数脚本冲突的原因。
大多数脚本中会用到alias这个关键字。这个关键字的作用是,给某个方法取个别名。如果你打算重写某个方法用alias为这个方法取个别名,这样就能先调用之前的方法,再追加自己的方法。
领取专属 10元无门槛券
私享最新 技术干货