设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4657|回复: 19
打印 上一主题 下一主题

秀秀RM脚本教程第一章

 关闭 [复制链接]

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

跳转到指定楼层
1
发表于 2008-6-22 17:49:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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
http://rpg.blue/upload_program/files/hide_xiu_96911465.png

Lv1.梦旅人

梦石
0
星屑
111
在线时间
74 小时
注册时间
2006-5-29
帖子
453
2
发表于 2008-6-22 18:02:12 | 只看该作者
啊咧?!还真是秀秀啊~~~
呵呵,坐沙发支持!{/tp}
教程很有特色,学习中~{/qiang}{/qiang}
【我的百度空间】
 不定时更新绘画或像素图~~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

3
 楼主| 发表于 2008-6-22 18:05:47 | 只看该作者
秋弦月啊~新人群好久没看到你了~~考玩试了吧~呵呵
http://rpg.blue/upload_program/files/hide_xiu_96911465.png
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

4
发表于 2008-6-22 18:17:17 | 只看该作者
@数据 = 我方数据.new(姓名).制作数据


可以酱紫吗?
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

5
 楼主| 发表于 2008-6-22 18:31:05 | 只看该作者
档案 搜索 邮件 短信 引用  第4楼

@数据 = 我方数据.new(姓名).制作数据


可以酱紫吗?


饿??应该可以的吧
比如:

class My
   def initialize(name)
       @name = [1,2,3,4,5,6] if name == "zh"
   end
   def start
      hash = {
      "射门力量"      => @name[0],
      "射门精度"      =>  @name[1],
      "带球速度"      => @name[2],
      "带球加速度"  => @name[3],
      "抢断"             => @name[4],
      "头球"             => @name[5],
      "身体素质"      => @name[6],
      "任意球"         => @name[7],
      }
      return hash
   end
end


举个例子:
p My.new("zh").start 是可以返回hash的.....

系统信息:本贴由本区版主认可,66RPG感谢您的热情解答~
http://rpg.blue/upload_program/files/hide_xiu_96911465.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
27 小时
注册时间
2008-2-13
帖子
1740
6
发表于 2008-6-22 19:31:59 | 只看该作者
希望LZ能坚持写下去{/hx}
现在好多脚本教程都讲到一半就停了{/ll}
害得我对脚本的了解还不到一半{/gg}{/gg}{/gg}
好吧,果然换个签名就没人认识我了。我承认我被时间埋没了
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

7
发表于 2008-6-22 19:37:13 | 只看该作者

是调用方法阿
没仔细看

是可以
不过(***.new).start
不是更好些?
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

8
 楼主| 发表于 2008-6-22 19:48:41 | 只看该作者
中文名字 。。。为了给新人们 看的明白些~
.......可以无视这些名称...写得时候最好用英文
类名是不可以用中文的。。。我这个纯属教程
http://rpg.blue/upload_program/files/hide_xiu_96911465.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
9
发表于 2008-6-22 20:12:39 | 只看该作者
呵 ~ 出教程啦 加油= =`
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
41 小时
注册时间
2008-3-5
帖子
2072
10
发表于 2008-6-22 20:29:31 | 只看该作者
我觉得最快的学习方法就是改脚本
你它囧一字母君谁记得……
当时那把剑离我的喉咙只有0.01工分。可是一柱香之后,这个女主人会深深的爱上我,虽然本人平生说了无数的谎话,可是这句最有效:“你应该这么做,我也应该死。
曾经有一取ID的机会放在我面前,我没有珍惜,等我失去的时候我才后悔莫及,人世间最痛苦的事莫过于此。你的剑在我的咽喉上割下去吧!不用再犹豫了!如果上天能够给我一个再来一次的机会,我绝对会取个汉字君。如果非要给这ID加点修饰的话,我希望是……红色加粗……

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 13:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表