關於部落格
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);
})();

  • 303700

    累積人氣

  • 67

    今日人氣

    0

    追蹤人氣

【腳本】選項設置教學


我先隨便做1個選項範例
class Sword
  def main
    s1 = "選項1"
    s2 = "選項2"
    s3 = "選項3"
    s4 = "選項4"
    @command_window = Window_Command.new(160, [s1, s2, s3, s4]) #選項窗口
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @command_window.dispose #釋放(關閉)選項窗口
  end
  def update
    @command_window.update #更新選項窗口
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::C)
      case @command_window.index #依照該變量的數值決定執行的內容
      when 0
        p "選項1的內容"
      when 1
        p "選項2的內容"
      when 2
        p "選項3的內容"
      when 3
        p "選項4的內容"
      end
    end
  end
end
用【$scene = Sword.new】執行上面的腳本後,會看到4個選項的窗口
你選擇1個選項按下空白鍵會出現小窗口告訴你這是哪個選項的內容
選項的設置方式我們可以分成3種(雖然可能濃縮成2種...)
第1:設定選項的文字(看完第2的部分就會發現這個步驟可有可無...)
第2:產生選項的窗口(實際產生選項的是這個部份...)
第3:設定選項的執行內容
 
(1)設定選項的文字
在腳本第3行發現:
s1 = "選項1"
s2 = "選項2"
s3 = "選項3"
s4 = "選項4"
可以看得出來,這裡是設定選項的文字
但其實這樣設置只是方便找尋(或看起來漂亮?!)的設置方式而已
有點變量知識的因該看得出來,這只不過是將字串代入變量中而已
例如:【s2 = "選項2"】就是 變量s2 代入 "選項2" 這字串的意思
 
(2)產生選項的窗口
在腳本第7行發現:
@command_window = Window_Command.new(160, [s1, s2, s3, s4])
變量@command_window 代入 Window_Command 類
並傳送【160】和【[s1, s2, s3, s4]】這2個參數到 Window_Command 類中
之後要修改選項窗口、釋放選項窗口、更新選項窗口...之類的
就要用代入選項窗口的變量@command_window來進行修改
我這樣說可能有些人無法理解,不過基本上只要知道...
@command_window = Window_Command.new】是產生選項窗口
(160, [s1, s2, s3, s4])】就當做是在設定選項窗口就好了
腳本中【160】的數值為設定選項窗口的寬度,數值越高選項窗口越寬
而【[s1, s2, s3, s4]】就是設定要顯示的選項和順序
s1、s2...之類的在上面的設定選項的文字已經代入過字除串了
所以【[s1, s2, s3, s4]】可以想成【["選項1", "選項2", "選項3", "選項4"]
我在上面說過,這樣設置只是方便找尋(或是好看),實際設置選項文字和位置是這裡
以下的設置方式其實都沒有什麼差別!!
s1 = "選項1"
s4 = "選項4"
@command_window = Window_Command.new(160, [s1, "選項2", "選項3", s4])
s = []
s[0] = "選項1"
s[1] = "選項2"
s[2] = "選項3"
s[3] = "選項4"
@command_window = Window_Command.new(160, s)
 
(3)設定選項的執行內容
在腳本第27行發現:
if Input.trigger?(Input::C)
  case @command_window.index
  when 0
    p "選項1的內容"
  when 1
    p "選項2的內容"
  when 2
    p "選項3的內容"
  when 3
    p "選項4的內容"
  end
end
if Input.trigger?(Input::C)】為條件分歧:當確定鍵被按下時的場合,就不多說了
而【case @command_window.index】這個嚴格來說也是條件分歧...
意思為依照變量@command_window.index的數值來決定執行內容
也就是說當變量@command_window.index數值為3時
從0開始,0表示選項第1個,1表示選項第2個...依此類推
就會執行【when 3】下面的內容,執行到end或下一個when才結束
由此可以知道,【@command_window.index】為存入了選項目前的位置的變量!!
其實和下面的條件分歧設置方式沒什麼差別...
if @command_window.index == 0
  p "選項1的內容"
elsif @command_window.index == 1
  p "選項2的內容"
elsif @command_window.index == 2
  p "選項3的內容"
elsif @command_window.index == 3
  p "選項4的內容"
end
 

以上內容是基本的選項窗口設置方式,接下來來找個腳本實際修改看看吧~

 
標題畫面中不是有3個選項,分別是「新 的 遊 戲」、「讀 取 進 度」、「結 束 遊 戲」
假設我們打算在「讀 取 進 度」、「結 束 遊 戲」的中間增加「製 作 人 員」的選項
首先先設置好我的滾動字幕腳本(可點左邊的連接去設置,設置好後按上一頁回此文章)
我的滾動字幕呼叫方法為【$scene = Sword_Subtitles.new】,先做提醒而已
 
(1)設定選項的文字
打開腳本「Scene_Title」,第39行發現腳本【s3 = "結 束 遊 戲"
在下面插入腳本【s4 = "製 作 人 員"
 
(2)產生選項的窗口
看到下一行發現【@command_window = Window_Command.new(192, [s1, s2, s3])
把它改成【@command_window = Window_Command.new(192, [s1, s2, s4, s3])
(實際上選項的順序是在這裡做設定的,不要忘記了)
 
(3)設定選項的執行內容
第101行發現腳本【command_continue
在下方插入以下腳本:
when 2 # 製作人員
  $scene = Sword_Subtitles.new
# 呼叫滾動字幕畫面
然後看到第104行的發現【when 2  # 結束遊戲】改成【when 3  # 結束遊戲
 
這樣就大功告成了!!
 
 
其他設置方式
選項的高度
通常選項的高度會依照你的選項數目來自動調整,調整方式大約為:
選項窗口高度 = 選項數目 x 32 + 32
當然也可以用以下腳本直接指定選項窗口的高度:(需放在產生選項窗口的下面)
@command_window.height = 選項窗口高度
如果你指定的高度,不夠選項所需要的高度之時,就會被藏起來並出現箭頭
例如我們將選單畫面的選項高度改成高度改成128好了
則窗口大小只夠顯示「物品」、「技能」、「裝備」,並下面附加1個箭頭,如下圖:
下面出現箭頭表示下面還有選項的意思
相對的,上面出現箭頭表示上面還有選項的意思
當選項在「裝備」時
繼續往下就會改顯示成「技能」、「裝備」、「狀態」
並且選項窗口的上面出現箭頭
 
指定選項的位置
預設選項會在第1個選項中,如果希望選項在其他的選項的話
可以用以下腳本來直接指定:(需放在產生選項窗口的下面)
@command_window.index = 選項位置
設置的數值必須從0開始,所以0表示第1個選項,1表示第2個選項,依此類推
如果拿選單窗口測試該腳本時,如果選項位置設定4,則選項就會出現在「存檔」中
 
使某個選項無效
無效的選項文字將會變成灰色的,表示這個選項是無效的
只是表示而已(也就是看起來的意思),實際上選擇還是有效果
可以用以下腳本來變更選項為無效的顏色:(需放在產生選項窗口的下面)
@command_window.disable_item(選項位置)
設置的數值必須從0開始,所以0表示第1個選項,1表示第2個選項,依此類推
如果拿選單窗口測試該腳本時,如果選項位置設定2,則選項「裝備」會變成灰色字
如果要真的使該選項無效的話,請參考上面的設定選項的執行內容的設置方式
簡單來說就是選項的執行內容增加個條件分歧
分成選項沒被無效時的執行內容 和 選項無效時的執行內容(事件[顯示選擇項]設置類似)

以上介紹的都是呼叫「Window_Command」類的選項窗口,接著來說自製方式

一樣,我先隨便寫一個簡單的範例(建議可以先按此觀看基本的窗口設置方式)
class Window_Sword < Window_Base
  attr_accessor :index
  def initialize
    super(0, 0, 160, 160)
    self.contents = Bitmap.new(width - 32, height - 32)
    @index = 0
    refresh
  end
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    self.contents.draw_text(0, 0, 160, 32, '選項1', 0)
    self.contents.draw_text(0, 32, 160, 32, '選項2', 0)
    self.contents.draw_text(0, 64, 160, 32, '選項3', 0)
    self.contents.draw_text(0, 96, 160, 32, '選項4', 0)
    update_cursor_rect
  end
  def update_cursor_rect
    self.cursor_rect.set(0, 32 * @index, 57, 32)
  end
end
class Scene_Sword
  def main
    @sword_window = Window_Sword.new
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @sword_window.dispose
  end
  def update
    @sword_window.update
    if Input.trigger?(Input::UP)
      if @sword_window.index == 0
        @sword_window.index = 3
      else
        @sword_window.index -= 1
      end
      @sword_window.update_cursor_rect
    end
    if Input.trigger?(Input::DOWN)
      if @sword_window.index == 3
        @sword_window.index = 0
      else
        @sword_window.index += 1
      end
      @sword_window.update_cursor_rect
    end
    if Input.trigger?(Input::C)
      case @sword_window.index
      when 0
        p '你選擇了選項1'
      when 1
        p '你選擇了選項2'
      when 2
        p '你選擇了選項3'
      when 3
        p '你選擇了選項4'
      end
    end
  end
end

以上腳本插入在「Main」腳本以上時即可使用
呼叫方法【$scene = Scene_Sword.new
執行後會發現左上方有1個窗口,顯示4個選項和1個游標
可以用方向鍵上或下來移動游標,按下確定鍵後就會跑出小窗口告訴你按下第幾個選項
原理很簡單,實際上選項只是窗口的內容而已
只不過是窗口內容上多了1個游標而但可以控制和選擇而已
 
窗口(Window_Sword)
第2行 attr_accessor :index
快速定義2個名為index方法,在不同的類中的變量通常時無法共用的
除非用方法來返回到呼叫的類中,這樣說很像太深奧了(其實是我不太會解釋...)
基本上只要先知道,用這個腳本主要是讓外部類能順利獲取這個窗口的變量之用即可
如果想深入了解這個東西,可以參考定義實例變數文章
 
第6行 @index = 0
定義名為index的實例變量代入數值0,這個變量主要代表的是選項目前的位置之用
依照此範例來說,如果這個變量數值是0就表示第1個選項,數值是1就表示第2個選項
由於先在這裡代入0,所以選項一開始會出現在第1個選項
你改成【@index = 3】,就表示選項一開始會出現在第4個選項,依此類推
但順序還是依照設計者而定啦,也不一定要用0代表第1個選項就是了...
但是更新游標位置的話,以0代表第1個選項會比較方便一些
 
第16行 update_cursor_rect
當設定好你要的選項之後,呼叫這個方法來顯示游標
簡單來說就是讓窗口一開始就顯示游標啦
 
第18~20行 def update_cursor_rect
定義update_cursor_rect方法,這個方法的執行內容為更新游標的顯示的位置用的
定義這個方法的用意是...當移動游標時,只要呼叫這方法來更新游標的位置就好
 
第19行 self.cursor_rect.set(0, 32 * @index, 57, 32)
實際顯示游標是這個腳本,參數由左到右分別為(X座標, Y座標, 寬度, 高度)
寬度和高度就是游標的大小,配合文字的寬度和高度來做設定(讓游標能框住選項內容!!)
接著是重點了,移動游標的原理實際上是在改變游標顯示的座標!!
要設計左右移動的游標要靠X座標,上下移動的游標要靠Y座標(或2個一起用!!)
我的範例寫法是上下選項,所以X座標我固定為0用不到
而Y座標我寫成 32 * @index,公式為:文字一行的高度 x 選項位置
從這裡就可以看出為什麼建議以0這個數值做為第1個選項之用
要讓游標顯示在第1個選項,則Y座標為需要0才可,所以...
@index如果是0的話(表示目前選項位置為第1個),則32 x 0 = 0,所以游標會指著第1個選項
@index如果是1的話(第2個選項),則32 x 1 = 32,所以選項所下放置32像素(游標移下行)
這時游標會指著第2個選項!!(感覺上我說了好多廢話XD
附註:如果想要隱藏游標的話,就隨便設個位置把它丟到窗口外面就好了... 
 
畫面(Scene_Sword)
畫面主要的相關腳本就不多做介紹了,自己去看這篇= =(我真懶)
第38行 @sword_window.update
由於會用到,所以特別介紹一下,這個腳本是更新選項游標用的
你看到游標一閃一閃的亮著就是因為這腳本不斷在更新游標...
但對於沒設游標的窗口來說...這個腳本沒啥用處...
 
第39~46行 if Input.trigger?(Input::UP)
條件分歧:當按鍵上被按下時執行的場合,由此可知這裡開始設置游標往上的設定
 
第40~44行 if @sword_window.index == 0
這裡就看到第2行的【attr_accessor :index】的效果了,attr_accessor為定義可寫可讀方法
由於不是代入數值進去,而是用==進行比較,所以這是個讀取的動作
如果沒定義讀取的方法的話可能會發生錯誤NoMethodError(呼叫了沒有定義的方法)
說太多無關的話了,回來回來!!,我們用這方法獲取到窗口類中的@index變量的數值
所以意思就是條件分歧:當選項位置(@index) 等於 0(第1個選項)的場合時
為何要判定是否選項在第1個選項呢?這個條件分歧在第39~49行的條件分歧內!!
第39~49行為上鍵按下的場合,由此可以發現,如果目前選項在在第1個
那在按上不是就會....游標繼續往上而跑出窗口...!!所以這腳本就是防止這種事的發生
 
第41行 @sword_window.index = 3
這是代入3到這個變量(窗口類)中index方法,所以必須要用定義實例變數定義寫入方法...
這個剛剛就說過了,省略,這個是當在第1個選項時按下上鍵時執行的內容...
把選項位置代入3(第4個選項),由此可知...
在第1個選項繼續往上移動游標,則選項會跑到最下面的選項!!
當然如果想要的效果是...在第1個選項往上移會無效,這個腳本就註釋掉吧XD
(這個選項窗口範例只有4個選項,所以才代入3...)
 
第43行 @sword_window.index -= 1
這個在按下上鍵時,並目前的選項不是在第1個時執行,這因該沒什麼好說的才是
就是減少1格選項位置而已,達到游標位置往上移動的效果
 
第45行 @sword_window.update_cursor_rect
這時...窗口的@index變量已經被修改(也就是已經在選擇另一個選項了)
但如果不加這行腳本,這時你會發現...游標還是呆呆的顯示在同樣的位置...
所以必須要呼叫窗口類中的update_cursor_rect方法來更新游標的目前位置
 
第47~54行 if Input.trigger?(Input::DOWN)
這個是條件分歧:下鍵被按下的場合,看的出來...剛剛才設計好游標向上移動的方式
而這個就是在設計游標往下移動的方式,基本上和游標向上移動的原理一樣
就不詳細解說了這個條件分歧裡面的東西了...
 
第55~66行 if Input.trigger?(Input::C)
條件分歧:當按下確定鍵(鍵盤C、空白、Enter鍵)時,有此可看出是選擇了選項了!!
 
第56~65行 case @sword_window.index
到這裡,感覺就和用「Window_Command」類產生出來的窗口很像了!!
條件分歧:依照@sword_window.index返回的數值決定執行的內容
所以when 0是當@sword_window.index值為0時執行(第1個選項的執行內容)
這個效果上面就講過了,就這樣了

 

相簿設定
標籤設定
相簿狀態