赞 | 0 |
VIP | 25 |
好人卡 | 0 |
积分 | 1 |
经验 | 126953 |
最后登录 | 2020-5-5 |
在线时间 | 39 小时 |
Lv1.梦旅人 粉蜘蛛秀秀
- 梦石
- 0
- 星屑
- 76
- 在线时间
- 39 小时
- 注册时间
- 2007-6-4
- 帖子
- 384
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
秀秀RM脚本教程第一章
说明下。。。由于6R论坛的秀秀ID已经被注册掉了,所以用了hide秀。。。
大家好 第一次写教程 目的还是为了教会大家脚本 我写的教程都是以我的平时的编程思路来教大家的 方法也不是唯一的
希望大家能够理解我的思路并能够举一反三 话不多说了开始把
第一章 脚本的思路和构架
要写好脚本 策划构思很重要 通常好的构思可以事半N倍
接下来就举个足球游戏的例子 我们讨论的只是思路
1.1 模块划分
1.2 类 对象 属性
1.3 数据库管理
1.4 地图数据
1.5 球员数据
1.6 窗口
1.7 场景
# ------------------------
# 1.1模块划分
# ------------------------
#音效管理模块
module FOOTBALL_SE
def self.射门音效
播放射门音效
end
def self.带球音效
播放带球音效
end
def self.铲球音效
播放铲球音效
end
end
#动画贞数模块
module ANI_COOUNT
FB_铲球贞数 = 15
FB_左右脚假动作贞数 = 8
end
# 其他模块管理
module FOOTBALL_OTHER
FB_半场时间 = 45
FB_比赛贞数 = 60
FB_比赛人数 = 11
end
先简单的写了这么点 具体制作远远不止要定义这些
首先说明下几个定义
#符号 为注释符号 带#符号的一行程序不会被运行
如上述例子 # 其他模块管理 这一行不会运行 注释只为了给自己看
模块定义用 module
当然结束需要一个end
def 是定义方法(也可以认为是函数)
结束也需要一个end
大写英文字母开头的变量 认为是常量
上面的例子 FB_半场时间 = 45
意思就是 常量 FB_半场时间 = 45
模块的常量可以直接在外部调用
比如 FOOTBALL_OTHER.FB_半场时间
直接就取出FB_半场时间的值为45
模块方法定义有2种 一种直接def+方法名
这种方法只能在模块内部调用调用方法直接 用方法名调用
另外一种def self.方法名 该方法可以在模块外部调用
外部调用模块方法 只需要模块名+方法名
看上面的例子 比如要在外部调用音效管理模块中的 带球音效
只需要 FOOTBALL_SE.带球音效
有人说 播放音效 只需要在播放的时候直接调用播放音效的函数不就可以了为啥还要弄个模块
模块是为了方便于管理 可以把一些列音效整合在一个模块里面 需要的时候调用 这样好处多多
比如刚才的例子 你要修改一下播放带球的音效 只需要找到音效管理模块 改一下音效就可以了
很方便 如果不这么做 你就要在你成千上万行脚本中 去找到这么一句播放音效的函数 岂不累死?
总之划分模块好处多多 可以让程序看上去很有层次感
一个好的程序员一定会在模块划分上花些时间 以便于在以后的程序修改中 不会花太多的时间
具体的作用 举个简单的例子 大家可以跟着我试下
打开RM 脚本编辑器 在脚本中插入以下
module ABC
def self.全部小写英文字母输出
return "abcdefghijklmnopqrstuvwxyz"
end
end
然后在地图上建立一个事件 事件中插入脚本
输入 p ABC.全部小写英文字母输出
是不是输出了全部小写英文字母呢?
# ------------------------
# 1.2 类 对象 属性
# ------------------------
1.2 将和大家一起讨论下 非常重要的 类 对象 属性
这些是非常重要的 希望大家这里认真的学习下
先看一段程序
class 队员
attr_reader :年龄
attr_reader :身高
attr_reader :体重
attr_reader :姓名
def initialize(年龄,身高,体重,姓名)
@年龄 = 年龄
@身高 = 身高
@体重 = 体重
@姓名 = 姓名
end
end
class 我方 < 队员
attr_accessor :图形
attr_accessor :方向
def initialize(年龄,身高,体重,姓名)
super(年龄,身高,体重,姓名)
@图片 = Bitmap.new(路径)
@图形 = 0
@方向 = 0
@数据 = 我方数据.new(姓名).制作数据
end
def 射门力量
return @数据["射门力量"]
end
def 射门精度
return @数据["射门精度"]
end
def 带球速度
return @数据["带球速度"]
end
def 带球加速度
return @数据["带球加速度"]
end
def 抢断
return @数据["抢断"]
end
def 头球
return @数据["头球"]
end
def 身体素质
return @数据["射门精度"]
end
def 任意球
return @数据["射门精度"]
end
end
class 我方数据
def initialize(姓名)
@姓名 = load_data("目录/姓名.rxdata")
end
def 制作数据
hash = {
"射门力量" => @姓名[0],
"射门精度" => @姓名[1],
"带球速度" => @姓名[2],
"带球加速度" => @姓名[3],
"抢断" => @姓名[4],
"头球" => @姓名[5],
"身体素质" => @姓名[6],
"任意球" => @姓名[7],
}
return hash
end
end
end
好了写了这么多 我们开始分析吧
我们先来看类的定义
class 是用来定义类
如 class 队员 就定义了一个 队员 的类
类和模块一样也可以包含方法(函数)
定义方法用 def + 方法名
属性也就是参数包含在方法后面的()中
attr_reader 是定义附加只读属性的变量
attr_accessor 是定义附加可读写属性的变量
看第一个例子 稍微简化了一下
class 队员
attr_reader :参数1
def initialize(参数1,参数2,参数3,参数4)
@参数1 = 参数1
@参数2 = 参数2
@参数3 = 参数3
@参数4 = 参数4
end
end
首先定义了一个队员的类
类中包含了一个附加只读属性变量
只读属性变量 意思就是 在外部可以调用队员这个类中的@参数1 变量
带@的变量 为实变量 一般在方法中定义 所以作用域只在方法中 也就是 def 和 end 之间
如果要类中定义变量 在方法中可以调用 必须这样带2个@@开头的变量 这是类变量 作用于在类之间 class 和 end
如果改类中没有对@参数1进行赋值 而进行外部调用这个只读变量
就很有可能因为找不到@参数1而发生脚本错误
所以 在例子中有这么一句@参数1 = 参数1
外部调用只读属性参数1方法很简单
队员1 = 队员.new(1,2,3,4)
a = 队员1.参数1
接着说对象的概念
上面的第一句意思就是
先建立对象队员1 对象队员1是属于队员这个类的
而队员1可以使用 队员这个类中的所有方法
接着说下一个initialize方法 并且带4个参数
initialize是一个特殊的方法
生成对象的时候 直接运行一次
队员1 = 队员.new(1,2,3,4)
队员1这个对象生成的时候 同时也运行了一次initialize new后面的4个参数直接传给了initialize方法的4个参数
运行结果就是
@参数1 =1
@参数2 = 2
@参数3 =3
@参数4 = 4
而参数1=1 这个值是带有只读属性的 可以被外部调用 但不可仪修改
接着看第二段脚本
class 我方 < 队员
表示定义了新的类 我方
并且是 队员 这个类的 子类
建立了父子关系
我方 这个类 可以使用 队员 这个父类中的所有方法 直接方法名可以调用
attr_accessor :图形
attr_accessor :方向
def initialize(年龄,身高,体重,姓名)
super(年龄,身高,体重,姓名)
@图片 = Bitmap.new(路径)
@图形 = 0
@方向 = 0
@数据 = 我方数据.new(姓名).
end
接着一段 开始定义了2个可读写变量 图形 方向
外部可以改变这两个变量的值
这里在initialize方法里面给2个变量赋予了初始值0
initialize(年龄,身高,体重,姓名)
super(年龄,身高,体重,姓名)
父类已经有了initialize这个方法
子类重定义了这个方法
super表示 继承了父类initialize方法的所有内容 ()所带的参数传入父类initialize中
super后面的部分 就是子类initialize方法新增的部分了
总体来看 我方这个子类 继承了父类队员 所有方法
并且独有 射门力量 射门精度 等等方法...
在initialize中 除了继承父类initialize的内容
还增加了以下内容
@图片 = Bitmap.new(路径)
@图形 = 0
@方向 = 0
@数据 = 我方数据.new(姓名).制作数据
总结一下父子关系 毫无疑问 父类的东西 是共享的 子类都能使用 而子类除了能使用父类的功能外 还能扩展
有没有注意到 @数据 = 我方数据.new(姓名)
initialize初始化方法中 建立了一个对象@数据
该对象是 我方数据 这个类的一个实例 并且把 姓名参数 传入 我方数据这个类的initialize方法中
这个姓名参数是怎么来的呢 父类 initialize(年龄,身高,体重,姓名) 对就是这个参数
接着看可以看最后一段
class 我方数据
def initialize(姓名)
@姓名 = load_data("目录/姓名.rxdata")
end
def 制作数据
hash = {
"射门力量" => @姓名[0],
"射门精度" => @姓名[1],
"带球速度" => @姓名[2],
"带球加速度" => @姓名[3],
"抢断" => @姓名[4],
"头球" => @姓名[5],
"身体素质" => @姓名[6],
"任意球" => @姓名[7],
}
return hash
end
end
end
这个类 可以看作是一个数据库
作用是 按名称索引文件名 然后读取数据库文件 到对象@姓名 当然这个数据库是事先已经做好的一个数组
所以@姓名 当然也是一个数组
= = 什么是数组 = =
[] 表示一个空数组
a =[1,2,3] 示一个数组a中有3个元素 分别是 1,2,3
访问数组的方法
a[0] a[1] a[2] 分别代表 数组a中第一个元素 第二个元素 第三个元素
很简单
a[0]的值为1
a[1]的值为2
a[2]的值为3
== == == == == == ==
接着看 制作数据这个方法
下看最后 return hash 意思是 返回hash这个变量
hash这个变量又是什么捏?
哦,是一个hash对象(哈西表)
== 什么是 hash ===================
和数组的访问方式有点不同
数组的访问方式就是 a[0] a[1] a[2] ...这样按照顺序的排放
所以数组是有序的排放 数组内部顺序是不会改变的
而hash 是用 键 来访问 所以 hash 是无序的 内部的数据顺序可以不用考虑 用键就可以取到数据
所以在定义hash的时候 要比数组多定义一个键 是用来访问的
定义方法 就是 hash = {"key" => value}
"key"就是所谓的键 必须是字符串 什么是字符串 就是用带""
value 就是值 可以是任意对象
这样 hash["key"] 就能取到值 value了
== == == == == == == == == == == == ==
今天累了 明天接着写 = =bbbbbb
|
|