Project1

标题: 【RGSS3 入门教程大家写 第二弹】活动开始! [打印本页]

作者: taroxd    时间: 2014-6-21 20:22
标题: 【RGSS3 入门教程大家写 第二弹】活动开始!
本帖最后由 taroxd 于 2014-7-1 09:25 编辑

https://rpg.blue/thread-367517-1-1.html

看着6R现在的人气,感觉堪忧啊……不过既然预告贴都发了,那就干脆发出来吧。

暂时没想到什么面向新手的活动呢~ 总之就这样吧

作者: 余烬之中    时间: 2014-6-21 20:42
本帖最后由 余烬之中 于 2014-6-21 20:45 编辑

求指导~
[fold=1][pre lang="ruby" line="1"]print 1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22*23*24*25*26*27*28*29*30*31*32*33*34*35*36*37*38*39*40*41*42*43*44*45*46*47*48*49*50*51*52*53*54*55*56*57*58*59*60*61*62*63*64*65*66*67*68*69*70*71*72*73*74*75*76*77*78*79*80*81*82*83*84*85*86*87*88*89*90*91*92*93*94*95*96*97*98*99*100[/pre][/fold]
[fold=2][pre lang="ruby" line="1"]print [2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903,2971215073,4807526976,7778742049,12586269025,20365011074,32951280099,53316291173,86267571272,1.39584E+11,2.25851E+11,3.65435E+11,5.91287E+11,9.56722E+11,1.54801E+12,2.50473E+12,4.05274E+12,6.55747E+12,1.06102E+13,1.71677E+13,2.77779E+13,4.49456E+13,7.27235E+13,1.17669E+14,1.90392E+14,3.08062E+14,4.98454E+14,8.06516E+14,1.30497E+15,2.11149E+15,3.41645E+15,5.52794E+15,8.94439E+15,1.44723E+16,2.34167E+16,3.78891E+16,6.13058E+16,9.91949E+16,1.60501E+17,2.59695E+17,4.20196E+17,6.79892E+17,1.10009E+18,1.77998E+18,2.88007E+18,4.66005E+18,7.54011E+18,1.22002E+19,1.97403E+19,3.19404E+19,5.16807E+19,8.36211E+19,1.35302E+20,2.18923E+20,3.54225E+20][/pre][/fold]
[fold=3][pre lang="ruby" line="1"]print [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541][/pre][/fold]
作者: moy    时间: 2014-6-21 20:47
围观一帮大触们卖萌
作者: DeathKing    时间: 2014-6-21 21:47
本帖最后由 DeathKing 于 2014-6-21 22:13 编辑

1. Ruby和RGSS3一定要分开!!!讲Ruby的时候一定专心讲Ruby,不要跟RGSS3搅在一起,把Ruby打扎实了再继续RGSS3。我之前写URG3的时候,就想找个靠谱的人先写一份Ruby教程。

2. 讲Ruby的时候,只需要讲部分子集(尽量越少越好),够写个普通的RGSS脚本就行了。WIN32API之类的暂时不需要,像什么for和each的区别之类的,也不要过分纠结,给一个一般性的导向就行了。

3. 逻辑一定要清楚,整个流程是怎么回事,一定要交代清楚。RGSS3是一个框架,要理解它的工作流程。最好要制作一些示意图,帮助读者理解,但这个的前提是作者对问题本身有着很深刻的理解!

4. 一定要坚持……还要合理更新。想想URG3和RGSS3小探的报告,一拖就是三年,我真感觉有点对不起读者啊………………




后来看到有题……贴代码的话又会被认为是在装逼吧

第一题,简单来说的话用了函数式编程的高阶语义,reduce是所谓的归约。Ruby的Range类支持reduce感觉有点奇怪,最初我用.to_a让Range变为Array,结果还多花了“几个字符”。
A1.
[pre lang="ruby" line="1" file="Reduce"](1..100).reduce(&:*)[/pre]

顺便说一下,这个问题你如果知道了原理,可以写成各种花样的,就是一些函数式编程爱好者(比如我)喜欢玩的把戏而已(注意这不是什么很本质的东西,只是高阶语义的抽象)。
[pre lang="ruby" line="1" file="Functional"](1..100).reduce {|x, y| x * y}
(1..100).reduce &->(i, j) {i * j}

(1..100).to_a.reduce(&:*)[/pre]

一个自底向上计算的斐波那契数列,通常的解法是递归地求解。
[pre lang="ruby" line="1" file="MemoFib"]fib = [0, 1, 1]
3.upto 100 do |i|
  fib = fib[i - 1] + fib[i - 2]
end[/pre]

第三个,作弊吧……要是老老实实做,筛一遍还是可以的。
[pre lang="ruby" line="1" file="Prime"]require 'prime'
Prime.first 100[/pre]

第一题是函数式,第二题有动规的思想(就是所谓的做记忆,先解子问题),第三题就是个算法(我们偷用了Ruby的库)。

看着上面代码写得爽哈?其实对做游戏没多大帮助。

因为RGSS3就只需要你给几个变量赋值,实例化几个窗口啊,喂!
作者: IamI    时间: 2014-6-22 00:24
本帖最后由 IamI 于 2014-6-22 00:48 编辑
To 教程编写者
  本次教程的重点在于OOP概念、块和迭代器、内建类介绍。不会弄得很深。元编程一点都不会涉及。
  如果你认为新人在学习脚本中会遇到什么疑难问题(包括但不限于上面提到的重点),可以在本帖回复。如果问题提得好,我会收录在活动的问题中。
  希望大家踊跃参与编写。

最近流行装逼么。
这里不培养程序员,更不培养某些程序员,做个游戏而已啊!

另@DeathKing,第二题不来点奇怪的操作怎么行呢。
[pre lang="ruby" line="1"]a = (0..99).to_a
ans = [1] + a[2..100].map{|i| a = a[i-1] + a[i-2]}[/pre]
这才是DP的精髓啊
作者: moy    时间: 2014-6-22 00:59
IamI 发表于 2014-6-22 00:24
最近流行装逼么。
这里不培养程序员,更不培养某些程序员,做个游戏而已啊!

不管是不是装逼,OOP的思维方式确实有利于进行工程管理……
抛开那些逼格奇高的专业术语,模块化思想是我认为我学习编程以来最大的收获。至少在重复劳动较多的游戏制作中,如果对此善加利用,绝对能省不少事情。
至于后几个,233,我啥也不知道,编译原理都丢给老师了,至于迭代,还是那句话,饶了我吧!
作者: 后知后觉    时间: 2014-6-22 01:16
基础这种东西...一人发一本 RMXP F1 文档.
把脚本入门基础篇发福读个几遍有个了解有个印象就行了.
要多引导动手能力,并且不要把什么东西都直接放出来.
除了脚本本身以外的东西.学会搜索也是很重要的.
重点应该是引导学习者去运用这些基础知识到对RGSS的改造里去
引导他们去改造RGSS 让他们看到学习成果 或许只是微不足道的修改.但那是继续下去的动力.


以前柳柳写过一篇教程
【RGSS教学】自己动手打造任务系统
我就非常推崇那样的教程.年代久远.现在的这垃圾搜索引擎估计搜不出来= =b
作者: moy    时间: 2014-6-22 01:35
后知后觉 发表于 2014-6-22 01:16
基础这种东西...一人发一本 RMXP F1 文档.
把脚本入门基础篇发福读个几遍有个了解有个印象就行了.
要多引导 ...

前一段话挺赞同,不过后面那一段……已经遗失的就别提了吧(另外能搜到3个结果,两个是求助,一个是已经缺失主楼的06年的帖……
作者: IamI    时间: 2014-6-22 01:54
moy 发表于 2014-6-22 00:59
不管是不是装逼,OOP的思维方式确实有利于进行工程管理……
抛开那些逼格奇高的专业术语,模块 ...

OOP 概念是正常成长过程中要转过的最大一个弯。
函数范式是习惯了OOP之后要转过的第二个大弯。
君不见多少人轻轻松松考过C++以后依然一问三不知,亦不见多少码农辛苦数载不知块为何物。

能够正常理解、应用OOP:那么你已经点燃了火花了,但是绝大多数人都死在这里。
教程,我从06年起看到14年,最大的问题就是理论多实用少,OOP登堂入室,没有问题——但是绝大多数人不需要这些东西,他们只关心怎么做出一个能用的界面。掌握怎么使用p不如掌握怎么使用$game_variables,知道class是什么含义不如知道$game_party的含义。顺带一提,当年K’的教程还知道类这个字眼要用比喻来说明,淡化类这一术语,现在的教程都直接操起板砖就上了。
作者: taroxd    时间: 2014-6-22 05:50
本帖最后由 taroxd 于 2014-6-22 06:37 编辑
DeathKing 发表于 2014-6-21 21:47
1. Ruby和RGSS3一定要分开!!!讲Ruby的时候一定专心讲Ruby,不要跟RGSS3搅在一起,把Ruby打扎实了再继续R ...



1. 十分赞同,因此我几乎没有碰RGSS3,而把这块交给了你的URG3
2. 讲得多少,要看讲的人了。
3. 你不是写了么,URG3。我想要的OOP部分就是想为理解这个打下基础。OOP名字起得很大,但里面的东西很浅。用这个名字只是为了概括而已。
4. 快去填坑!




那些题目本意只是测试循环和条件分歧,还有运算符的使用而已。并不要求写出 (1..100).inject :* 这种东西。
虽然我也很喜欢用这些。
作者: taroxd    时间: 2014-6-22 06:03
本帖最后由 taroxd 于 2014-6-22 06:54 编辑
IamI 发表于 2014-6-22 01:54
OOP 概念是正常成长过程中要转过的最大一个弯。
函数范式是习惯了OOP之后要转过的第二个大弯。
君不见多 ...


防止你们说我装逼,我先把下面的题目也去掉得了。

我的标题是 “OOP概念” 而不是 “OOP思想”,你觉得很装逼么? 可否给我想一个不装逼的标题?为了更好的概括,本帖下面所有的OOP均指这个意思。
我想不出什么标题可以更好地概括“类、对象、方法”这些东西了。
很多人只求一个能用的界面,可是当你不知道Scene和Window是什么的时候,你怎么写出能用的界面?
正是因为OOP这个弯很难转,在RGSS中又不得不转,我才会在这里重点提及。
不求OOP登堂入室,只求能懂什么是类,什么是实例,什么是实例变量,什么是方法。

至于块和迭代器,我也不觉得是什么很装逼的东西。
标题有迭代器,但我不会提到怎么制作自己的迭代器。
但 block 这种东西,还是知道一下比较好吧。只算 each 这个单词的出现次数,RGSS3的默认脚本中已经有近百次了。
为了再简化一点,防止引起误解,我把标题中的“迭代器”删掉得了。我本来指的迭代器,是指 Ruby 中 each 这类的方法!


“不会弄得很深”你加上了红字,我不懂这是为什么。可能是我的语文水平不好吧。比如迭代器,不求编写只求使用。OOP部分不需要登堂入室,但是至少之后要可以理解RGSS的框架吧?当然,

我的想法是:分支循环这种东西,上一次有写,也没什么理解的难度。而OOP和block是理解起来不容易,却恰恰是在写脚本的时候十分常用的东西

我自认为我编程水平不高,因此才会想要弄这样一个活动。否则我要装逼,我为什么不自己写教程?

到时候希望你能来看看,看看我的问题,再看看我是不是在装逼。如果愿意的话,再来写点什么东西吧
作者: 3106345123    时间: 2014-6-22 07:54
我觉得将va帮助手册汉化完全 比一群人发教程要好 毕竟帮助是va本人写的而且较客观 教程是一群人发的所以会掺杂着各种各样的个人理解
作者: taroxd    时间: 2014-6-22 08:09
本帖最后由 taroxd 于 2014-6-22 08:13 编辑
3106345123 发表于 2014-6-22 07:54
我觉得将va帮助手册汉化完全 比一群人发教程要好 毕竟帮助是va本人写的而且较客观 教程是一群人发的所以会 ...


脚本部分已经有完整汉化。我去技术区发个帖转载一下吧
作者: taroxd    时间: 2014-6-22 08:16
3106345123 发表于 2014-6-22 07:54
我觉得将va帮助手册汉化完全 比一群人发教程要好 毕竟帮助是va本人写的而且较客观 教程是一群人发的所以会 ...

事件的话,把鼠标悬停在事件框上,那些说明已经够用了。

VA图书馆里,S叔的教程也十分优秀
作者: 克莉丝    时间: 2014-6-22 08:17
这个时候把雪姐姐挖出来不就行了
作者: DeathKing    时间: 2014-6-22 09:07
本帖最后由 DeathKing 于 2014-6-22 09:09 编辑

无论是OOP还是FP,都是对于解决某一问题的思维建模。思维角度不一样,看问题的方面也不一样,自然解决问题的办法也不一样。

二者殊途同归,都是用于解决问题。OOP重在黑盒抽象,FP也有这个用途,不过更在乎“高阶语义”。像什么map、inject都是Ruby从FP那边抄来的(在SICP中,要求读者实现map、for-each、filter、reduce这几个高阶过程,实际上其它几个过程都可以通过reduce来实现。Ruby中的map、select、filter、inject、each也都是类似的可以由reduce来实现),它们都只是高阶语义而已,并不是什么很本质的东西。

Block正是Ruby从Lisp那里面抄坏的东西,Lisp中函数是一等公民,直接可以当做变量去传递。Ruby不行(Ruby里面Block、Proc、lambda还有方法对象等等,概念很混乱),需要用一些魔法,比如传递代表方法的符号(比如你上面的:*)等等。这是因为Matz想让Block“看起来像控制结构”,结果反而让问题变得更糟。

下面就给出了一个对表做map操作的实现,它用到的全是基本过程,而且你会发现它就是课普普通通的递归函数而已(没有写成尾递归调用或者CPS)

[pre lang="scheme" line="1"](define (map proc lst)
  (if (null? lst)
    '()
    (cons (proc (car lst)) (map proc (cdr lst))))))[/pre]

结论就是,像迭代器这种东西,不用讲得太细,让大家知道是这么回事,并且会使用就行了。迭代器本身的实现非常复杂而精细,仔细考察的话都足够写几篇Paper了。
作者: taroxd    时间: 2014-6-22 09:08
本帖最后由 taroxd 于 2014-6-22 09:20 编辑
DeathKing 发表于 2014-6-22 09:07
无论是OOP还是FP,都是对于解决某一问题的思维建模。思维角度不一样,看问题的方面也不一样,自然解决问题 ...

结论就是,像迭代器这种东西,不用讲得太细,让大家知道是这么回事,并且会使用就行了。迭代器本身的实现非常复杂而精细,自习考察的话都足够写几篇Paper了。


本来就是这个打算啊喂 都是你们这群大触带坏的!!害得我11L还用了红字!

还有一个很重要的问题……URG3不能坑啊……
作者: IamI    时间: 2014-6-22 10:01
不需要。
写一个Scene一个Window,只要知道class、Start、Terminate是一个固定格式,$data_*,$game_* 是什么含义就可以了,这本身就是OOP黑箱的意义。
我真的不用 Block,除非只有一行。在生产环境写 reduce:* 的话 Review 的时候一定会被人爆扁一顿。
这是我的观点:使用 for,语义清晰可辩。对初学者去讲each,map,collect这种本来就是发明用来装逼高深的方法没有意义。
迭代器很多时候特指使用yield的自定义迭代器。

简单而言:如果这是一篇RGSS的语法说明,几千字可以他很快解决问题。
如果是一篇新手向的教程——你必须先考虑对方有多蠢,没错是那些十几岁就想着要做一个网游的家伙们有多蠢,如果不考虑请参见上一条。毕竟了解什么是OOP无助于他立即写出什么看起来很厉害的玩意或者某腾讯游戏升上一级。
作者: taroxd    时间: 2014-6-22 10:22
本帖最后由 taroxd 于 2014-6-22 11:17 编辑
IamI 发表于 2014-6-22 10:01
不需要。
写一个Scene一个Window,只要知道class、Start、Terminate是一个固定格式,$data_*,$game_* 是什 ...


感谢你的认真回复。

写一个Scene一个Window,只要知道class、Start、Terminate是一个固定格式,$data_*,$game_* 是什么含义就可以了,这本身就是OOP黑箱的意义。

原来你是这么看待RGSS的……好吧你赢了。这样确实没有什么问题。
但我坚信,对OOP一定程度的理解是有好处的。

我真的不用 Block,除非只有一行。在生产环境写 reduce:* 的话 Review 的时候一定会被人爆扁一顿。
这是我的观点:使用 for,语义清晰可辩。对初学者去讲each,map,collect这种本来就是发明用来装逼高深的方法没有意义。

RGSS3默认脚本装逼我有什么办法……Ruby就是这样一个装逼的语言。
但是就我个人而言,我认为 each、map、inject、select 这种方法,无论是写起来还是理解起来都比 for 来的容易

迭代器很多时候特指使用yield的自定义迭代器。

是的。你也可以看到,yield这个词除了Fiber.yield之外,在RGSS3默认脚本中也有所应用。
Game_Pictures 和 Game_Followers 都定义了 each 方法,在 Game_Interpreter 中也有自定义迭代器。

简单而言:如果这是一篇RGSS的语法说明,几千字可以他很快解决问题。
如果是一篇新手向的教程——你必须先考虑对方有多蠢,没错是那些十几岁就想着要做一个网游的家伙们有多蠢,如果不考虑请参见上一条。毕竟了解什么是OOP无助于他立即写出什么看起来很厉害的玩意或者某腾讯游戏升上一级。

我没有说这是新手向的教程。我已经很明确,这个教程是面向学习过“第一届RGSS3入门教程大家写”,或者对脚本有初步了解的人。

作者: DeathKing    时间: 2014-6-22 11:22
IamI 发表于 2014-6-22 10:01
不需要。
写一个Scene一个Window,只要知道class、Start、Terminate是一个固定格式,$data_*,$game_* 是什 ...

我反而觉得在Ruby里面使用for反而应该被暴扁啊!而且for还是each等迭代方法的语法糖……像for这种东西,还在外层环境引入了一个新的变量,用迭代器的话,直接就在闭包里,安全无毒。

reduce、map、select之类的语义明显比for强啊!

Ruby Style Guide: https://github.com/bbatsov/ruby-style-guide

Never use for, unless you know exactly why. Most of the time iterators should be used instead. for is implemented in terms of each (so you're adding a level of indirection), but with a twist - for doesn't introduce a new scope (unlike each) and variables defined in its block will be visible outside it.


反正都不是什么很本质上的东西,工程上的实践啦~
作者: moy    时间: 2014-6-22 11:31
DeathKing 发表于 2014-6-22 11:22
我反而觉得在Ruby里面使用for反而应该被暴扁啊!而且for还是each等迭代方法的语法糖……像for这种东西, ...

each确实安全无毒…
而且for写起来太丧气了(让你懒
用for我还不如去用loop+break,起码在控制上更占优势。或者用times来代替那些卧槽的i++
感觉for只是为了方便那些C语言起步的初学者使用些基本功能才弄的吧,起码我确实看不到优势。
作者: 后知后觉    时间: 2014-6-22 11:32
moy 发表于 2014-6-22 01:35
前一段话挺赞同,不过后面那一段……已经遗失的就别提了吧(另外能搜到3个结果,两个是求助,一个是已经 ...

额.应该是论坛改用dz的时候被斩首了...
(, 下载次数: 56)


作者: IamI    时间: 2014-6-22 11:45
DeathKing 发表于 2014-6-22 11:22
我反而觉得在Ruby里面使用for反而应该被暴扁啊!而且for还是each等迭代方法的语法糖……像for这种东西, ...

是。
说的都对。
但是——对新手来说太难了。绝大多数人拥有的是 pascal 或者 C 基础,不是Lisp。
不过说实在的,看到定位目标人群,我觉得我没有必要花费时间下去。
作者: 鑫晴    时间: 2014-6-22 12:27
本帖最后由 鑫晴 于 2014-6-22 12:44 编辑

(╯‵□′)╯︵┴─┴  LS看不懂啊!!!!

能不能写一写脚本废看得懂的东西

比如,教一下怎么写脚本,也就是【实践篇】

基础的语法教程,论坛已经有很多了

写一些实践类的教程吧

就像天干宝典里面那样

举例:

RM大师天干宝典--壬卷(6R技术版)-->理论教程-->跟我从头读脚本(2)

[fold=跟我从头读脚本(2) ]跟我从头读脚本


——写在前面——

阅读本文之前请先确认三件事:
1、    你是否已经能够顺利地阅读大部分默认脚本?如果是,那你可以不必花费时间看这篇文章,因为本文恐怕无法提供你所需要的进阶知识。
2、    你是否愿意学脚本?如果是,请确定你是“愿意”而不是“想要”,与单纯的求知不同,前者意味着你愿意为之付出,无论只是一点点业余时间还是长时间的刻苦钻研。
3、    你是否已经阅读了RMXP自带的F1帮助文档?如果否,建议你打开RMXP,按下F1,将电子书的内容从头到尾读一遍,不管理解了多少。

———————————————————————————————————————

大家早上好 囧/~ 我是小贝。(不是贝克X姆的贝啦。-_\\)
接触RM也有几个月了,一直听到有人在抱怨脚本难学,我不否认这一点-_\\ 但是,看懂默认的脚本并不是一件很难的事情,毕竟么,程序开发出来就是方便人使用的而不是为了刁难人的,何况RMXP还自带了那么人性化的一个帮助文档。理论上说,将F1帮助文档里的内容看懂80%以上,就可以通读大部分的默认脚本了。
然则……理论归理论,实际上看了F1后仍然一头雾水的也大有人在(比如我-_\\)。理论的东西容易流于抽象,不用实践经验将其固定下来的话,仍然是无用的知识。为了尽快将这理论融入实践,接下来的时间里我们将一起学习RMXP自带的最大也是最完善的范例工程——那就是默认工程本身。
Ready?Okay,Let’s go.




教程内容

Scene 0:一些基本概念

Ruby是面向对象的语言,拥有类和方法是面向对象语言的一个典型特征。那么什么是类和方法呢?
打个比方。比如你要在庭院里的(x,y)位置种一棵树,那么种树的全过程如下:

你走到了(x,y)
你掘了一铲子土
你又掘了一铲子土
你又掘了一铲子土
你把树苗竖在坑里
你添上一铲子土
你又添上一铲子土
你又添上一铲子土
你给树苗浇了水
种完了
聪明人很快就发现这种记录方式比较傻,所以我们定义一个叫做“挖坑”的方法:

def 挖坑
你掘了一铲子土
你又掘了一铲子土
你又掘了一铲子土
完毕

这样,写一个“挖坑”就代表掘了三铲子土。同理可以写一个“培土”的方法来代表往坑里添上三铲子土。这样种树的过程简化如下:

你走到了(x,y)
挖坑
你把树苗竖在坑里
培土
你给树苗浇了水
种完了

这样看起来就比较像人话了(喂),而且简化了书写,避免了重复劳动,这里“挖坑”“培土”就是我们新定义的方法。
类其实本质上跟方法差不多,可以看作是包含了一组方法的大方法。比如你想要让一个人专门在庭院里种树,可以定义如下的一个方法:
class 种树工
def initialize(x,y)
  走到(x,y)
  挖坑
  把树苗竖在坑里
培土
给树苗浇水
end
def 挖坑
掘了一铲子土
又掘了一铲子土
又掘了一铲子土
end
def 培土
添上一铲子土
又添上一铲子土
又添上一铲子土
end
end
这样,@老王 = 种树工.new(x,y)就代表老王是一个种树工。这里的x和y被叫做参数,它可以代入范围内的任何数值。
如果没有写“挖坑”的定义部分,就会出现NoMethodError,找不到“挖坑”方法。这也是制作过程中最常见的报错。当程序调用了一个方法,但这个方法并不在该类中时,就会报这个错误。也就是说,即使将“挖坑”这个方法放在其他类中,程序也还是一样找不到,因为调用的是“种树工”这个类,所以它只会在“种树工”这个class中找方法。
类是可以继承的,在class 类名后面加上“<”和另一个类名就可以让前者继承后者中的方法,这样前者就可以使用在后者中定义的方法了。比如定义一个新类叫做“劳动者”,“劳动者”中定义了一个新方法“真·挖坑”,然后把class 种树工改成class 种树工 < 劳动者,这样就可以在“种树者”这个类中调用“劳动者”中的方法“真·挖坑”,虽然“真·挖坑”这个方法并没有在“种树者”这个类中被定义过。不过,在摆放脚本的时候,父类要放在子类上面,否则会出现TypeError。(所以说脚本编辑器里各组脚本的摆放顺序也是有学问的。)
可以直接调用类里的方法,格式是“对象.方法(参数)”(若该方法没有参数就不必带参数),对象必须是该类的实例。比如已经写了@老王 = 种树工.new(x,y)的情况下,再写“@老王.挖坑”就是让(种树工)老王在x,y挖一个坑。

以上是对类、方法和参数的简单说明。仍然觉得陌生也没有关系,这回只是初次见面而已,从今以后就要整天跟他们打交道咯。


--------------------------------------------------------------------------------

Scene 1:Min or Max?——Main


准备工作做完,下面就是正式来解读脚本了。首先来读最初的一组脚本:Main。
有的人可能会奇怪,Main不是放在RGSS最下面的么,怎么变成最初的脚本了?难道RMXP是从下往上执行的?实际上,RMXP确实是从上往下读入Main及其之前全部脚本的(这也就是都把不用的脚本扔到Main下方的原因),但Main以上的脚本内容全都是在定义类和方法,并没有开始任何实质性操作。
不算注释的话,默认的Main一共是12行脚本,可说是默认脚本中最短的一组;但它的跨度却很大,整个RM游戏的运行自始至终是在这个Main中循环着的,所以也可以说它是所有脚本中最长的一组。下面我们来看它的具体内容:

begin
Font.default_name = (["黑体"])
Graphics.freeze
$scene = Scene_Title.new
while $scene != nil
   $scene.main
end
Graphics.transition(20)
rescue Errno::ENOENT
filename = $!.message.sub("No such file or directory - ", "")
print("找不到文件 #{filename}。 ")
end

begin是程序的开始,而下面的rescue Errno::ENOENT则是捕获错误信息。Begin~rescue~end语句可以看作是一个条件分歧,当没有错误时,执行begin下的部分;而当捕获到错误时,执行rescue下面的部分。也就是说,当游戏正常的运行着时,用到过的只有begin和rescue中间的7行。Rescue下面的部分暂时54掉,一个能完整流畅运行的游戏应该是用不着那里才好。

Font.default_name = (["黑体"])是设定游戏默认字体,很多人下了游戏但对话却没有字,那就是电脑中没有这行里设定的字体导致的。除了安装字体外,对于解密游戏还可以用更改这里的字体名的方法,使文字正常显示。(比如范例游戏Alestian Story用的MS细明体一般人电脑里都不会有,其实将这里的字体名改成“Arial”就可以正常显示了) 如果你是游戏制作者,担心玩家因为缺少字体无法正常看对话,可以将这行改成这样:
Font.default_name = (["黑体",”隶书”,”宋体”])
当玩家电脑上找不到黑体时,会用隶书;没有隶书时,用宋体显示。
(注意字体名一定要填完整,比如“楷体”的全名是“楷体_GB2312”,光打一个“楷体”是无法识别的。)
   另外,在这行下面可以添加一句Font.default_size = 20,这句的意思是“设定游戏默认文字大小为20”(默认大小貌似是32,至于这个20是20磅还是20象素我就不知道了-_\\)。在用事件“显示文字”的时候,往往会出现文字超出文字框的状况,有人以为RMXP的显示文字不会自动换行……实际上文本框仍然是自动换行的,将文字调小就可以全部显示了。

   Graphics.freeze是冻结画面,相当于事件中的准备渐变,常用这个指令的人都知道是怎么回事。如果不熟悉也没关系,以后还有很多的机会见到它。

$scene = Scene_Title.new,设定全局变量$scene的初始值。形如$scene的变量(即是以$开头的变量)是全局变量,一经赋值即可在脚本的任何地方调用。“scene”是这个全局变量的名称。Scene_Title是一个类(class)的名称,而new方法则是Class类(默认类,不在脚本编辑器中)生成对象的一个实例,在这里是生成Scene_Title的一个实例。说“实例”有点难以理解的话,可以认为是“生成了一个Scene_Title”。
Scene是英文“场景”的意思,一个RM游戏可以认为是一幕幕的Scene组成的。

while $scene != nil
   $scene.main
end
   这三行是一个while~end语句,意思是“当满足条件的时候则执行while和end之间的部分”,而条件就是写在while右边的语句。Nil意为“无”,一切未经赋值的变量初始值都为nil(并不是0),$scene != nil的意思则是当$scene已经被赋值时(即$scene不为“无”时,这种判断变量是否被赋值的方法经常会用到)。$scene.main是调用$scene的main方法。$scene本质上不过是一个变量,但$scene = Scene_Title.new已经给它赋了值,它现在就是新生成的那个Scene_Title,所以调用它其中的方法就是在调用写在了Scene_Title里的main方法。

Graphics.transition(20)这句相当于事件中的“执行渐变”,参数20表示在渐变时长为20帧(差不多是1秒),也可以是Graphics.transition(20,”路径”)这种书写格式,这样写的时候会用路径指定的蒙版来渐变,相当于事件中设定渐变图形。


   最后简单地说一下程序的运行流程。程序从begin开始,一直到$scene.main这句之前都是执行Main中写好的内容,从$scene.main这句开始调用每个Scene的main方法。(所以每个Scene中直接运行的部分也只有main方法里的内容而已。) 当一个Scene结束,由于没有其他内容可执行又回到了$scene.main这里,这时$scene已经变为新的值,$scene.main便继续调用新scene的main方法,如此一直循环下去。

   Main是默认脚本中最小也是最大的一组脚本,是整个程序的核心部分,但需要改动的地方并不是很多。之所以把它放在第一个来读,除了简短之外,还有熟悉Ruby语境和初步掌握RGSS结构的设想。如果对于某些方法的作用理解困难,不必担心,后面还有的是他们的戏份。


--------------------------------------------------------------------------------

Scene 2 最初的Scene——Scene_Title

   下面要读的是整个游戏的第一个场景:Scene_Title。
   默认的SceneTitle有217行,在默认脚本中算比较长的了。它可以被分成两部分,一是执行时用到的main方法,一是main方法中调用的各种方法的定义。先来看main方法。

   Scene_Title的Main方法从11行开始,到87行结束,忽略掉开头的战斗测试判定,它可以被分为标准的三部分。18~66行是第一部分(生成对象),68~79是第二部分(刷新循环),81~86是第三部分(释放对象)。
   首先来看第一部分。
   
   1-1,18~30行,载入数据库。
$data_actors        = load_data("Data/Actors.rxdata") #——载入角色数据
   $data_classes       = load_data("Data/Classes.rxdata") #——载入职业数据
   $data_skills        = load_data("Data/Skills.rxdata") #——载入技能数据
   $data_items         = load_data("Data/Items.rxdata") #——载入道具数据
   $data_weapons       = load_data("Data/Weapons.rxdata") #——载入武器数据
   $data_armors        = load_data("Data/Armors.rxdata") #——载入防具数据
   $data_enemies       = load_data("Data/Enemies.rxdata") #——载入敌人数据
   $data_troops        = load_data("Data/Troops.rxdata") #——载入队伍数据
   $data_states        = load_data("Data/States.rxdata") #——载入状态数据
   $data_animations    = load_data("Data/Animations.rxdata") #——载入动画数据
   $data_tilesets      = load_data("Data/Tilesets.rxdata") #——载入图块数据
   $data_common_events = load_data("Data/CommonEvents.rxdata") #——载入公共事件数据
   $data_system        = load_data("Data/System.rxdata") #——载入系统数据
   在数据库中设定好的各类数据,被保存在Data文件夹下对应的文件中。load_data(”路径”)则是从指定文件中读取数据的方法。整句$data_actors = load_data("Data/Actors.rxdata")的完整含义是从Actors.rxdata文件中读取数据并赋给左边的变量$data_actors。(实际上这些$data_xxxx都是一些数组……)
   $game_system = Game_System.new,生成一个新的Game_System实例。Game_System中存着一些系统附属数据,比如BGM等声音的控制,事件解释器,计时器等等。$game_system的状态是会被存进存档文件的,所以增加一种数据的话,写进Game_System也是一个不错的选择。
   
@sprite = Sprite.new
   @sprite.bitmap = RPG::Cache.title($data_system.title_name)
   这两句是在生成标题图片。形如@sprite的变量是实例变量(以@开头),它的作用范围限于类的内部,也就是说只在Scene_Title这个类里有用,并且只要是在这个类里,任何一个方法都可以调用它。第一句是生成一个新的Sprite对象(就是图片对象),第二句则是指定这个Sprite的bitmap(位图,就是具体要显示哪张图片)。RPG::Cache.title(“XX”)是将Graphics\title文件夹下名为“XX”的图片读入缓存,可以简单地理解为指定@sprite为这张图片。$data_system就是载入数据库时载入的系统数据,里面记录了数据库“系统”选项卡上的内容,而title_name这个方法则是获得在数据库“系统”选项卡里设定好的标题图片文件名。

   s1 = "新游戏"
   s2 = "继续"
   s3 = "退出"
   @command_window = Window_Command.new(192, [s1, s2, s3])
   @command_window.back_opacity = 160
   @command_window.x = 320 - @command_window.width / 2
   @command_window.y = 288
   37~43,生成一个选项窗口。
   形如s1的变量是局部变量(小写字母或下划线开头,不能是保留字),它的作用范围限于方法的内部。在这里前四行可以合写为@command_window = Window_Command.new(192, [“新游戏”, “继续”, “退出”])。在选项比较少的情况下,分开写并没有什么太大的意义;但当选项多起来的时候,用变量使之简捷美观就变得很有必要了(比如Scene_Menu中的选项窗口)。
Window_Command.new是生成一个新的Window_Command对象(对于生成对象已经很熟了吧?),Window_Command是指令窗口的类,除了继承Window_Selectable中光标相关的各种方法之外,还有诸如disable_item等专为指令窗口设计的方便方法。
back_opacity是设定窗口背景透明度的方法(最小为0——全透明,最大为255——不透明),注意这个方法只有设定窗口背景的透明度,即默认skin的蓝色区域,周围白色的边框和内部的文字都是不透明的。(opacity是连边框一起的透明度,而contents.opacity则是窗口内容的透明度)
x是指定窗口左上角x坐标的方法,y是指定左上角y坐标的方法,width是指定窗口宽的方法,height则是指定窗口高度的方法。这四个值决定了窗口的形状和位置,可以在窗口的类的initialize方法中更改他们,也可以在调用该窗口的Scene中像上面这样更改他们。

   @continue_enabled = false #——设置读档标志为不可用
   for i in 0..3 #——0到3的for循环
     if FileTest.exist?("Save#{i+1}.rxdata") #——若游戏文件夹下存在名为Save#{i+1}.rxdata的文件
       @continue_enabled = true #——设置读档标志为可用
     end #——if判定的end
   end #——for循环的end
   if @continue_enabled #——如果读档可用
     @command_window.index = 1 #——设置命令窗口的索引为1
   else #——否则
     @command_window.disable_item(1) #——设置命令窗口选项为不可用
   end #——if判定的end
   47~59行是在做一个效果,就是如果存在存档文件,标题画面的“读取”选项可用,反之则呈灰色显示。其中@continue_enabled是个普通的实例变量,叫什么都可以,这里只是用它做一个标记方便下面的判断。
   FileTest.exist?("路径/文件名")是判定指定路径下是否存在某文件的方法,其中文件名要打全名(png格式的图片在此也不能省略扩展名)。
   如果一个变量只有真假值时,可以简略的用if @变量名代替if @变量名 == true,用if !@变量名代替if @变量名 == false。
   Index和disable_item(index)都是Window_Command里面的方法(index是用attr_reader而不是def定义的),这个后面会说到。

   接下来的四行比较简单:
   $game_system.bgm_play($data_system.title_bgm) #——开始播放bgm
   Audio.me_stop #——停止播放ME
   Audio.bgs_stop #——停止播放BGS
   Graphics.transition #——执行渐变
   到Graphics.transition为止,整个生成对象部分就完结了。在生成对象部分中,生成了本Scene需要调用到的各种对象,包括窗口,精灵等。同时,一些想要在图像变化之前(随图像一起)开始播放的音乐之类也在此处设定。
   注意,第一部分的内容也仅仅是“设定”,除了设定初始值之外,并不会直接运行。

   接下来是第二部分,刷新循环。这部分比第一部分短很多,且在每个Scene中基本是一样的:
   loop do #——循环
     Graphics.update #——刷新画面
     Input.update #——刷新输入信息
     update #——调用update方法
     if $scene != self #——当场景变换时
       break #——中止循环
     end #——if语句结束
   end #——循环结束
   Graphics.update是刷新画面的指令,让画面前进1帧,无论画面上是否有在活动的东西它都会刷新,可说是游戏中执行次数最多的一条指令。两次执行这条指令的间隔如果超过十秒,就会被程序认为是卡死从而强制关闭,弹出一个“脚本已经被备分”的对话框。如果出现这种情况时,请重启电脑或整理内存,关闭不必要的应用程序然后再测试,如果还出现,那就是程序里有死循环了。标准情况下,未开启平滑模式时,一秒钟会刷新20次画面,开启后一秒钟刷新40次。
   Input.update是刷新输入信息,当某个Scene需要接受按键处理时,就要在loop do循环里加上这么一句,否则Scene是不会管你有没有在按键的。刷新输入信息跟刷新画面一样,也是一秒钟20次或40次。(据说世界上按键最快的人每秒能按键18次?……反正够用的了。=v=)
   If $scene != self,是判定场景是否有变更的语句。Self是个伪变量,它指的是“当前方法的执行对象本身”,听起来有点绕口,实际上可以简单地理解为它就是指SceneTitle,而SceneMap中的self指SceneMap,WindowItem中的self指WindowItem。
   当要变换场景时,使用$scene = Scene_XX.new,然后在这循环里由于$scene的值已变而self值未变,满足了$scene != self,于是执行了break(中断循环),程序往下进行来到第三部分:释放对象。

   释放对象的内容也很短,一共四行:
    Graphics.freeze
   @command_window.dispose
   @sprite.bitmap.dispose
   @sprite.dispose
   dispose方法是将对象释放的方法,将用过的窗口或其他对象用此方法释放掉以节约资源。如果没有将第一部分生成的对象全部释放,每次进入这个场景时都会再生成一次对象,长此以往就会大幅拖慢运行速度,严重时还会卡死。所以当游戏帧数掉的很厉害时,就要仔细检查一下每个Scene是否有把生成的对象全释放掉了。在第一部分生成了三个对象:选项窗口,精灵的图片和精灵本身,这里把他们全释放掉。注意sprite类对象要释放两次,一次是释放掉它的位图,一次是释放它本身。
   Graphics.freeze前面已经说了,是冻结画面的指令,到下次Graphics.transition之前,画面上的一切变化都不会变更。把画面冻结住之后,我们即使释放掉了窗口或图片,它仍然会留在画面上,直到执行下一个Graphics.transition。同理,如果我们在这段期间显示了窗口或图片,它也不会立即在画面上显示出来,直到Graphics.transition之后才会显示。

   这样main方法就结束了。不同的Scene有不同的main方法,但大致上都是可以分为这三段的,且后两段的格式基本都是通用的(特别是菜单类的Scene),虽然长,但并不复杂。

   接下来是Scene_Title中调用的一些方法。首先是不可或缺的update方法,它负责窗口内容的变换和按键处理。Scene_Title的刷新方法还是比较简单的:
def update
   @command_window.update
   if Input.trigger?(Input::C)
     case @command_window.index
     when 0  # 新游戏
       command_new_game
     when 1  # 继续
       command_continue
     when 2  # 退出
       command_shutdown
     end
   end
end
   这里@command_window.update这句是调用Window_Command自带的update方法,先不去管它。下面if Input.trigger?(Input::C)是“当按键C被按下时”,这里的“按键C”并不是指键盘上的C键,而是指空格/回车键(其实C键也行-_-),具体的按键与键盘键位对应表可以在帮助文档中“游戏的操作方法”一节查看。接下来是一个case~when~end分歧语句,@command_window.index是取得光标位置的索引值(索引值为0~[选项个数-1]之间的整数)。Case语句跟上面的if语句合起来就是“按键按下时光标停在某选项上时”,而when下面则调用与该选项相对应的方法。

   110~143,定义了开始新游戏的command_new_game方法。
   $game_system.se_play($data_system.decision_se) #——播放系统“决定”的音效。
   Audio.bgm_stop #——停止播放BGM
   Graphics.frame_count = 0 #——重置画面计数器。这个是数帧数用的,游戏时间就是用帧数/速度算出来的。
   $game_temp          = Game_Temp.new #——生成新的临时对象
   $game_system        = Game_System.new #——生成新的系统附属数据对象
   $game_switches      = Game_Switches.new #——生成新的开关。所以直到选择新游戏那一刻,SceneTitle是无法调用事件里的开关或变量的,因为根本就没生成。
   $game_variables     = Game_Variables.new #——生成新的变量
   $game_self_switches = Game_SelfSwitches.new #——生成新的独立开关
   $game_screen        = Game_Screen.new #——生成新的画面对象
   $game_actors        = Game_Actors.new #——生成新的人物对象。这个是数据库里的全部人物而非队中人物。
   $game_party         = Game_Party.new #——生成新的队伍,这回是队中人物了。
   $game_troop         = Game_Troop.new #——生成新的敌人队列。
   $game_map           = Game_Map.new #——生成新的地图对象。
   $game_player        = Game_Player.new #——生成新的主角,这个主要是处理事件启动判定等。
   $game_party.setup_starting_members #——设置初期同伴,就是设定初期队伍中有哪些人。也就是在数据库——系统选项卡里左上角那里设置的人物。
   $game_map.setup($data_system.start_map_id) #——设置人物初期位置,就是把人物放在标着S的白色小方块的那张地图上。所以当没有设置初期人物位置的时候会报错“找不到MAP000.rxdata”。
   $game_player.moveto($data_system.start_x, $data_system.start_y) #——将主角放置在初期位置,就是放在“S”那格。
   $game_player.refresh #——刷新主角
   $game_map.autoplay #——切换地图的BGM与BGS
   $game_map.update #——刷新地图,执行地图上的并行事件
   $scene = Scene_Map.new #——切换到SceneMap。$scene值在这里改变后,本Scene的循环就会因$scene != self而中断。

   147~158,定义的是读档的command_continue方法。

   unless @continue_enabled #——除非读档标记为真。还记得前面用到的@continue_enabled么?作为实例变量,它可以在main之外的方法被调用。另外就是注意unless和if的区别……(我自己总搞混-_\\)
     $game_system.se_play($data_system.buzzer_se) #——播放“冻结”的系统音效
     return #——结束方法。Return之后,方法会直接结束,不去理会下面的指令。
   end
   $game_system.se_play($data_system.decision_se) #——播放“确定”的系统音效。
   $scene = Scene_Load.new #——切换到读档画面
这个方法很简单,不过return除了结束方法之外还有别的用途,以后再讲。

   162~171,定义了结束游戏的command_shutdown方法。
   $game_system.se_play($data_system.decision_se) #——播放决定音效
   Audio.bgm_fade(800) #——BGM淡出。参数“800”的单位是毫秒。
   Audio.bgs_fade(800) #——BGS淡出
   Audio.me_fade(800) #——ME淡出
   $scene = nil #——场景转换为无。这样当SceneTitle的执行结束,再次回到Main方法时,由于没有Scene可显示,会直接结束。

   最后一部分的battle_test是战斗测试时用的(所以战斗测试并不装载地图,仅由SceneTitle和SceneBattle组成),平时用不到,也没有太大的阅读价值,故不予解读。(实际上无非是装载数据库,设定几个值和场景转换而已,有兴趣也可以看看)

   这样关于Scene_Title的解说就结束了。Scene_Title是游戏最初的场景,在了解了它的构造和功能之后,我们可以着手对其进行各种各样的蹂躏……呃,是改造。比如添加标题画面的选项,改用图片标题菜单,设置标题画面的各种特效(滚动,流星雨,etc.),或者干脆删除不必要的部分直接使用事件做标题画面,都是通过改造这个Scene_Title来完成的。


--------------------------------------------------------------------------------

补充:

试着照版务区某位同志的设想来写的东西……汗。
1万2千字只是开场白orz (这样下去会死人的……-_\\)

还是那句话,懒得看的人通常更懒得看这种长文,而勤快点的人基本上都用不着这么初级的东西了-_-

先扔个三节看看,如果还有人愿意看就接着填

才疏学浅兼之闭门造车,谬误难免,错漏之处还请方家跟帖斧正。

[/fold]


举例:

癫疯侠客的《脚本不是高手的专利》



现在的情况就是,基础语法看得懂,但是自己写得时候却无从下手...


作者: kuerlulu    时间: 2014-6-22 14:29
自己动手打造任务系统

打开之后啥也没有
本来我以为是打开姿势不对,于是用代码编辑器打开看看
结果直接把我吓尿了
(, 下载次数: 113)
作者: 芙蕾娅    时间: 2014-6-22 18:16
来说个感觉很羞耻的事情,这里是个RGSS2&RGSS3脚本断断续续摸了三年多却从未深入,自己动手能力1的偷懒渣渣,
所以脚本水平也只停留在新手以上熟练未满的程度,
但感觉以制作一个普通的RM游戏来说,已经足够了,还要多高端是指柳柳的格斗纹章还是少侠一炷香的那种水平那我就还真不够能力
更羞耻的是,帖子里所提到的"OOP概念","模块化思想","迭代器","block"我其实根本不知道这是什么……
要不是11L的taroxd前辈"迭代器,是指 Ruby 中 each"我才发现迭代器是什么233(话说迭代器真的只是这意思吗?理解能力0.1)
还有18L II前辈提到的each,map,collect的发明是用来装逼我才不会发现我一直在装逼(不对,我貌似经常都在装逼吧)
而且在知道each之前我还真的一直用for和i++来读取数组变量这呆子方式来写脚本
之后知道了each真的很兴奋(然后把自己写的脚本一个个for更改成each然后感觉累不爱变成了一半for一半each的鬼畜脚本)
VA推出后进一步知道了times,map,collect(暂时还不熟练= =)
写起脚本时明明是在写VA的脚本,但我还是会翻回XP和VX的F1或者脚本库看看那些简单的脚本写法,VA的脚本库看着实在太像装逼了渣渣看得头疼(
但之后看回XP的脚本时却感觉容易理解又是另个故事了……
而且我只是一个普通的单纯地想做自己的游戏的白痴的RMer而已~(绕口
因为数学烂,连tan sin cos都不明白,写脚本什么的新手时期我可从来可没想过(当人们幻想起了屈服在脚本下的那个恐惧(离题了
然后忘了哪个大大(貌似是国外RM站的帖子我忘了)写了个Vx教程从更改window_gold后自己动手我感觉酸爽欢乐无比,
就像后知后觉前辈提到的自己动手打造任务系统教程一样,自己动手解决问题是很开心的事情,
之后我有点过渡沉溺在自己动手解决问题所带来的优越感,但回过神来发觉我就是不想深入研究脚本,因为我是来做自己的故事而不是来当程序员的丫!
RM不就是个让不会程序的人制作游戏的工具嘛,搞得如此牛逼还不逼死我这渣渣的存活可能性吗!(一巴掌扇死前面说的话)
题外话:之前貌似看见某报道指某RMer脚本员冲进EB扇了RGSS程序员几巴掌(胡扯)
比起写个让人看得清楚,看得明白的教程,现在应该先从扶起一个RMer了解自己动手改脚本是件多么好玩的事情为优先,他们才会去看脚本教程吧?(竖起食指放在脸前

以上文章只是想到什么写什么(请准备砖头)

作者: taroxd    时间: 2014-6-22 18:28
芙蕾娅 发表于 2014-6-22 18:16
来说个感觉很羞耻的事情,这里是个RGSS2&RGSS3脚本断断续续摸了三年多却从未深入,自己动手能力1的偷懒渣渣 ...

你知道class是什么意思吗?你知道@hp是什么意思吗?这就是OOP概念
你知道 [1,2,3].each {|x| p x} 是什么意思吗?这就是一个迭代器后面跟个block
怎么样,没什么难的吧?你最多只是不知道这些名词而已
话说迭代器真的只是这意思吗?

参考 Game_Interpreter#iterate_actor_id
在 Ruby 中所指的“迭代器”就是这么简单。
但回过神来发觉我就是不想深入研究脚本

不会深入的请放心。这个教程你应该来编写而不是学习。
RM不就是个让不会程序的人制作游戏的工具嘛,搞得如此牛逼还不逼死我这渣渣的存活可能性吗!

RM的广告就是简单和专业的结合啊……
比起写个让人看得清楚,看得明白的教程,现在应该先从扶起一个RMer了解自己动手改脚本是件多么好玩的事情为优先,他们才会去看脚本教程吧?(竖起食指放在脸前

https://rpg.blue/thread-367118-1-1.html
https://rpg.blue/thread-367122-1-1.html
改脚本确实是一件好玩的事情
作者: Mic_洛洛    时间: 2014-6-22 18:38
这看着怎么这么眼熟?貌似我在任VA区版的时候也曾搞过这活动……= =||
我想说,6R真心不是培养程序员的地方~将帮助文档讲一遍或从RUBY教起都不实际……

其实,我觉得将图书馆中简单实用的脚本拿出来,通过讲解实例来让有需要的人学习就好了。
至于基本语句、数据结构、算法设计之类的就别说了。真正想深入的,自然会去恶补基础和拓展相关知识的……
作者: satgo1546    时间: 2014-6-22 20:24
我想来灌水
话说我好想念HAR君、洛洛、还有那个谁谁谁、那个谁谁谁、那个谁谁谁……
作者: 正太君    时间: 2014-6-22 20:47
会改脚本慢慢就会写脚本了...
作者: taroxd    时间: 2014-6-22 20:52
正太君 发表于 2014-6-22 20:47
会改脚本慢慢就会写脚本了...

是。这一点我很赞同。

也许之后我会发个“我是如何改脚本的”之类的帖子,就像moy发的那个一样。

但有的时候,基础就是硬伤呢~

作者: 无脑之人    时间: 2014-6-22 21:44
本帖最后由 无脑之人 于 2014-6-22 22:36 编辑

http://qzone.haoduoge.com/music/90CCA4L43W6C233006CCE5F344DAB5D997A0C.mp3
说奇怪的话一定要放BGM  //《無間の鐘 ~ Infinite Nightmare 》
-----------------------------------------------------------------分割线nia
说真的,如果只是为了上了一天课的学生发泄一下做个小游戏的话不需要这些,但是我觉得这个帖子不是面向他们的,面向他们的教程早已满大街都是了,而且里面的Bug可能和教程数差不多233
然而让一个从脚本渣变成脚本触的教程却很难看到,只能从脚本触们随口提一提的东西里面提取精华
如果说什么参考文档什么的,我相信最开始的时候还意识不到【如果无意识中发现了则是一件极为高兴的事情呢,不是么?
虽然这个帖子最终注定要成为脚本触们乱舞的地方,但是起码是给想要学习成为程序猿的孩纸们【比如咱】一个学习的空间呢
-----------------------------------------------------------------分割线呢
至于OOP/GP/FP什么乱七八糟的,不要明确的提出来就好了啦,这些装B的名词不就是学脚本最好的奖励么【笑
又想起了自己学ruby的时候,满6R的找教程,追踪大触们的足迹,试图寻找新的姿势,哪怕是发现一点点内容,也会一脸激动的记载笔记本上
现在有了这么一个极好的空间,帮助了那些有求知欲的好孩纸们,何乐而不为呢?
通过这个帖子,可以筛选出那些有毅力有求知欲又有自主学习能力的好孩纸们,然后就可以加以辅导与帮助
通过这个帖子,可以拉近脚本渣与脚本触的距离,见贤思齐嘛【我也很想成为DK大大那么厉害的人呢
通过这个帖子,也可以让脚本触们和咱这样的脚本渣们想起以前的时光,跑得快了,回头看一看走过的路不是很有趣么233
-----------------------------------------------------------------分割线喵呜
每次说完奇怪的话就觉得自己前言不搭后语毫无逻辑,哎呀呀不管了呢,反正自己本来就是baka呢,bakabaka~☆
作者: taroxd    时间: 2014-6-23 16:07
本帖最后由 taroxd 于 2014-6-23 20:07 编辑
无脑之人 发表于 2014-6-22 21:44
说奇怪的话一定要放BGM  //《無間の鐘 ~ Infinite Nightmare 》
------------------------------------- ...


为了自顶我就来回复你一下吧。

这个帖子绝不是面向一点都不懂脚本的新人(那是第一届),但也不会搞到触手的等级。我的目标,只是让大家有能力去认识RGSS3这个庞大的体系罢了。

你真的想要在脚本水平上有所提高的话,去翻一些国外的经典教程,去从头到尾翻几遍Ruby文档,去找DK大大学一学元编程都是不错的选择。这次的活动,说到底,也就是如标题所言的,“入门”而已。

-----------------------------------------------------

那位说我装逼的,感谢你的热心参与,但我实在是不知道你为什么要这么说。

6R的所有版主都能看到我对这次活动所做的准备。特别是 @喵呜喵5 @余烬之中 给了我很大支持与帮助。

我相信他们,包括看过我提的问题的所有人都知道,这虽然不是一个“零基础教程”,但确实是一个不折不扣的“入门教程”。
至于他们的写得多深入我就不知道啦~

很多人都知道我有“代码强迫症”的习惯。我会把这个习惯发挥到这个活动里面,尽量确保教程里面没有什么Bug。

预祝活动的圆满成功。尽管我脚本技术不是很过关,但如果我有时间的话,我自己也会参加,为这个活动献出一份力量。

-----------------------------------------------------

活动奖励是泛滥的好人卡哦~ 泛滥成灾~

我也是一样不知所云,感觉自己萌萌哒~
作者: taroxd    时间: 2014-6-24 20:56
本帖最后由 taroxd 于 2014-6-24 21:02 编辑
正太君 发表于 2014-6-22 20:47
会改脚本慢慢就会写脚本了...


既然沉到水区第二页了,我又要自顶一次。但是我不会像某活动一样无节操地纯自顶,我总会写一点东西233

「会改脚本慢慢就会写脚本了...」这句话说得很对。事实上,我第一次接触的RM脚本正是RGSS3。里面没有 for 循环,因此,在改脚本的过程中,渐渐地我便明白了 each 的含义。是的,each 真的非常易于理解。block 什么的,在 ruby 中,也确实没什么特别难的地方。
我写代码到现在,应该一次 for 都没有用过吧……
times,upto,step,each,map,select,find,index,inject,each_with_index……有这么多可爱的东西,我为什么还要去玩 for 呢?

我曾改过错误百出的代码。在 Game_Actor 方法的定义中,我曾经纠结过多次,是写 @hp 还是 hp ?为什么我打 hp = mhp 无效,非得 @hp = mhp 才行?(当然,更久以后才知道,正确的做法是 self.hp = mhp)@hp 到底是谁的 hp ?我都不理解,只是对着默认脚本依样画葫芦。也许我走运得到了正确的代码,也就这么混混过去了。事后看来,代码依旧破绽百出。
我想要明白 RGSS3 这个庞然大物是怎样工作的,可是我做不到。
理解“类、实例、实例变量”,是多久以后的事情了呢……这,不是6R论坛里的教程教给我的。

于是,这便成为我搞这场活动的契机。
F1 帮助文档?讲得实在太快太简略,新人很难理解。
零基础学脚本?这种的论坛里多了去了,就和在书店里找《xx天精通xxx》差不多。可是能讲解到让我们能够阅读 RGSS3 代码水平的却少之又少。
Ruby 教程?中文的太少太老,更无法期待大家都读得懂英文。
我不愿意其他人和我一样再走弯路,因此,我极端注重 OOP 这一部分。OOP 的思想有也罢,没有也罢。但是 Ruby 中,有关对象的二三事,还真是非知道不可。
我的希望是,通过这个活动,能引领大家自己去读懂 RGSS3。我知道这不现实,这种并非面向零基础的教程可能没多少人去看,但是,总有一些和我一样求知欲旺盛的人,会想要这样的东西。

从有这个活动的想法到现在,我得到了许多人的大力支持。

@喵呜喵5 告诉我,我原来的思路太过偏重于理论。于是,我把 F1 帮助文档的实践篇转载了过来,并在教程中添加了一些简单的实际问题。
从活动策划开始,就一直鼎力相助。
他自己,也在这篇帖子里,把理论完全丢在一边把实践的精神付诸到底。

@余烬之中 我已经看到了他写的大段大段的教程。他写得很好、很卖力,给了我这次活动或许可以成功的信心。
不失时机地卖萌,在关键点却十分严肃。我喜欢这样的风格。

@moy 在此写出了编写脚本的过程。尽管他对概念的解释不够准确,但“编写脚本的步骤”,这一点确实很有借鉴意义。
对我不留情面的吐槽,也能有槽必回,十分感谢。

@各位版主们,放任我这样乱来。管理员也默许了我这种一定可能会滥发卡的行为。但我相信,愿意、有能力参加这个活动的人,一定不是为了那几张好人卡,而是和我一样,因为对论坛满满的爱。

@所有支持这个活动的人。我会尽全力把这个教程弄好。即使参与者寥寥,我也会自己把坑全部填上!这个活动一定有结束的一天!

写了这么多不知所云的东西,其根本目的就在于:自顶!
作者: kuerlulu    时间: 2014-6-25 22:42
渣渣在下也就把你们的帖子做成帮助文档(.chm)好了,其他的我不会•﹏•
作者: taroxd    时间: 2014-6-26 05:59
本帖最后由 taroxd 于 2014-6-26 06:02 编辑
kuerlulu 发表于 2014-6-25 22:42
渣渣在下也就把你们的帖子做成帮助文档(.chm)好了,其他的我不会•﹏•


十分感谢!不知可不可以先做起第一届的入门教程呢?(https://rpg.blue/thread-249826-1-1.html)
因为这个教程毕竟不是零起点。
最后那个过程抽象千万不要放进去~

再次感谢~
作者: 鑫晴    时间: 2014-6-27 23:51
To 脚本学习者
  这个教程是面向学习过“第一届RGSS3入门教程大家写”,或者对脚本有初步了解的人。
  所谓“初步了解”,请参考下方的脚本自测题。


脚本自测题呢?

在沙发?还是在4楼?
作者: taroxd    时间: 2014-6-28 06:14
鑫晴 发表于 2014-6-27 23:51
脚本自测题呢?

在沙发?还是在4楼?

能把沙发的脚本用正常的代码写出来就行了

会点循环、分支应该就没有问题
作者: 鑫晴    时间: 2014-6-28 15:51
本帖最后由 鑫晴 于 2014-6-28 16:01 编辑

第一题:



F1帮助文档->脚本入门->基础->循环->for ~ in ~ end


[pre lang="ruby" line="1"]a = 1
for i in 1..100
  a *= i
end
print  a
rgss_stop
[/pre]



第二题:

F1帮助文档->脚本入门->基础->循环->for ~ in ~ end

刚开始看不懂,然后百度了一下才知道,这玩意原来叫斐波那契数列

这个数列从第二项开始,每一项都等于前两项之和。
F1=1
F2=1
Fn=F(n-1)+F(n-2)(n>=2,n∈N*)

[pre lang="ruby" line="1"]def Fibonacci(n)
  a,b=1,1
  print a,",",b,","
  for i in 3..n-1
    b=a+b
    a=b
    print b,','
  end
  print a+b,"\n"
end
print Fibonacci(18)
rgss_stop[/pre]


第三题:

  呵呵,难怪这么眼熟,原来是质数
一个大于1的自然数,如果除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。

然后...呵呵 我不会告诉你我是照搬DeathKing的

[pre lang="ruby" line="1"]require 'prime'
Prime.first 100
[/pre]






作者: kuerlulu    时间: 2014-6-28 18:56
因为眼前正好有RMXP的css就直接拿来用了[噗@taroxd @无脑之人
先看看行不行, 可以的话我就继续弄
(, 下载次数: 163)
(, 下载次数: 152)
期末终于考完了..
作者: taroxd    时间: 2014-6-28 18:58
本帖最后由 taroxd 于 2014-6-28 19:20 编辑
kuerlulu 发表于 2014-6-28 18:56
因为眼前正好有RMXP的css就直接拿来用了[噗@taroxd @无脑之人
先看看行不行, 可以的话我就继续弄



@kuerlulu
爪机上了电脑版论坛看了一下,ok~ 谢谢
作者: taroxd    时间: 2014-7-1 09:25
ゲームスタート!
作者: VIPArcher    时间: 2014-7-2 02:08
虽然能解决一些简单的问题,但是对写教程表示无力啊。




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