跟我一起學(xué)ruby
By Tiger
注:本教程轉(zhuǎn)載自在游戲先行者論壇,版權(quán)屬于作者Tiger。
第一篇
第二篇
第一篇
自序
從今天起我就要開(kāi)始學(xué)Ruby了。怎么樣,沒(méi)見(jiàn)吧?一個(gè)新人寫教程。就憑我堅(jiān)強(qiáng)的毅力,科學(xué)的自學(xué)方法,以及我的鉆研精神,我有信心學(xué)通Ruby,而同樣是新手的你也可以!由于本教程是菜鳥(niǎo)教萊鳥(niǎo)若有什么不對(duì)的地方還請(qǐng)前輩指教!如果沒(méi)人看,就當(dāng)我自愚自樂(lè)了。
======================================================================
卷首語(yǔ)
--------------------------------------------------------------------------
準(zhǔn)備知識(shí)
一、為什么要學(xué)Ruby?
不用說(shuō)一定是幫助發(fā)揮RM的潛力啦。而Ruby有多好多壞都與我無(wú)關(guān),因?yàn)槲覍W(xué)它只為了一個(gè)原因--RM!
二、什么是Ruby?
它是一種純粹的面向?qū)ο缶幊痰哪_本語(yǔ)言。這就像C語(yǔ)言啦,就是一種電腦聽(tīng)得懂的語(yǔ)言,就好比你對(duì)電腦大叫一聲“我要上網(wǎng)”它是不會(huì)讓你上網(wǎng)的,必須通過(guò)一種語(yǔ)言來(lái)告訴它,Ruby就是其中之一,當(dāng)然Ruby也要用打的,不是用說(shuō)的...
三、學(xué)Ruby要準(zhǔn)備啥?當(dāng)然是RM了,我還準(zhǔn)備了三個(gè)東西:
.筆記本--別看不起它,這可是重中之重,你的一些疑問(wèn)與炅感、研究得出的結(jié)論都可記在上面.
.一個(gè)新工程,我暫時(shí)把它命名為Test,它將用研究與實(shí)踐.
.另一個(gè)新工程,我暫時(shí)把它命名為標(biāo)準(zhǔn),它的作用是萬(wàn)一你把自帶的Ruby改得面目全非,有它可以做參照。當(dāng)然RM的腳本數(shù)據(jù)是保存在 Data 文件夾內(nèi)的 Scripts.rxdata 文件中的,你也可以對(duì)此文件進(jìn)行備份。
--------------------------------------------------------------------------
實(shí)踐基礎(chǔ)
一、關(guān)于腳本腳本編輯器:
.RM中,進(jìn)入腳本腳本編輯器的方法是按F11或在主菜單「工具」菜單中選擇「腳本編輯器」。。
.腳本編輯器中一些快捷鍵(感謝carol3,這不是我發(fā)現(xiàn)的):
tab:可以跳格、能夠自動(dòng)進(jìn)行縮進(jìn)
ctrl + 鼠標(biāo)滾輪 : 調(diào)整文字的大小
ctrl + F:查找本頁(yè)腳本
ctrl + shift + F:查找所有腳本
ctrl + H:替換
ctrl + A:全選
ctrl + C,ctrl + V:拷貝粘貼
ctrl + Z,ctrl + Y:撤銷與重做
F3:和ctrl + F配套使用,"查找下一個(gè)"
F4,F(xiàn)5:選擇上一個(gè)/下一個(gè)腳本
F6:把現(xiàn)在選的這一行命名為本腳本名
ctrl + enter:保存并關(guān)閉本窗口
二、創(chuàng)建程序的步驟:
.確定程序的目標(biāo)-比如你的目標(biāo)是做一個(gè)求三角形面積的程序。
.確定要使用什么樣的方法-我知道S=1/2ah=1/2abSinC,求角度太煩,且后者不是單獨(dú)的乘除運(yùn)算,故吾選前者。
.創(chuàng)建程序。
三、編程中應(yīng)養(yǎng)成的好習(xí)慣:
.寫注釋。很多人認(rèn)為寫注釋是在浪費(fèi)時(shí)間——但別忘了——當(dāng)你在寫代碼時(shí),也許你的思路清楚;然而當(dāng)程序逐漸變大,或當(dāng)你面對(duì)幾個(gè)月前寫的代碼時(shí),注釋的作用就顯而易見(jiàn)了。
在 Ruby 中,# 符號(hào)后面的一整行文字會(huì)認(rèn)定為注釋。當(dāng)你要寫大塊的注釋時(shí), 也可以用 =begin 和 =end 的中間的一切為注釋。
注釋是綠色的,不會(huì)執(zhí)行,不會(huì)影響到程序的運(yùn)作,只作為編寫者標(biāo)記的備忘記錄來(lái)使用。
未完成...
四、編譯錯(cuò)誤的看法
當(dāng)你拼寫、語(yǔ)法有錯(cuò)誤了,程序就會(huì)停止運(yùn)行,并告訴你相關(guān)的信息,此時(shí)再按F11進(jìn)入腳本編輯器,就會(huì)看到光標(biāo)放在了出錯(cuò)的那一行。
如圖:
行:未初始化的常量“Persond”
具體的方法我還沒(méi)有總結(jié)。未完成...
--------------------------------------------------------------------------
TypeRun
(本來(lái)下文是不準(zhǔn)備發(fā)的,但有人說(shuō)本教程寫的有些脫離RM,所以發(fā)了下文——不準(zhǔn)備發(fā)的原因是我不知道carol3的“RGSS區(qū)置頂腳本整理中,目前收集腳本:30,望大家添加”一帖中竟然有教程!而且有一部分與我的幾乎一樣,算了,為了保證教程的完整性,我就把我寫的發(fā)上來(lái)了...絕非抄襲!)
讓我們來(lái)入手Ruby:
實(shí)踐:標(biāo)題畫(huà)面的部分自定義
實(shí)踐目的:
.學(xué)會(huì)Ruby的研究方法。
.學(xué)會(huì)根據(jù)注釋來(lái)做一些實(shí)驗(yàn)。
.熟練腳本編輯器中一些快捷鍵的使用。
打開(kāi)腳本腳本編輯器
.在腳本腳本編輯器的左邊找到scene_title
.可以在右邊的筐架中看到第一行:
#=====================================================================
# Scene_Title
#------------------------------------------------------------------------------
# 處理標(biāo)題畫(huà)面的類
#=====================================================================
我們知道這是注釋,它的意思就是說(shuō)scene_title這代碼是用于處理標(biāo)題畫(huà)面的。同理,我們可以隨便看看其它的組(組就是類似scene_title的在腳本腳本編輯器的左邊的一竄一竄的代碼),怎么樣,它們的用途一目了然吧!
.既然知道它是用于處理標(biāo)題畫(huà)面的,我們就拿它開(kāi)刀吧!
游覽一下:讀取數(shù)據(jù)庫(kù);生成系統(tǒng)對(duì)象;...這些都太深?yuàn)W了在往下看——
s1 = " 新游戲"
s2 = " 繼續(xù)"
s3 = " 退出"
終于看到了熟悉的中國(guó)字了,呵!這不是RM中標(biāo)題畫(huà)面的選項(xiàng)嗎!
看看它上面的注釋——生成命令窗口。果然是標(biāo)題畫(huà)面的選項(xiàng)。
我們改了它試試:
s1 = "新的輪回"
s2 = "舊的回憶"
s3 = "隨風(fēng)而逝"
按ctrl + enter:保存并關(guān)閉本窗口。
再按F12運(yùn)行游戲。果然成功了!
.人的野心總是無(wú)限的,我還想添加一個(gè)關(guān)于本游戲!好再試試:
s1 = "新的輪回"
s2 = "舊的回憶"
s3 = "隨風(fēng)而逝"
s4 = "關(guān)于本游戲"
.貪得無(wú)厭總有一些心虛,再看看它下面的內(nèi)容再運(yùn)行游戲吧!
@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
有x、y大蓋是在說(shuō)選項(xiàng)的框框吧!糟了,多了一個(gè)選項(xiàng),框框就一定要變長(zhǎng),如果不去修該框框的屬性選項(xiàng)會(huì)出現(xiàn)選項(xiàng)無(wú)法顯示出來(lái)的情況。管它呢!就算是真的我也無(wú)能為力...
第一行有個(gè)(192, [s1, s2, s3])s1,s1,s3好象與s1 = "新的輪回"等中的s1,s1,s3說(shuō)的是同一個(gè)東西吧?既然我加了s4,就得把s4也加進(jìn)去:
@command_window = Window_Command.new(192, [s1, s2, s3,s4])
s4;s3之間學(xué)它樣也用 , 連接。
.再運(yùn)行游戲。果然出現(xiàn)了關(guān)于本游戲選項(xiàng)而且框框也能自動(dòng)調(diào)整把四個(gè)選項(xiàng)納入其中??梢?jiàn)我們剛才的猜測(cè)是錯(cuò)的,有x、y大蓋是在說(shuō)框框
的位置?
由圖可知:紅色框中的星星與框框上端的相對(duì)位置在修改前后沒(méi)有變過(guò),而藍(lán)框中框框下端與RPG字符的相對(duì)位置的相對(duì)位置發(fā)生了變化,也就是說(shuō),框框上端的位置是不變的,當(dāng)有新的選項(xiàng)時(shí),自動(dòng)延伸框框的下端。而有x、y大蓋是在說(shuō)選項(xiàng)的框框的上端的位置?
.再試試:
復(fù)制代碼 代碼如下:
s1 = "新的輪回"
s2 = "舊的回憶"
s3 = "隨風(fēng)而逝"
s4 = "關(guān)于本游戲"
s5 = "asd"
s6 = "sdasd"
s7 = "weqw"
@command_window = Window_Command.new(192, [s1, s2, s3,s4,s5,s6,s7])
果然,有標(biāo)題顯示不出了。
.再看看:
s1 = "新的輪回"
s2 = "舊的回憶"
s3 = "隨風(fēng)而逝"
s4 = "關(guān)于本游戲"
@command_window = Window_Command.new(192, [s1, s2, s3,s4,s5])
這會(huì)出錯(cuò)。
s1 = "新的輪回"
s2 = "舊的回憶"
s3 = "隨風(fēng)而逝"
s4 = "關(guān)于本游戲"
@command_window = Window_Command.new(192, [s1, s2, s3])
關(guān)于本游戲?qū)⒉粫?huì)被顯示。
.現(xiàn)在的關(guān)于本游戲還無(wú)用處。我們可以參照"新的輪回""舊的回憶""隨風(fēng)而逝"來(lái)給它功能。凡是它們有的我都給關(guān)于本游戲加上。往下看,注意到有:
def update
@command_window.update
# 按下 C 鍵時(shí)
if Input.trigger?(Input::C)
case @command_window.index
when 0 # 新游戲
command_new_game
when 1 # 繼續(xù)
command_continue
when 2 # 退出
command_shutdown
end
end
end
when-當(dāng)...時(shí),這好象類似條件分歧的條件部分,注釋告訴我這是選擇新游戲;繼續(xù);退出不同命令的分歧。
那么command_new_game;command_continue;command_shutdown就是動(dòng)作了。他們會(huì)不會(huì)是Ruby中已經(jīng)定義過(guò)的東西?如果是那么你為關(guān)于本游戲?qū)懫渌臇|西是沒(méi)用的。那就讓關(guān)于本游戲和退出共用一個(gè)東西吧:
復(fù)制代碼 代碼如下:
def update
@command_window.update
# 按下 C 鍵時(shí)
if Input.trigger?(Input::C)
case @command_window.index
when 0 # 新游戲
command_new_game
when 1 # 繼續(xù)
command_continue
when 2 # 退出
command_shutdown
when 3
command_shutdown
end
end
end
運(yùn)行之,果然是這樣!按了關(guān)于本游戲就退出了。可見(jiàn)command_shutdown是用來(lái)調(diào)用退出命令的。那它會(huì)不會(huì)是Ruby中已經(jīng)定義過(guò)的東西?我們?cè)偻驴矗?
.
#--------------------------------------------------------------------------
# 命令:新游戲
#--------------------------------------------------------------------------
.
.
.
.
.
.
.
#--------------------------------------------------------------------------
# 命令:繼續(xù)
#--------------------------------------------------------------------------
.
.
.
.
.
.
.
#--------------------------------------------------------------------------
# 命令:退出
#--------------------------------------------------------------------------
這好象是在分類討論。它們都以 def xxxxxxx開(kāi)頭,而xxxxxxx的內(nèi)容就是前面分歧中各選項(xiàng)所對(duì)的內(nèi)容了??梢?jiàn)那它不是Ruby中已經(jīng)定義過(guò)的東西。那就為我們自定義留下了余地:
復(fù)制代碼 代碼如下:
def update
@command_window.update
# 按下 C 鍵時(shí)
if Input.trigger?(Input::C)
case @command_window.index
when 0 # 新游戲
command_new_game
when 1 # 繼續(xù)
command_continue
when 2 # 退出
command_shutdown
when 3
abc
end
end
end
復(fù)制一下 命令:退出中的內(nèi)容,并粘貼在退出后,把粘貼的內(nèi)容中的 def command_shutdown改為def abc。運(yùn)行之效果和前面一樣。
好了就我現(xiàn)在的實(shí)力,也只能進(jìn)行到此了,如果懂一些語(yǔ)法,可以把def asd下面的內(nèi)容改一改。
--------------------------------------------------------------------------
總結(jié)
未完成...
--------------------------------------------------------------------------
作業(yè)
.程序開(kāi)發(fā)的步驟?
.試著使用腳本編輯器中一些快捷鍵。
提高題:
試著總結(jié)腳本編輯器使用中出現(xiàn)的一些錯(cuò)誤類型及其看法。
未完成...
-------------------------------------------------------------------------------------------------------------------------
答案
略
第二篇
第一章——類,對(duì)象和方法
--------------------------------------------------------------------------
準(zhǔn)備知識(shí)
既然說(shuō)Ruby是一種純粹的面向?qū)ο缶幊痰哪_本語(yǔ)言,那么我就從對(duì)象開(kāi)始學(xué)起。
一、對(duì)象是什么?
游戲中的任何東西都可以被可以解釋為對(duì)象。
錢的數(shù)目是對(duì)象,村長(zhǎng)是對(duì)象,流氓甲也是象。因?yàn)镽uby所能處理的值都是對(duì)象,為了方便對(duì)象的操作就引進(jìn)了類的概念。
二、類是什么?
對(duì)象的種類就稱為類。
村長(zhǎng)和流氓甲屬于NPC類,錢的數(shù)目屬于自然數(shù)類(注:這里所說(shuō)的類你可以自己定,你也可以說(shuō)村長(zhǎng)和流氓甲屬于人類:屬于哺乳類:屬于...)
一些特殊的屬于這個(gè)類的對(duì)象叫作類的實(shí)體(或?qū)嵗?
在日常生活中,我們對(duì)一切對(duì)象的分類都是有一定層次的。
我們知道:生物〉動(dòng)物〉哺乳類〉人類
村長(zhǎng)和流氓甲屬于人類,它就一定有哺乳類的屬性,也就一定有動(dòng)物的屬性。我們稱生物是動(dòng)物的父類,動(dòng)物是生物子類,不難發(fā)現(xiàn)子類會(huì)繼承父類的屬性。當(dāng)然也會(huì)遇到這樣的情況:父類的某些屬性不可以被某一特定的子類繼承——雖然一般鳥(niǎo)類都會(huì)飛,但企鵝是鳥(niǎo)類中不會(huì)飛的一個(gè)子類。
得到自然界這種規(guī)律的啟發(fā),Ruby就引進(jìn)了繼承。它大大減少了程序員的工作量,我們只需要定義一個(gè)父類(或叫做超類)的屬性,它的子類就會(huì)自動(dòng)繼承它父類的屬性。當(dāng)然當(dāng)你遇到像上文提及的那個(gè)企鵝特例還要新增或重定義子類和父類之間的區(qū)別。繼承的意思,就是保持被繼承者的性質(zhì)但卻同時(shí)擁有自己獨(dú)有的特性。
引進(jìn)了類只是方便對(duì)象的操作,那么究竟怎么操作對(duì)象呢?那就要用方法了。
三、方法是什么?
方法是某個(gè)類中所有的對(duì)象專用的命令。
你只需在某個(gè)對(duì)象上調(diào)用某個(gè)方法就可以讓這個(gè)對(duì)象施行這個(gè)方法所代表的方法。而這個(gè)被操作的對(duì)象稱為“作用實(shí)例”或是“方法的參數(shù)”。
比如說(shuō)你養(yǎng)了許多狗,(狗是一個(gè)類,被你養(yǎng)的狗是它的子類)有一個(gè)叫旺財(cái)(旺財(cái)是對(duì)象,也是實(shí)例),你每天訓(xùn)練他們坐下(這是在定義一個(gè)方法),之后每當(dāng)你發(fā)號(hào)坐下這個(gè)命令時(shí)(這是在調(diào)用坐下這個(gè)方法)被你養(yǎng)的狗就會(huì)坐下。(你就通過(guò)方法完成了對(duì)對(duì)象的操作)。假如被你養(yǎng)的狗還分狼狗和哈巴狗二類,(狼狗和哈巴狗是被你養(yǎng)的狗的子類),它們會(huì)繼承它父類中定義過(guò)的方法。當(dāng)然一個(gè)類中可以定義許多方法(你可以教狗許多東西)。
又比如說(shuō)把Ruby看作CD機(jī),CD機(jī)所操作的一切東西——CD就是所有的對(duì)象,類是歌曲的風(fēng)格(如RM是一類,Rap是另一類);當(dāng)然你也可以把歌手當(dāng)類的分法(如周杰倫是一類,陳奕迅是另一類),而調(diào)用方法就是按播放按鈕,停止按鈕,暫停按鈕等。
實(shí)踐基礎(chǔ)
在Ruby中創(chuàng)造一個(gè)對(duì)象并對(duì)其進(jìn)行操作的步驟如下:
首先得定義類的屬性——
一、類的定義
格式:
class 類名
類中定義的內(nèi)容
end
注意:類名必須以大寫字母開(kāi)頭。
如果是一個(gè)子類就這樣寫:
class 子類名 父類名
類中定義的內(nèi)容
end
或在定義后面直接寫上:
class 子類名 父類名
end
這只是讓父類繼承父類,不是重定義。為什么這么說(shuō)呢?
光有一個(gè)類還不行,接著再往里面塞方法,以便以后對(duì)對(duì)象的操作。
二、方法的定義
方法的定義寫在“類中定義的內(nèi)容”那里
格式:
def
方法中定義的內(nèi)容
end
注意:方法必須以小寫字母開(kāi)頭。
當(dāng)然當(dāng)你遇到像上文提及的那個(gè)企鵝特別的子類時(shí),你還要重定義子類和父類之間的區(qū)別這叫稱為重載,格式同上。方法的調(diào)用如反復(fù)定義,則以最后一次為準(zhǔn)。
在子類方法中調(diào)用父類相同方法的情況下,要使用關(guān)鍵詞 super。super將調(diào)用被當(dāng)前方法覆蓋的父類中的同名方法。
格式:
super(定義的內(nèi)容, ... )
若省略括號(hào)和參數(shù)時(shí),將會(huì)把當(dāng)前方法的參數(shù)原封不動(dòng)地傳遞給父類中的同名方法。若調(diào)用時(shí)不想使用參數(shù)的話,請(qǐng)使用括號(hào)顯式地標(biāo)出,像super()這樣。
最后創(chuàng)造一個(gè)屬于這個(gè)類的對(duì)象(實(shí)例)——
三、實(shí)例的創(chuàng)造
格式:
實(shí)例名 =類名.new
實(shí)例終于創(chuàng)造好了,現(xiàn)在就該對(duì)它進(jìn)行操作了。
四、方法的調(diào)用
在ruby里,我們通過(guò)點(diǎn) . 來(lái)調(diào)用一個(gè)對(duì)象的方法
格式:
已創(chuàng)造的實(shí)例名.方法名
如果你要?jiǎng)?chuàng)造一只臨時(shí)存在的實(shí)例,并給其加上方法:
(類名.new).方法名
或:
類名.new.方法名
復(fù)制代碼 代碼如下:
class NPC
def intro
print "我是NPC?"
end
end
class LioumangNPC
def talk
print "XX在村子的南方"
end
end
流氓甲=Lioumang.new
流氓甲.talk #顯示 我是NPC?
流氓甲.intro #因?yàn)榱髅ゼ桌^承了它的父類的方法,所以顯示 XX在村子的南方
說(shuō)明:
~5定義一個(gè)類——NPC
~11定義一個(gè)NPC的子類——Lioumang
~4為NPC定義一個(gè)名叫intro的方法,print " "的做用是顯示“”內(nèi)的東西。(先不要管它怎么運(yùn)作的)
~10為L(zhǎng)ioumang定義一個(gè)名叫talk的方法
創(chuàng)造實(shí)例——流氓甲
為流氓甲調(diào)用talk的方法
為流氓甲調(diào)用intro的方法
二
復(fù)制代碼 代碼如下:
class NPC
def intro
print "aaa"
end
end
class LioumangNPC
def intro
print "bbb"
end
end
流氓甲=Lioumang.new
流氓甲.intro
說(shuō)明:
顯示的是bbb,可見(jiàn)方法的調(diào)萌綬錘炊ㄒ?,则以最后一磽氇准。但染J?3行變?yōu)?流氓甲=NPC.new 則顯示aaa
三
復(fù)制代碼 代碼如下:
class NPC
def intro
print "aaa"
end
def talk
print "ccc"
end
end
class NPC
def intro
print "bbb"
end
end
流氓甲=NPC.new
流氓甲.intro
流氓甲.talk
說(shuō)明:
先顯示的是bbb,再顯示ccc,可見(jiàn)類如反復(fù)定義,則以保留他們交集的補(bǔ)集,他們的交集以最后一次為準(zhǔn)。但如果13行變?yōu)?流氓甲=NPC.new 則顯示aaa。
四
復(fù)制代碼 代碼如下:
class NPC
def talk(a=nil) #nil為空集
p a
end
end
class Lioumang NPC
def talk(a)
super(5) # 以5作為參數(shù)進(jìn)行調(diào)用
super(a) # 以5作為參數(shù)進(jìn)行調(diào)用
super # 以5作為參數(shù)進(jìn)行調(diào)用,super(a)的簡(jiǎn)寫
a = 1
super # 以1作為參數(shù)進(jìn)行調(diào)用,super(a)的簡(jiǎn)寫
super() # 無(wú)參數(shù)的調(diào)用
end
end
Lioumang.new.talk 5
說(shuō)明:
~4方法的作用是顯示變量a,而a=nil,既顯示nil
可見(jiàn):若省略Super的括號(hào)和參數(shù)時(shí),將會(huì)把當(dāng)前方法的參數(shù)原封不動(dòng)地傳遞給父類中的同名方法。若調(diào)用時(shí)不想使用參數(shù)的話,請(qǐng)使用括號(hào)顯式地標(biāo)出,像super()這樣。
您可能感興趣的文章:- ruby 學(xué)習(xí)筆記(2) 類的基本使用
- ruby 學(xué)習(xí)筆記(1) 初識(shí)語(yǔ)法
- 在Ruby on Rails中優(yōu)化ActiveRecord的方法