魔劍工舖

關於部落格
RPG製作大師XP腳本為主要更新

RPG製作大師VX腳本為其次更新

RPG製作大師VX_Ace目前不考慮

RPG製作大師MV腳本完全沒打算

留言完建議重新整理看看是否顯示

目前不處理本舖外腳本的相關問題

其他相關事項請觀看規定注意事項

本舖未來的經營計畫與VA的支援




var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-37462754-1']);
_gaq.push(['_trackPageview']);

(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

  • 294223

    累積人氣

  • 82

    今日人氣

    0

    訂閱人氣

【教學】基礎入門

  

 

基本輸出
腳本跟RM的事件指令其實有蠻多相似處的,一樣從上面往下面讀取一行一行執行
當一個腳本頁執行完畢之後會改由下1個腳本頁執行,執行到最後1個腳本結尾之後
程式就會自動的關閉,不信的話可以把腳本全砍光光,測試遊戲時出現窗口然後就關閉了
而預設腳本不關閉遊戲實際上是因為預設腳本「Main」的緣故防止執行到尾部來實現的
不過本篇先不探討預設腳本以及在RGSS環境下才有的擴充方法,先以解析Ruby語法為準
 
首先來介紹1段很簡單的腳本,可在1個空白的腳本頁中做測試
(如果你沒照我的意思全砍預設腳本,則腳本頁要新增在「Main」腳本頁的上面)
p("hello, world")
然後就可以直接測試遊戲來觀看這個腳本的效果了
測試之後除了RM的遊戲視窗外,緊接著還會再彈出1個小視窗顯示 "hello, world" 的字樣

這個 p 為Ruby的一種標準輸出的方式,用於顯示或者檢視訊息之用
在寫腳本做測試時非常常使用,因為簡短、易讀、方便,常用於檢視結果之用
你可以試著改改看 雙引號 之中的文字,不管長度為何,都會忠實的顯示給你看
 
我個人為了方便,通常測試時都簡寫成這樣,實際上是效果是一樣的
p "hello, world"
此外每個文字可以使用小逗號進行分開,這可在一次性檢視多個資料,例如
p "魔劍工舖", "Hello World!!", "RPG製作大師"
執行後,小視窗的內容如下,或自動幫你分行好並顯示於同個小視窗之中

以上是在RMXP和RMVX使用 p 方法的顯示方式
再Ruby解釋器或者是RMVA的中使用 p 方法時,則是直接輸入到主控台視窗中
以下我加上 [Ruby] 標籤表示Ruby解釋器環境;[RGSS3] 標籤表示RMVA環境
如果我加上了 [CMD] 標籤表示這是主控台的輸出結果,不是腳本喔~
以下是在RMVA環境下執行上面腳本的結果,如下
[RGSS3] [CMD]
"魔劍工舖"
"Hello World!!"
"RPG製作大師"
而在Ruby解釋器環境下執行的話結果為
[Ruby] [CMD]
"u9B54u528Du5DE5u8216"
"Hello World!!"
"RPGu88FDu4F5Cu5927u5E2B"
仔細對照後會發現,英文和符號的文字都可正常顯示預期中的結果
而中文字則會變成 uXXXX 的這種格式,其實Ruby解釋器顯示的是這個中文字的編碼值
而非這個編碼所代表的中文字來顯示,如果Ruby解釋器要顯示中文
可將 p 改成 puts 方法,這個改法也適用於 RMVA 中
[Ruby] [RGSS3]
puts "魔劍工舖", "Hello World!!", "RPG製作大師"
[Ruby] [RGSS3] [CMD]
魔劍工舖
Hello World!!
RPG製作大師
!RMXP和RMVX沒有主控台,使用puts並無效果,此外puts輸出不會輸出不會有雙引號符號
如果你把RMVA的預設腳本砍光,則需再行尾添加『Graphics.wait(99999)』便於看結果
RMXP和RMVX使用 p 彈出的小視窗有讓腳本暫停執行的功能
而RMVA將結果輸入到主控台的方式並不會造成腳本執行的暫停
所以會造成上面說過所有腳本執行完畢之後自動關閉程式的問題
又或者跟RMXP和RMVX一樣使用小視窗顯示也行,如接下來要說的~
!Ruby解釋器只要在CMD視窗執行ruby指令來執行腳本就不會自動關閉了
 
其實RMVA還是有像RMXP和RMVX那樣,用小視窗顯示結果的方式(也具有暫停效果)
只是 p 要改成 msgbox_p 或者 msgbox 而已 ( msgbox_p 的結果比較貼近於 p 的內容)
[RGSS3]
msgbox_p "魔劍工舖", "Hello World!!", "RPG製作大師"
 
 
註解(註釋) 
註解為不會被系統解讀的程式碼,註解你可以打上任意內容,都不會影響程式的執行
註解的功能不是給電腦解讀腳本用的,而是給 "人" 解讀腳本用的!!
有時候腳本寫到後來(尤其龐大的腳本),你可能會忘記這段腳本是做什麼用的
又或者看著別人的腳本時,看到一大串看不出功能的腳本需花時間逐步解讀實在很麻煩
於是可以在程式碼上面加上註解,說明這段腳本的功用又或者是代表甚麼功能...等等
 
單行註解  
顧名思義,就是將1行內容給註解,換行之後就會自動改回當一般程式碼來做執行
要使用單行註解,只需要加上井字號 # ,則井字號右邊的內容均會被當成註解,直到換行為止
由於單行註解只會讓 # 符號右邊的內容視為註解, # 符號左邊的內容依然視為程式碼
#p "ABCD"  這行不會輸出結果
p "Sword" # 彈出小窗口顯示魔劍工舖4個字
執行以上腳本後,只會彈出1個小視窗顯示『"Sword"』而已就沒了
以上腳本第1行雖然看似也會彈出小視窗寫『"ABCD"』,但實際上測試是不會顯示的
為了方便檢視,我會將註解特別改成綠色字,這綠色字加不加進腳本編輯器都不會影響結果
以剛剛的腳本為例,綠色字就是註解的部分,系統會忽略掉綠色字的內容不會執行
#p "ABCD"  這行不會輸出結果
p "Sword" # 彈出小窗口顯示魔劍工舖4個字
 
單行註解在RMVA和Ruby解釋器還有另一種功能
那就是宣告本腳本頁中的文字編碼為何種編碼
只要這個註解在第1行,而但第1行無正常腳本(也就是只有註解沒有程式碼)
並且該註解內容只要出現『coding:』字樣時,無論大小寫
則『coding:』之後的下個文字就會被視為是編碼名,此時就定義了該腳本的編碼
以下舉例一些合法的寫法例子,如下 (以下每行都1個可行的例子)
合法例子中,第1個為最簡易寫法,後3個是常見的寫法,剩下的都是測試給你看用的寫法
[合法的例子]
#coding:編碼
#encoding:編碼
# -*- coding: 編碼 -*-
# -*- encoding: 編碼 -*-
   #    coding:       編碼
#CodING:編碼
#ABCcoding:編碼 DFG
[不合法的例子]
0#coding:編碼
#c oding:編碼
#coding:
coding:編碼
#coding 編碼
編碼:設定編碼的名稱,例如『utf-8』、『US-ASCII』...等,如果該行會錯誤則不支援該編碼
!不合法的寫法不會被判別為編碼宣告,所以等同普通的註解 
!RMXP和RMVX不會有效果,即使使用了也等同普通的註解那般
 
以下是使用例,宣告該腳本頁的腳本編碼為US-ASCII編碼,此範例一定要第1行有效
[Ruby] [RGSS3]
#encoding:US-ASCII
puts "魔劍工舖"
以上腳本執行會引發SyntaxError錯誤然後關閉,原因是因為US-ASCII編碼不支援中文所致
!順便一提,在RMXP、RMVX、RMVA顯示錯誤訊息一致都是使用小視窗來顯示的
 只有在Ruby解釋器中是將錯誤訊息直接寫入在主控台視窗之中然後中止執行
 
 
多行註解 
=begin
註解內容
=end
如果說你要註解好幾行的程式碼或者是要輸入好幾行的說明內容
此時使用單行註解的話,你必需1個1個慢慢的在左邊添加 # 符號才能達成,很麻煩
於是Ruby提供了1次性將多行內容註解功能,以『=begin』開頭表示註解的開始
然後使用『=end』代表註解結束,只要將註解放在這兩個腳本之間,不管幾行均為註解
!『=begin』和『=end』必需在該行的最左邊才會生效,否則會出錯
!『=begin』和『=end』所在行的右邊是可以打註解的(但需要用空格來隔開),如下 
p(0)
=begin p(1)
p(2)
p(3)  
=end p(4)
p(5)
# 以上腳本只會顯示0和5共2個小視窗,1到4的腳本視為註解所以不會顯示出來
 
腳本結束 
__END__
雖然這個嚴格來說可能不算註解,但基本上是可以拿來當註解來使用
這個代表Ruby程式碼的結束處,這之後的內容均不會再執行,除非到下個腳本頁為止
p(1)
__END__
p(2)
p(3)
執行後只會顯示1共一個小視窗,2和3的小視窗不會顯示
!『__END__』只能夠放置在該行最左邊才有效,否則正常情況下會出錯
!Ruby解釋器中,在CMD中只執行ruby指令來輸入多行腳本時,可用此語句結束來輸入
!在Ruby解釋器中,會多定義1個常數DATA,該常數儲存的為『__END__』之後的內容
 但不是字串,而是檔案(File)對象,這邊先講個特性,有興趣之後可參閱該對象的方法 
 
臨時註解 
!此註解不是Ruby的功能,而是RMVX和RMVA對腳本編輯器所新增的額外功能 
這是RMVX開始新增的功能,RMXP沒有處理臨時註解的功能所以跟使用單行註解一樣
臨時註解其實就是Ruby的單行註解,只是會再井字號 右邊添加 波浪號 作為標記而已
也就是改成『#~』這樣寫而已,其功能、特性都跟單行註解一樣(也可拿來編碼宣告)
臨時變數的功能是在腳本編輯器時,能夠快速的將多行1次註解或者是解除註解來使用
使用方式為將在VX腳本編輯器中反白腳本(任意行數,不需整行內容都反白)
之後對反白內容按下鍵盤 Ctrl + Q (或者滑鼠右鍵選擇最後1個選項也可以)
則所有被反白的腳本該行最左邊會自動添加 #~ 符號來註解這些腳本
來方便你快速的將特定幾行腳本註解或者是暫時讓某段腳本無效化來使用
對有『#~』開頭的腳本使用的話,則自動刪除 #~ 恢復成一般的程式碼(解除註解)
!#~ 需在該行最左邊才成立,加個空格也不行,否則想使用刪除 #~ 反而又多了1個出來
!連續的臨時註解(如:#~#~#~), 只會刪除1個#~符號而已(需重複使用才會清光) 
 
之後的範例中我都會用註解標示理論上的執行結果內容以及腳本說明,如下
# 該腳本小視窗的輸出結果我註解來說明,以節省之後龐大的說明字數
p "ABC" #=> "ABC"
 
 
數值計算 
程式最基本的用途還是在於計算方面,可以說是你只要提供公式(程式碼)
系統就會自動幫你將你所要的結果計算出來給你,最典型的就是數字的運算
比方說,1加2等於多少,直接使用以下程式碼執行後,就會告訴你答案是 3 
p 1 + 2 #=> 3
除了加法外,當然減法、乘法、除法,此外還有求餘數、乘方等計算可使用
# 加法
p 5 + 2 #=> 7 
# 減法
p 5 - 2 #=> 3
# 乘法
p 5 * 2 #=> 10
# 除法
p 6 / 2 #=> 3
p 5 / 2 #=> 2  (整數運算會捨棄掉小數點,所以結果不是2.5)
# 求餘數
p 5 % 2 #=> 1  (餘數除法結果為 2...1,1無法在整除,所以結果是1)
# 乘方
p 5 ** 2 #=> 25  (即 5 * 5)
p 5 ** 3 #=> 125  (即 5 * 5 * 5)
當然整個運算式可以自由增長並且混用其他的計算符號,如下
p 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 #=> 55
p 10 * 3 / 2 + 5 - 3 #=> 17
到這邊我先問你1個問題,你認為以下程式碼會輸出什麼結果呢?
p 5 + 7 * 3
如果你認為是輸出 36 的話你可能數學要重修了!!
實際執行的時候會輸出 26,雖然正常情況下程式碼是從上往下,從左讀到右的
這是因為數學有先乘除後加減的規則
所以乘除類的都會優先(註:求方是乘法的1種;求餘數是除法的一種,所以也優先)
所以以上程式碼先執行了『7 * 3』得到21,然後在『5 + 21』得到26這個數值 
 
雖然我話是這麼說啦,但實際上那些符號先執行需看優先級規則而定
如下表,排越上面的符號都是最優先的執行的,越下面的則越後面執行
當然有很多目前還沒介紹的符號功能,不過之後就會碰到了,可之後再回來看此表也行
:: 常數引用符
[ ]、[ ]= 元素引用、元素寫入
** 指數(次方)
!、~、+N、-N 邏輯非(NOT)、位非(位補)、正數、負數 (N為數值)
*、/、% 乘法、除法、求餘數
+、- 加法、減法 (此處的+和-不是正數和負數符號)
>>、<< 位右移、位左移
& 位和(OR)
|、^ 位或(AND)、位異或(XOR)
>=、>、<=、< 大於等於、大於、小於等於、小於
==、===、!=、<=>、=~、!= 跟比對是否有相等或不相等的符號
&& 邏輯和(OR)
|| 邏輯或(AND)
? : 符號型條件分歧結構
=、符號= 附值代入(符號可為運算子,如+=、-=、||= 之類的組合)
defined? 判斷是否定義以及定義的類型名稱
not 邏輯非(NOT)
or、and 邏輯和(OR)、邏輯非(AND)
if、unless、while、until 條件分歧以及循環條件
由上表得知,乘法和除法的符號在加法和減法的上面,於是乘法和除法優先計算
當然上表也可發現指數比乘法和除法的位置還要高,所以會先計算指數的運算符
p 3 * 5 ** 2 #=> 75  (運算子**優先級較高,所以先計算 5**2 得25,再3*25得75)
 
假設有必要要加或減優先計算要怎辦呢? 先想想在數學是怎表示要優先加減的
當然就是加上括號,括號內的計算式會優先計算然後再計算括號外的計算式
p (5 + 7) * 3 #=> 36  (括號先算,所以先5+7等於12,在12*3得到36)
偶爾括號內可能還有需要更優先的先計算,因括號內也會遵從優先級規則
所一般數學會使用中括號 [ ] 和 大括號 { } 來表示括號內更優先計算的計算式
不過在 Ruby 中,中括號和大括號有其他意義與功能存在,直接使用可能出錯
所以通常可以在小括號內在放置小括號,然後最裡面的小括號優先計算,如下
p 1 + (5 * (7 - 3)) / 2 #=> 11
括號內的括號先算,所以先 7-3 得到4,在括號內的 5 * 4 先算得到20
此時計算式就變成了 1 + 20 / 2 ,先乘除所以20/2等於10,1在加10就是答案11了
  
負數計算 
數值可以為負數值,可直接在數值左邊加上減號(而但不能有空格),如下
p -100 #=> -100  (定義數值負一百)
當然負數也是可以被計算出來的
p 5 - 7 #=> -2
p -5 * 3 #=> -15
p -5 * -2 #=> 15  (負負得正)
不過定義負數的時候要稍微注意一下,因為負數跟減法是使用一樣的符號
所以要得知Ruby是如何判定這個符號是減號還是負數定義很重要,避免發生問題
p - 10 # 出錯,系統會看成  p 減 10  (錯誤說明是說 NilClass未定義 - 方法,這錯誤說明先不提)
p 5-3 #=> 2  (判定為減法)
p 5- 3 #=> 2  (判定為減法)
p 5 -3 #=> 2 (判定為減法)
p 5 - 3 #=> 2  (判定為減法)
p 5--3 #=> 8  (判定為『5 - (-3)』,也就是5減負3)
p 5---3 #=> 2 (判定為『5 - (--3)』,這邊會被看作是兩個負數符號,對負數加負號會得正,最終為3)
當然也可以在數值左邊添加 + 符號來定義正數,不過這通常意義不大就是了...符號一樣不顯示的
p 123 #=> 123
p +123 #=> 123
p +-123 #=> -123  (使用正數符號無法將負數轉為正數,如要轉為正數請用絕對值)
# 計算絕對值:不是使用『|-123|』,而是右邊添加『.abs』即可獲取絕對值
p -123.abs #=> 123
p (5 - 8).abs #=> 3  (如果要將計算結果輸出成絕對,則需將運算過程用括號包住)
  
浮點數(小數)計算  
小數的定義只需要兩個數值之間添加小數點就可定義,即使小數為0也一樣
p 10.5 #=> 10.5
p 0.0 #=> 0.0
之前有個例子是5除以2得到2而非2.5是因為整數間的運算結果會自動捨棄小數點
如果有必要計算出小數的話,只需要兩數值其中1個數值是小數,則其結果則為小數
p 5 / 2 #=> 2
p 5.0 / 2 #=> 2.5
p 5 / 2.0 #=> 2.5
p 5.0 / 2.0 #=> 2.5
p 38 / 10 * 10 #=> 30  (整數除以整數結果還是整數,38/10結果是3而非3.8)
p 38 / 10.0 * 10 #=> 38.0
一但數值變成小數後,就視為是浮點數,所以輸出的時候必定都是以小數來輸出
即使小數計算結果小數部分為0,依然還是被視為小數,所以還是會有小數點
# 即使計算結果理論上是整數,但還是會添加小數點和0
p 0.5 + 0.5 #=> 1.0
p 1.0 + 1.0 #=> 2.0
雖然一般情況下,1.0會判定跟1 一樣,在某些情況執行上還是會有差異
(就如同使用 p 的輸出結果為 1.0 和 1 的差異就是其中1種差異性)
所以必要時還是需要轉回整數,例如可以右邊添加『.to_i』來捨棄小數
p 3.5.to_i #=> 3
p (2.5 + 5.7).to_i #=> 8  (先計算括號結果得8.2然後再捨棄小數點0.2得8)
當然除法會有除不盡的數又或者是整除後小數非常龐大的數
比方說 1 除以 3 等於多少,假設要求小數的話,你會發現不管怎除
3都會無限循環下去,變成 0.3333333333333333...這樣無限個3
程式計算一般來說只有顯示特定幾位的數值,以RGSS環境來說結果如下
p 1 / 3.0 #=> 0.333333333333333
不過Ruby還是會做嘗試將這無限個3乘以3會等於變回 1.0
但直接定義0.333333333333333乘以3的就不行了喔
p (1 / 3.0) * 3 #=> 1.0
p 0.333333333333333 * 3 #=> 0.999999999999999
!浮點數的計算可能造成誤差,這在很多程式語言都會碰到的問題
 這可能因計算或者是跟浮點數的2進制表示導致的無限小數所造成的誤差有關
 所以在電腦世界中,浮點數幾乎只能算出近似值,有興趣可搜尋『浮點數的誤差』 
# 浮點數的比對,由於還沒介紹到 == 和 true、false,所以此範例提供一個參考與概念
# 判斷 0.1 和 0.1 是否相等,輸出true表示相等
p 0.1 == 0.1 #=> true
# 計算 1.1 減 1.0的數值,輸出結果為 0.1
p (1.0 - 0.9) #=> 0.1
# 判斷 1.0減0.9(理論上是0.1) 和 0.1 是否相等,輸出false表示不相等
p (1.0 - 0.9) == 0.1 #=> false
# 實際上1.0-0.9算出的0.1只是0.1的近似值,跟直接指定的0.1是不相等的
實際上在Ruby解釋器和VA上執行以上腳本結果為,就知道為何會不相等了
[Ruby] [RGSS3]
p (1.0 - 0.9) #=> 0.09999999999999998  (1.0-0.9因誤差問題而不是0.1)
 
隨機數(亂數)
以上計算都是以固定數值做計算,其計算的結果都是固定並符合預期中的答案
不過有時候還是需要製作需要機率性質的東西(命中率、掉寶率、抽獎機率...等)
這時候就需要用到隨機數,隨機數顧名思義,就是產生1個非固定數值的方法
要產生1個隨機數,需要使用 rand 方法,他的用法跟使用 p 方法是差不多的
rand 可以指定1個數值或者是不指定接省略不寫 
rand
rand 最大值
rand(最大值)
最大值:指定1以上整數,則產生的0至該最大值(但不包含最大值) 的數值
    如果指定的是小數則捨棄小數點的部分以整數形式設定
    如果此值省略或者為0或者為nil時,則產生0到1(不含1)的隨機小數
為了方便檢視,我選用有加括號的『rand(最大值)』來當使用
假設最大值設定為5,則會產生0到 最大值減1 的隨機整數,即0到4中任一個數
之所以不包含最大值本身是因為隨機的數值包含0,這也佔據了1個隨機結果
比如說最大值相當於分數的分母,而分子為1,所以說最大值指定20則機率為20分之1
由於隨機數包含0也算是1個數值,如果把最大值的數值算進去則機率變成21分之1
反而變得不合理(設定20但會產生21種結果),所以隨機數才不包含最大值這個數值
以下是使用例
# 你可反覆進行多次測試,每次測試的結果都不一定相同
p rand # 隨機產生一個超長小數,例如:0.195543324109167
p rand(0) # 效果等同上行腳本
p rand(1) #=> 0  (隨機產生0到0的整數,所以必定產生0)
p rand(2) # 隨機產生0或者是1
p rand(10) # 隨機產生0到9中任何一個數(包含0和9,但不會產生10)
不過這樣都只能從0開始產生隨機數,假設要產生特定範圍的隨機數呢?
比如說要產生5到12的隨機數要怎麼做? 其實只要用很簡單的計算就能達到
5到12範圍的隨機數,5是隨機數的最小值,此時只需對隨機數加上5
則不管隨機數產生什麼數值都會加5,即使隨機數產生出0,加5之後就是5
這邊又有個問題了,如果最大值設定為13(即隨機數最高產生出數值12)
如果隨機數產生12,則12加上5不是就變成17了嗎??
因應隨機數的最小值增加,則就需減少對應數值的 最大值,也就是說最大值需減5,如下
p rand(13 - 5) + 5  # 也可寫成『p rand(8) + 5』
# 輸出5至12任一個整數
以上範例中,先13-5等於8,所以此時相當於執行『rand(8)』,即產生0到7任一數
然就再加上5,你可以算算看,不管0到7任一個數值,都會在5到12的範圍之中
 
 
變數(變量)  
變數為一個可以將資料儲存的一個空間,功能跟RM事件指令 [變數操作] 相當
不過 [變數操作] 只是儲存數值 ,而 [開關操作] 和 [獨立開關操作] 只能儲存開和關
而腳本中的變數除了能儲存數值、開或關外,還能儲存字串,還有其他類型的資料
此外Ruby中的變數有不同類型的變數,例如有實例變數、全域變數,功能類似的常數
這些變數在不同的位子區域上定義變數會有引用上的差異性
由於定義的位子還沒有提到,所以這邊先使用最基本的區域變數和全域變數來做說明
往後會再介紹其他類型的變數的定義以及用法
  
區域變數(局部變數、臨時變數) 
在Ruby中,要建立區域變數需要命名一個變數名子並且進行儲存動作即可建立
比方說以下腳本就等於是定義了一個區域變數了
a = 0
這樣子就產生了1個名稱為 a 的區域變數,儲存了數值0,是不是很簡短呢~
上面的腳本中的等於可別看成是數學的等於,所以以上腳本不是什麼未知數a為0之類的
程式中的等於相當於 儲存(輸入、附值),所以上面腳本為將0儲存於區域變數a裡面
這邊提醒一下,並不是所有的名子都可以命名成區域變數,區域變數命名有以下規則
● 名子開頭第1個字不是大寫半型英文:因為大寫開頭具有定義常數的意義,以後會提
● 不能使用半型特殊符號:因為通常特殊符號都是具有功能性的,但不包含底線 _ 符號
● 禁用保留字(關鍵字),有些名子在Ruby中是具有特殊意義與功能的,所以不能使用
以下這些為Ruby的保留字,命名跟以下這些單字完全相同都是不行的
alias and begin break case class
def do else elsif end ensure
false for if in module next
nil not or redo rescue retry
return self super then true undef
unless until when while yield defined?
BEGIN END        
在RM的腳本編輯器中,保留字會以藍色字來做表示來方便區別是否該單字為保留字
除此之外,如果開頭已經明確能認出是區域變數,之後內容可使用數字和大寫字母
本人舉例以下這些都是都是合法的區域變數命名
[合法的例子]
abc
abc123
a1b2c3
/abc # 全形符號不再此限,全形符號基本上可比照為中文字
_abc
aBC
Abc  
# 只識別半型字母,所以全型大寫英文被視做區域變數
魔劍工舖 # 使用中文來命名區域變數是可行的(但一般來說不建議)
iF # 雖然上表中保留字有 if ,但Ruby會區分大小寫,所以 iF 不被當成是保留字
in_ #  雖然上表中保留字有 in,不過命名字數也需相符在判定是保留字,所以可用

[不合法的例子]
+abc  # 正常情況下會出錯,他會被當成把 abc 轉為正數表示
a-bc # 正常情況下會出錯,會被看成是 區域變數a 減 區域變數bc
1abc # 出錯,會出現語法錯誤(會被判定為不合法的數字定義)
Abc # 不會出錯,但此變數其實並非區域變數,而是所謂的 常數
if 正常情況下會出錯,因為使用保留字來命名,必須使用保留字以外的字才行
這邊提醒一下,變數要放在等於的左邊,要儲存的值則要放在等於右邊
否則以下腳本會出錯
0 = a # SyntaxError錯誤
系統會看成是拿數值0去儲存變數a,0為數值,不代表變數名稱也不是個空間
 
如果直接命名而不使用等於進行儲存動作的話,系統會判別為方法呼叫(通常會出錯)
a # NameError錯誤
 
建立區域變數之後,之後你就可以直接打上該變數的名稱來直接引用儲存的數值
a = 12
p a #=> 12
甚至也可以直接拿變數進行計算是可行的,如下
a = 12
p a + 5 #=> 17   (變數a儲存12,此時a就等同12,所以等同執行『p 12 + 5』)
a = 5
b = 3
p a * b #=> 15  (變數a儲存5,變數b儲存3,所以等同執行『p 5 * 3』)
這邊做個小考試,請問以下的『p a』會輸出甚麼數值呢?
a = 4
a + 2
a * 5
p a
答案不是30,答案還是4沒有變,也就是說區域變數a還是4並沒有變化
其實以上中間的『a + 2』和『a * 5』實際上系統是有執行的
也確實有把答案算出來,只是沒有修改變數a的數值,也沒用 p 方法顯示出來
所以這兩行腳本可以說是沒有意義,單純系統在做白工而已
!但有些情況並非無意義,要看 + 和 * 等這些符號的定義是否有被修改過而定
其實系統只會單純引用變數中所儲存的值,但不會去修改變數的值
如果真要將計算結果儲存於變數中,則需再使用 = 符號再次進行儲存動作,如下
a = 4
a = a + 2    # a+2,變數a此時為4,所以4+2為6,然後將6儲存在變數a中 
a = a * 5    # a*5,變數a此時為6,所以6*5為30,然後將30儲存在變數a中 
p a #=> 30
由於 = 符號的優先級很低,所以通常是會先計算完之後才會輪到 = 符號執行
以上的這種寫法相當常見,所以Ruby也提供了 符號加上等於的組成 來讓寫法簡化
以下腳本和以上腳本的執行效果基本上是相同的
a = 4
a += 2  # 直接將變數a所儲存的值+2,等同『a = a + 2』
a *= 5  # 直接將變數a所儲存的值*5,等同『a = a * 5』
p a #=> 30
使用這種附帶儲存功能的計算符,其優先級都跟一般等於的優先級一樣
a = 3
a -= 5 + 2      # 會先「5+2後a-7」而非「a-5再+2」
p a #=> -4
a = 3
a *= 5 + 2     # 會先「5+2後a*7」,先乘除後加減也不適用有儲存功能的計算符了
p a #=> 21
 
話說知道這些區域變數的命名規則後,是否有想過 p 這個英文字能用來定義區域變數呢?
英文 p 是英文半型小寫、保留字也沒有它的蹤跡,但卻都符合區域變數的命名規則
而且 p 不就是以上範例常用的輸出指令嗎? 這樣子的話,那 p 還能定義為區域變數嗎?
其實是可以的,p 也可當作區域變數的名稱來使用,而且並不會影響 p 本身的功能
p = 123 # 定義區域變數p,儲存123
p 456 #=> 456  (此時 p 為方法呼叫,執行輸出456)
p p #=> 123  (左邊的p當作方法呼叫,而右邊的p當作區域變數)
p p 0 # 兩個p都判別為方法呼叫,此處會先輸出0再輸出nil,即看成為『p (p 0)』
基本上只要名稱右邊不是符號而是輸入值的時候,均判定為區域變數,反之則為方法
第3行腳本右邊的 p 沒有輸入值(沒數字、沒變數、沒字串...等),判定為區域變數p
第4行腳本右邊的 p 有輸入值0,所以當作方法,先執行『p 0』
然後 p 這個方法在執行完畢之後本身會傳回nil這個值,再透過左邊的 p 輸出這個nil
 
區域變數顧名思義,就是在特定區域中使用變數
當你定義1個區域變數之後,然後新增1個新的腳本頁
然後在新的腳本頁嘗試引用該區域變數時就會出錯
因為區域變數只在該腳本頁中有效,所以區域變數也可稱為臨時變數,即用完了之後就丟了
這個特性在事件指令 [腳本] 也是相同的,區域變數在不同的 [腳本] 事件都是不共通的
[事件指令]
註解:這個事件指令會出錯
◆腳本:a = 5
◆腳本:p a * 3

[事件指令]
註解:這個事件指令可正常運行,輸出15
◆腳本:a = 5
:  :p a * 3
!實際上只要定義區域不同,能夠同時存在2個以上同名區域變數
 而且該同名的區域變數彼此也不相干,可各自儲存不同的資料
 
全域變數(全局變數) 
區域變數是個只在自己區域中有效,當離開本區域時自動清除變數
如果說有需要將變數用在其他的腳本頁、事件指令中,都能夠使用該變數
則可以使用全域變數來定義一個所有區域都可以引用的永久變數
全域變數的定義為開頭使用金錢符號 $ 加上變數名稱即可宣告
此時變數名稱不管是大小寫都視為全域變數,就連保留字也可以使用
!某些符號也可以用於定義全域變數,不過這些通常都是系統定義好的全域變數
之後的操作方式就跟區域變數基本上相同,可儲存修改或者是引用...等
[事件指令]
註解:這個事件指令可正常運行,輸出15
◆腳本:$a = 5
◆腳本:p $a * 3
!也可以將腳本編輯器中定義的全域變數拿到事件指令來做使用 
 
全域變數不需要用等於做儲存動作即可直接使用 (因為全域變數不會被視為方法呼叫的緣故)
不過直接引用全域變數的話預設值為nil而不是0,所以直接使用計算符通常情況會出錯
p $abc #=> nil
p $abc + 5 # NoMethodError錯誤,為 nil 沒有 + 這個方法,簡單來說就是nil不能使用加法
$abc = 0 # 將全域變數abc儲存0 (將nil修改成0)
p $abc + 5 #=>5 
使用全域變數固然方便,但可能造成資源上的浪費以及容易產生撞名的情況
比如你可能只計算1個數值之後就不使用了,但該變數的資料還是依然存在
如果你大部份資料都用全域變數儲存,如果不小心取到一樣的名子
則可能導致資料被覆蓋使其他原先使用該全域變數的腳本產生問題
 
除了以上兩種類型的變數外,Ruby還有實例變數和類別變數兩種類型的變數
這兩種變數再往後會再做介紹,現在介紹的話頂多感覺很像全域變數而已
 
 
常數(常量)  
如果變數的話就是會變化的數值的話,那常數就是常而不變的數值
意思就是不會變化的數,但雖說如此,實際上常數的操作方式大部分都變數相同
Ruby要定義常數很簡單,只要命名的名稱開頭為英文半型大寫的26個字母即可
不過當然不能使用保留字來命名,畢竟有兩個保留字是大寫開頭的(BEGIN 和 END)
開頭確定之後,後面跟區域變數的命名一樣隨意,可大小寫、可數字、可中文...等
定義常數跟區域變數一樣,需先進行儲存動作,否則觸發NameError錯誤
A = 0 # 定義常數A,其值
相簿設定
標籤設定
相簿狀態