Project1

标题: 新人脚本入门·语法和常用语句(未完编辑中) [打印本页]

作者: 冰舞蝶恋    时间: 2011-4-20 20:51
标题: 新人脚本入门·语法和常用语句(未完编辑中)
本帖最后由 冰舞蝶恋 于 2011-4-21 13:26 编辑

咱出的第一个脚本教程,希望支持~
另外:咱是脚本白痴,盲,菜鸟,各位前辈别笑……

● 基础入门
最经常使用判断的是:end、if、else、elsif、unless、case、when,还会常用到p、#等等,值得注意的是,end一定要和相应的部分对齐。
if是用来做判断的;
else是不符合的情况下;
elsif是不符合的情况下再次判断(中间就不用加end啦~);
unless也是判断,是除此之外的情况,一般很少用到。

p是用来弹出消息框的,譬如:p "要显示的文字"或是p 变量名(这里就会显示变量)
#后面的文字就会被判断为注释,在脚本中不起任何作用。

运算符号有:+(加)、-(减)、*(乘)、/(除)、()(括号,不能使用中括号或是大括号,但小括号可以叠加使用)

其实还有更偷懒的办法:+=(当前值加上多少)、-=……其他同理,请各位自行在脑内补充完整~
条件判断有:==(在判断中一定不可以用=)、!=(不等于)、>=(大于等于)、<=(小于等于)、>(大于)、<(小于)

变量有:全局变量、类变量、方法变量、局部变量
变量可以是任何中英文的名字,但不可以随意用字符,唯一可以用来表示在变量名称中的字符是“_”,连接符。
全局变量的特征是:$变量名称 【可以在全局调用和修改】
类变量:@@变量名称 【只能在当前类修改调用】
方法变量:@变量名称 【只能在当前的class使用】
局部变量:变量名称 【只能在当前位置使用】

变量大致分 数值类、 文本类、 逻辑类、 数组哈希类四种,空的变量表示为nil。
数值类:顾名思义啦,就是数值。可以进行加减乘除的运算,允许使用小括号。
文本类:用""或是''框起来的内容文字。
逻辑类:用于判断是或否的变量,可为true或false。
数组哈希类:数组是用[]框起来的多个变量,之间用逗号分割,长度不限,类别不限。读取的时候从0开始。比如:数组a = [1,"a",true,b] # 注意:这里的b是一个变量。比如,你想读取到这个数组的1,你就得用:数组a[0],要读取到"a",就用数组a[1],以此类推。
常量也许是特殊的变量?由于常量是用大写字母开头的,所以一般放在module里……
读取就参照下面吧……

联系刚才讲到的东西,这里做一段示例:
  1. a = 5 # 这个是局部变量
  2. @b = true # 方法变量
  3. @@na_s = "66RPG" # 类变量
  4. $WC = "厕所" # 全局变量
  5. s = [a, @b, @@na_s, $WC]# 这是个数组
  6. #--这里演示运算方法---------
  7. a += 2  # 这里实际上是a+2
  8. p a  # =>7
  9. if a > 5
  10.   @b = false
  11. elsif a == 5
  12.   @@na_s = "伪·66RPG"
  13. else
  14.   $WC = s[2]
  15.   p $WC  # 这时候显示的就是@@na_s的内容了~
  16. end # 别忘了要结束!
  17. if $WC != @@na_s # 如果$WC不等于@@na_s会发生什么呢?
  18.   a = nil # 清空变量a
  19. end
复制代码
  1. #-设定常量---
  2. module Abc
  3.   Defg = 40
  4. end
  5. #-读取常量---
  6. Abc::Defg
  7. #-结束---
复制代码

● 脚本语句

开关变量操作
$game_switches[开关号码] = (false/true) # 开启/关闭开关
$game_variables[变量号码] = 变量内容 # 这里控制的是游戏变量,而用脚本则可以不仅限于数值的操控了。

文章的显示
set_message_waiting # 刷新对话框
$game_message.texts.push("显示内容") # 显示文章
$game_message.face_name = "头像名" # 更改对话头像
$game_message.face_index = 头像索引 # 从0~7,具体可以参考事件的显示文章
$game_message.position = 0 # 更改窗口位置,0上,1中,2下
$game_message.background = 0 # 更改窗口特征,0普通窗口,1背景变暗,2透明

获取角色/敌人
$game_party.members[队伍编号] # 队伍角色的编号从0开始。0代表第1人,以此类推。
$game_actors[数据库编号] # 数据库的角色设定中,从1开始。
$data_enemies[数据库编号] # 敌人
# 以下是获取角色的能力值等,请在上方获取的角色后加.,如:$game_actors[1].maxhp。敌人同理。不过还是要啰嗦一下,敌人是没有等级、头像、行走图和装备等的,所以请注意不要用混了~
编号:id
名称:name
等级:level
生命:hp
最大生命:maxhp
魔法:mp
最大魔法:maxmp
所属职业的编号:class_id
攻击力:atk
防御力:def
精神力:spi
敏捷性:agi
数据库中设定的初始等级:initial_level
行走图名:character_name
行走图索引:character_index # 如果是用默认的8个一组的行走图的话,0~7
头像名:face_name
头像索引:face_index # 同上。
是否二刀流:two_swords_style # 返回true或false
是否固定装备:fix_equipment
是否自动战斗:auto_battle
是否超强防御力:super_guard
是否药物知识:pharmacology
是否暴击加强:critical_bonus

物品/特技/装备(从数据库中获取)
$data_items[数据库编号] # 物品
$data_skills[编号] # 特技
$data_weapons[编号] # 武器
$data_armors[编号] # 防具
# 这里用来读取,同样,读取的时候也需要加.,如:$data_items[1].price。
【通用】
编号:id
名字:name
备注:note
图标索引:icon_index
描述:description

【特技和物品通用】
使用范围:scope # 请自己参照数据库吧,返回值从0开始。
使用场合:occasion
动画编号:animation_id
公共事件编号:common_event_id
基础伤害值:base_damage
分散度:variance
攻击关系度:atk_f
精神关系度:spi_f
是否物理攻击:physical_attack
是否魔法伤害:damage_to_mp
是否吸收伤害:absorb_damage
是否无视防御:ignore_defense

【物品】
价格:price
是否是消耗物品:consumable # 返回true/false
生命回复量:hp_recovery
魔法回复量:mp_recovery
生命回复率:hp_recovery_rate
魔法回复率:mp_recovery_rate

【特技】
魔法消耗:mp_cost
成功率:hit

【装备】
武器动画编号:animation_id
价格:price
攻击力:atk
防御力:def
精神力:spi
敏捷性:agi
是否双手武器:two_handed
是否先发制人:fast_attack
是否频发暴击:critical_bonus
是否连击:dual_attack
防具类别:kind
是否防止暴击:prevent_critical
是否减半魔法消耗:half_mp_cost
是否双倍经验:double_exp_gain
是否自动恢复生命:auto_hp_recover

职业(这个用途不是很大)
$data_classes[编号]
编号:id
名字:name
位置:position # 0前卫,1中卫,2后盾
可装备的武器:weapon_set # 返回数组
可装备的防具:armor_set # 返回数组
可习得的特技:learnings # 返回数组

到这里这个常用的语句库就结束啦~欢迎各位补充【因为还不太全啊啊!
咱这个事件党的脚本小白继续跑回去做事件好了……

另外讲一下rand随机的用法好了~
rand(b)+a
那么随机数的最小值是a,最大值是a+b-1
比如需要2~5的随机数,那么rand(4)+2即可。
还有一个方法,就是rand(a),那么随机数的最小值则是0,最大值a-1。

作者: clande    时间: 2011-4-20 21:08
本帖最后由 clande 于 2011-4-20 21:11 编辑

支持的说。。沙发求浮云
作者: 冰舞蝶恋    时间: 2011-4-20 21:16
写得很累……算了,偷个懒,明天再补上吧~那啥先休息去了~
占楼等编辑。
作者: 蕾米莉亚·斯卡雷特    时间: 2011-4-20 21:24
module    是定义模块不是定义类.


作者: 一箭烂YiJL    时间: 2011-4-20 21:56
其实需要先教一下什么表达式么?

关于量的特性的说:
A = 0 # 常量, 不能变,其余特性和局部变量一样
a = 0 # 局部变量, 不能跟保留字一样, 在环境(函数/模组)过后自动释放
@a = 0 # 实例变量, 在整个环境(类/模组/函数)里一直使用
@@a = 0 # 类变量, 在同一个类中的共同使用的变量
$a = 0 # 全局变量, 跨越环境至任何地方都能用的变量

比较要注意的是实例变量,他可以扩展为公共实例变量。
还有就是出了上述的变量外,还有一种叫做伪变量,意思是一个代号或假名,
常见有:self(自身)、nil(空/无)、false、true


其实你"逻辑类"就是布林值(Bool),分为true和false,也就是真类和伪类。

然而在变量方面我们不能分为四大类,普通的Bitmap.new也是一个类了,
0、[ ]、{ }、" "、' '、nil、true、false
前五者是Ruby所提供的字面分辨/字面含义,不像C/C++等语言要先定义变量的类型,才能修改。
而后三者是伪变量,其实他们分别是NilClass、TrueClass、FalseClass。

全部类都应该继承Object(物件类),Object又包括Kernel(核心模块),但是我们在全局定义一些函数或者变量,也就等于在Kernel定义了。Object和Kernel的环境营造了面向对象(?)
作者: 蕾米莉亚·斯卡雷特    时间: 2011-4-20 22:26
变量的作用区域应该是在 变量的定义的那个区间内才对.
如果把 a = 0 写到 class 之外去的话, 它也能成为一个类似的全局变量.

另外, 类变量应该是说在同一个类的实例中共同使用的变量
作者: DeathKing    时间: 2011-4-20 23:08
排版控路过。
作者: 冰舞蝶恋    时间: 2011-4-21 13:35
经过不懈努力,总算更新完毕……
作者: 苏小脉    时间: 2011-4-21 15:17
回复 一箭烂YiJL 的帖子
还有一种叫做伪变量,意思是一个代号或假名,
常见有:self(自身)、nil(空/无)、false、true

这个说法我没听过,我只知道 PHP 有个伪变量 `$this',因为它的字面值看起来像是 PHP 的变量。Ruby 正式用语中似乎没有这个说法,不知能否援用一下相关材料。

分为true和false,也就是真类和伪类。

`true' 和 `false' 都是实例,不是类。

Object又包括Kernel(核心模块)

这个的正式术语叫做“mix-in”,中文界有不少人称其为“混入”。

但是我们在全局定义一些函数或者变量,也就等于在Kernel定义了。

全局上下文有两个隐式上下文:default definee 和 `self',其中 default definee 是 Object,`self' 引用的是一个被命名为 `main' 的 `Object' 实例。因此,全局定义的方法会成为 Object 的实例方法,变量则属于 `main' 这个 `Object' 实例的实例上下文。
关于 default definee 可以参考 tips 的 77、76 楼:
http://rpg.blue/forum.php?mod=re ... 1&fromuid=57686
关于顶层环境可以参考:
http://szsu.wordpress.com/2009/11/07/top_level_object_kernel/
(不过这个没有提到 default definee,因为写的时候还不知道有 default definee 这个东西)
作者: 一箭烂YiJL    时间: 2011-4-21 18:44
回复 苏小脉 的帖子
伪变量

PHP我不懂。Ruby相关材料这里有写一点,但是不多:http://www.kuqin.com/rubycndocument/man/syntax_vac.html
在"伪变量"一栏中。

`true' 和 `false' 都是实例,不是类。

我5楼的小错误真多。`true' 和 `false' 是实例,但无可否认,他们是TrueClass和FalseClass的实例。("`true' 和 `false' 是类"好像也说的通吧。)这个是一个实验:
  1. a = false
  2. p a.is_a?(FalseClass) rescue p "Error"             # => true
  3. p a.is_a?(false) rescue p "Error"                  # => Error

  4. b = nil
  5. p b.is_a?(NilClass) rescue p "Error"               # => true
  6. p b.is_a?(nil) rescue p "Error"                    # => Error

  7. p nil.to_a   # => [ ]
  8. p nil.to_i   # => 0
  9. p nil.to_f   # => 0.0
  10. p nil.to_s   # => " "

  11. p NilClass.new   # => NoMethodError
  12. # 我们并不能创建"另外一个nil"
复制代码
这个的正式术语叫做“mix-in”,中文界有不少人称其为“混入”。

Ruby语法不是include Kernel么?

顶层、Object、Kernel

后者的文章跟我的想法一样,像就更清楚和认定这种说法了。
但是前文(default definee),我真的乱了{:4_84:}。
作者: 苏小脉    时间: 2011-4-22 01:12
本帖最后由 苏小脉 于 2011-4-22 01:18 编辑

回复 一箭烂YiJL 的帖子

但无可否认,他们是TrueClass和FalseClass的实例。("`true' 和 `false' 是类"好像也说的通吧。)这个是一个实验:

`TrueClass' 和 `FalseClass' 是类,`true' 和 `false' 是实例。is-a 关系是面向对象思想中对象(实例)与类型的关系,即左手边属于右手边这个类型,或者说友手边的类型兼容左手边对象的类型,并不是左右相等。`true'、`false'、`nil' 都是 Ruby 中的直接值(immediate value),所以这三个实例都是唯一的,都是单一实例。同样是直接值的还有 Ruby 的符号和定点数,只不过并非是单一实例。

Ruby语法不是include Kernel么?

是的,这个就是 mixin。Matz 在去年 RubyConf 的讲座上曾说过要在 Ruby 2.0 中把真正的 mixin 接口改为 `Module#mix',而以前的 `Module#include' 则有别的作用,主要是区分了命名冲突的处理方式。
作者: 紫苏    时间: 2011-4-22 09:04
回复 一箭烂YiJL 的帖子
虽然Fixnum、Symbol都是立即值,但感觉不像。

有什么不像?
不是include(module)么?那么新的语法是否Mix(module)?

`Module#include' 这样的符号表示 `include' 是 `Module' 的实例方法。
新的确实是 Module#mix,接受的参数和 `include' 一样,但这只是草案,并非板上钉钉。如果有兴趣可以看看 DK 在 youku 上发布的 RubyConf 2010 的 Matz 的视频,就是音量有点小。
作者: 一箭烂YiJL    时间: 2011-4-22 10:30
回复 紫苏 的帖子
有什么不像?

只是感觉,被"值"字的概念影响了。


对于#的理解:Bitmap#width => bitmap_obj.width。
include不是module类的私有方法(class承继module)么?
`Module#include' 让我理解为module_obj.include。
作者: 苏小脉    时间: 2011-4-22 11:13
一箭烂YiJL 发表于 2011-4-22 10:30
回复 紫苏 的帖子

`include' 是 `Module' 的私有实例方法,就和 attr_reader、attr_accessor 等方法一样。当你在一个 module/class 的上下文中调用 include 的时候,其接收者(self)就是该 module/class 本身,它们是 Module 或 Class 的实例,也就相当于你这里的 `module_obj'。只不过由于 Module#include 是私有方法,所以 module_obj.include 这样的写法会有访问上的障碍。

  1. p Module.private_instance_methods.include? :include # => true
  2. p Module.private_methods.include? :include          # => true

  3. M = Module.new
  4. # private method `include' called for #<Module:0x1d30e68> (NoMethodError)
  5. M.include Math

  6. M.method(:include).call Math                        # => OK
  7. Module.instance_method(:include).bind(M).call Math  # => OK
  8. M.send :include, Math                               # => OK
  9. M.module_eval { include Math }                      # => OK

  10. p M.foo
复制代码
如果方法是私有的,那么显式指定了接收者的方法调用就被不被允许。
作者: killkill2298    时间: 2011-4-22 18:35
本帖最后由 killkill2298 于 2011-4-23 16:39 编辑

回复 冰舞蝶恋 的帖子

站在朋友立场支持下。

提出些意见:
感觉只是把你理解的一股脑倒出来了,介绍很乱,又是条件判断,又是变量,而且介绍不太基础,例如什么是判断语句,什么是变量?
对于学过其他语言的人来说,很好理解,不过,直接看F1更好,真乱。
对于没学过语言的人来说,看了判断、运算符、输出语句p、注释符、乱起八糟的各种变量(局部、全局),各种变量类型(整数、字符串),常量
说明文字中还使用了module(模块),说实话,能够看懂说明的基本上不是新人了。真正的新人想从一句话中学会这么多东西,智商没有180真的不行。

我这人想到什么说什么,不要介意,批评性的建议也是支持的一种。
希望完整版能够有更详细的用法,真正面向不懂脚本的新人。

好吧,我也不是光会指手画脚的人。冰舞~~~我写个参考目录和修改建议发给你。
作者: 忧雪の伤    时间: 2011-4-30 19:29
嘛,就是吐槽,data没有hp,$data_enemise[1].hp会报错的……
作者: mingwang4747    时间: 2012-6-17 01:24
这还叫入门啊?跟看天书似的。
我本将心向游戏,奈何止步于脚步啦。。。。。。。。




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