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

  • 305763

    累積人氣

  • 6

    今日人氣

    0

    追蹤人氣

【API】全鍵盤按鍵

   
    
安裝方法
打開腳本編輯器,對腳本「Main」按下右鍵,選擇插入,會在上面出現1個空白腳本
在空白腳本內貼上以下腳本:

點選框框內的腳本按右鍵打開選單,選擇 [全選] 後在選擇 [複製] ,在指定的位置中貼上腳本即可
 

 
設置腳本 
更新按鍵[R]   
Input.update
更新按鍵的訊息,原則上必須每幀調用1次,此外RGSS本身就就已經定義好的方法之一
因為裝了此腳本後,需要仰賴這個腳本才能正常工作,所以在這邊做一些追加的介紹
首先安裝本文章腳本之後,原則上它的效果並不變,只是追加讓它適用全鍵盤的按鍵而以
但實際上更新全鍵盤的方式和預設RGSS的方式理論上來說是不同的,會有以下差異
RGSS預設按鍵判斷
# 按住 空白鍵 不放(小視窗可以用滑鼠按掉,以下不再提醒)
p Input.trigger?(Input::C) #=> false
Input.update
p Input.trigger?(Input::C)
#=> false

# 按住 空白鍵 不放
Input.update
p Input.trigger?(Input::C)
#=> true
Input.update
p Input.trigger?(Input::C)
#=> false
全鍵盤按鍵判斷
# 按住 空白鍵 不放
p Input.trigger?(:Space) #=> true
Input.update
p Input.trigger?(:Space)
#=> false
實際上本全鍵盤腳本只會嘗試判斷 你指定要判斷的按鍵,沒指定的通常都是忽略不判斷
從這點可以知道本全鍵盤實際判斷按鍵的地方並不再更新按鍵腳本,而是在判斷按鍵方法的本身
所以會造成以上的差異性,不過其他方面理論上都是差不多的
必須更新按鍵,系統才會重新獲取按鍵的資訊,所以依然還是要定期更新按鍵才能正常使用
<2次更新以下:不受『Input.update』影響,每個判斷按鍵函數都是即時判斷的>
  
判斷按鍵是否被按下[R]
# 指定按鍵判斷
Input.trigger?()
# 指定按鍵判斷
Input.trigger?(, 詳細標誌)

# 全數按鍵判斷
Input.trigger?

範例
# 按住鍵盤 A 鍵不放(跑出來的小窗口用滑鼠按掉即可)
p Input.trigger?(:A) #=> true
Input.update
p Input.trigger?(:A) #=> false
Input.update
p Input.trigger?(:A) #=> false
返回按鍵是否有被按下,判斷按下的依據為從 未按下 到 按下 的那一瞬間代表 按下
本腳本為預設的腳本,不過安裝本文章腳本後會對預設的按下按鍵判斷做一些強化
使預設的按鍵能支援全鍵盤的判斷,主要依照鍵來做依據是判斷哪個按鍵
鍵:可以設定RM按鍵常數(或負數值)、符號對象(或整數值)、數組、nil
  指定不同的按鍵類型都會有不一樣的執行效果,詳細請參考以下的 鍵說明   
  <2.0版本以下:只能指定本腳本定義的常數 或 直接指定腳本寫的按鍵數值> 
詳細標誌:可設定為true、false、nil這3種,如果沒有指定這個引數的話預設是採用nil
     這只有再 鍵 指定為數組對象或者true的時候,這個設定才會生效
     true:返回此判斷認為按下的鍵值數組,會依照你提供的鍵類型返回對應的單元值類型
     false:返回數組對應位置中每個按鍵判斷結果的數組,單元值正常情況是一樣的
     nil:只要其中1個按鍵有按下就返回true;全部都沒有按下就返回false
     關於這個設定,會在鍵說明中也會有一些範例說明 
  
判斷按鍵是否被按住
[R]  
# 指定按鍵判斷
Input.press?()

# 指定按鍵判斷
Input.press?(, 詳細標誌)

# 全數按鍵判斷
Input.press?

範例
# 按住鍵盤 A 鍵不放(跑出來的小窗口用滑鼠按掉即可)
p Input.press?(:A) #=> true
Input.update
p Input.press?(:A) #=> true
Input.update
p Input.press?(:A) #=> true
返回按鍵是否有被按住,判斷為按住的依據為只要按鍵處理按下狀態代表按住
本腳本為預設的腳本,不過安裝本文章腳本後會對預設的按下按鍵判斷做一些強化
使預設的按鍵能支援全鍵盤的判斷,主要依照鍵來做依據是判斷哪個按鍵
  
判斷按鍵是否持續性被按下[R]  
# 指定按鍵判斷
Input.repeat?()

# 指定按鍵判斷
Input.repeat?(, 詳細標誌)

# 全數按鍵判斷
Input.repeat?

範例
# 按住鍵盤 A 鍵不放
a = []
30.times{Input.update
a << Input.repeat?(:A)} # 循環執行個30次,並將結果依序存入數組中
p a
__END__
a #=>
[true, false, false, false, false, false, false, false, false, false, 
false, false, false, false, false, true, false, false, false, true, false,
false, false, true, false, false, false, true, false, false]
返回按鍵是否有被持續按下,想當初我並沒有讓這個按鍵判斷支援全鍵盤...
因為我實在是不曉得它的判斷依據,只知道它主要用於游標的移動上面
剛按的時候速度似乎略慢,不過感覺上和按住的效果又差不多,但感覺有慢一點點
直到現在我更新這腳本時,我得到了一個結論,這個按鍵的判斷感覺上...
就是有規則性的延遲性判斷,讓寫游標的效果一行腳本搞定之類的,不用在腳本編輯器寫一個...
效果主要為按下的瞬間判定為按下1次,之後按住按鍵期間的14個判定都視同沒按下
在判斷按下1次,接著在3次判斷沒按下,在判斷按下1次,在判斷3次沒按下...就這樣重複...
直到放開按鍵為止,如果再次按下,一樣要先判斷那個14次無效再來之後就3次無效循環...
這樣就符合按住方向鍵時(如 ↓ 鍵),游標會先往下1格一點點時間在持續往下移動...
本腳本為預設的腳本,不過安裝本文章腳本後會對預設的按下按鍵判斷做一些強化
使預設的按鍵能支援全鍵盤的判斷,主要依照鍵來做依據是判斷哪個按鍵
 
變更持續按下的判斷方式[R] NEW
# 變更持續按下的規則
Input.repeat_value(起始數, 持續數)
# 還原預設值
Input.repeat_value
範例
 
# 按住鍵盤 A 鍵不放
a = []
Input.repeat_value(10, 2)
30.times{Input.update
a << Input.repeat?(:A)}
# 循環執行個30次,並將結果依序存入數組中
p a
__END__
a #=>
[true, false, false, false, false, false, false, false, false, false,
false, true, false, false, true, false, false, true, false, false,
true, false, false, true, false, false, true, false, false, true]
上面說過『Input.repeat?』返回其結果的方式,而是方法可以變更這個方法
此方法用於變更『Input.repeat?』一開始判定為false的次數
以及接下連持續判斷false的次數之用,簡單來說就是...
假設按住指定的按鍵不放的時候,『Input.repeat?』一開始會判讀為true
接下來讀取 起始數 次的結果都是false,接著讀取就是返回true
接下來讀取 持續數 次的結果都是false,接著讀取就是返回true
接下來讀取 持續數 次的結果都是false,接著讀取就是返回true
接下來讀取 持續數 次的結果都是false,接著讀取就是返回true
...以下都是採用 持續數,只有當按鍵判讀沒按下時
才會回到 起始數 開始做判斷,看以上提供的範例,算算false的數量因該不難理解
這個方法只對全鍵盤有效,當指定RM按鍵常數時,依然照個原本的數量來判斷
起始數持續數 均可以省略,將會恢復預設的設定
也就是等同於『Input.repeat_value(14, 3)』
     
判斷按鍵是否被放開[R]  
# 指定按鍵判斷
Input.release?()

# 指定按鍵判斷
Input.release?(, 詳細標誌)

# 全數按鍵判斷
Input.release?

範例
# 先等一段時間,然後按住鍵盤 A 鍵不放開一段時間,然後放開看看
loop do
  Graphics.update
  Input.update
  p true if Input.release?(:A
) #=> true (放開A鍵時出現)
end  
返回按鍵是否被放開,判斷為按鍵從按住狀態中變為放開按鍵的瞬間為放開按鍵
和按下按鍵的腳本類似,如果你是按下的瞬間馬上又放開的話,則看起來和按下差不多...
主要為按下負責判斷一開始的部分,而放開則負責判斷結尾的部分
鍵:同以上介紹,不過本腳本的鍵不支援預設的RM按鍵常數,因為RM預設中並沒有這個方法  
   
開關式按鍵[R]  
# 指定按鍵判斷
Input.switche?()

# 指定按鍵判斷
Input.switche?(, 詳細標誌)

# 全數按鍵判斷
Input.switche?

範例
# 你可以先按鍵盤A鍵檢視幾次看看是否為0,然後按1下鍵盤S,再按A幾次看看數值是否增加了
# 如果再按1次S鍵,然後再按幾次A鍵,是否數值停止增加了了呢?

a = 0
loop do
  Graphics.update
  Input.update
  a += 1 if Input.switche?(:S)
  p a if Input.trigger?(:A
) # 檢視變數a的數值 
end
簡單來說可以把這腳本當成是1種開關,按一次為打開,在按1次則關閉
當你按了一下指定的按鍵時,這個腳本之後將返回true表示(不管你有無按下這個按鍵...)
直到你再次按下(和按下按鍵的規則一樣)後,這個腳本又會變為只返回false的狀態
鍵:同以上介紹,不過本腳本的鍵不支援預設的RM按鍵常數,因為RM預設中並沒有這個方法
  
讀取以及變更開關按鍵的資料[R] 
# 讀取
Input.switche()
# 變更
Input.switche(, 變更值)
純粹讀取『Input.switche?』的開關資料
這個方法不會判斷按鍵,所以不會受到『Input.update』而影響
指定 變更值 時,則『Input.switche?』的讀取一律變更為 變更值 相同
  
模擬按鍵按下[R] 
# 指定按鍵瞬間按下
Input.simulate()

# 指定按鍵持續按下
Input.simulate(, 按下類型標誌)
# 全數按鍵按下
Input.simulate
範例
# 什麼按鍵也不按來測試
Input.simulate(:A)
p Input.press?(:A)
#=> true
Input.update
p Input.press?(:A)
#=> false

# 什麼按鍵也不按來測試
p Input.press?(:A)
#=> false
Input.simulate(:A)
p Input.press?(:A)
#=> false
# 再未執行『Input.update』前,一律返回第1次判定結果

# 什麼按鍵也不按來測試
Input.simulate(:A, true)
p Input.press?(:A)
#=> true
Input.update
p Input.press?(:A)
#=> true
Input.update
p Input.press?(:A)
#=> true

# 什麼按鍵也不按來測試
Input.simulate(:A, true)
p Input.press?(:A)
#=> true
Input.update
p Input.press?(:A)
#=> true
Input.update
Input.simulate(:A, false)
p Input.press?(:A)
#=> false
Input.update
p Input.press?(:A)
#=> false

# 什麼按鍵也不按來測試
Input.simulate(:A, true)
p Input.press?(:A)
#=> true
Input.update
p Input.press?(:A)
#=> true
Input.update
Input.simulate(:A)
p Input.press?(:A)
#=> true
Input.update
p Input.press?(:A)
#=> false
模擬本全鍵盤的針對某個按鍵的按下狀態,這個腳本會影響所有的按鍵判斷
所以使用的時候要注意一下,本模擬並非真的模擬,算是對返回值做了一些修改罷了
鍵:同上,只不過不可指定使用RM按鍵常數以及包含該對象單元的數組
按下類型標誌:可以指定nil、true、false這3種值,沒指定該引數則視同nil
       nil:按下1次,直到更新按鍵執行為止,此會中止按下狀態
       true:讓指定按鍵變為按下狀態,不管更新按鍵幾次都視同為按下
       false:此會中止按下狀態,和nil不同的地方在於,它不包含立即按下的效果
   
模擬真實按鍵按下[R] 
# 指定按鍵瞬間按下
Input.mimic()

# 指定按鍵持續按下
Input.mimic(, 按下類型標誌)

範例
# 自動一同按下鍵盤 左Alt 和 Enter 鍵
Input.mimic([:Alt_L, :Enter]) # 自動全螢幕 
模擬按下任一個鍵盤的按鍵,這個按鍵不只能被除了此腳本以外的以上設置腳本給判斷到
這個模擬是真實的模擬(魔劍工舖整合腳本則是假的模擬,只對RM按鍵函數返回值動手腳而以)
所以說這個按鍵可以模擬按下 Alt 鍵和 Enter 鍵來啟動RM自帶的全螢幕功能
鍵:同上,只不過此方法不可使用RM按鍵常數、true以及包含這2個對象單元的數組
按下類型標誌:可以指定nil、true、false這3種值,沒指定該引數則視同nil
       nil:按下並立即放開按鍵,原則上過程只有一瞬間,一般人類辦不到的速度XD
       true:讓指定按鍵變為按下狀態,不過要注意,在你下令放開之前它會一直按下
       false:讓已經被按下的按鍵放開
     

   
鍵說明   
鍵可以設定為符號常數、數組、RM按鍵常數、true,甚至可以不指定這個引數判斷全按鍵
RM按鍵常數、負數值  
總之先介紹RGSS1和RGSS2本身採用按鍵指定方式,也就是RM按鍵常數
RM按鍵常數的指定方式為引用Input是先定義好的常數,這些常數有以下被定義:
Input::DOWN Input::LEFT Input::RIGHT Input::UP Input::A
Input::B Input::C Input::X Input::Y Input::Z
Input::L Input::R Input::SHIFT Input::CTRL Input::ALT
Input::F5 Input::F6 Input::F7 Input::F8 Input::F9
以上的RM按鍵常數實際上也只是將指定用於識別用的數值儲存在常數中而以
例如嘗試讀取這些常數,會獲得有如事件 [等待按鍵輸入] 所獲得的結果數值
p Input::DOWN #=> 2
p Input::LEFT #=> 4
p Input::RIGHT #=> 6
p Input::UP #=> 8
p Input::A #=> 11
p Input::B #=> 12
p Input::C #=> 13

注意,裝了本文章腳本後會變更為負數
 
p Input::DOWN #=> -2
p Input::LEFT #=> -4
p Input::RIGHT #=> -6
p Input::UP #=> -8
p Input::A #=> -11
p Input::B #=> -12
p Input::C #=> -13
甚至可以拿這些數值直接取代掉RM按鍵常數,以下兩行腳本效果實際上是相同的
Input.trigger?(Input::C) # 確定鍵按下判斷
Input.trigger?(-13)
# 確定鍵按下判斷(如果沒裝此文章腳本要改成 13 )
使用RM的按鍵久了因該有一個心得,那就是RM按鍵常數的名稱和實際鍵盤按鍵可能不同
此外還能1次判斷多個按鍵
像是『Input::B』代表鍵盤X、Esc、Num0這3個鍵,但就是沒有鍵盤的B鍵
總之如果以上設置腳本的鍵指定RM按鍵常數(或常數實際數值)的話
則會採用預設的腳本來做判斷,用預設的按鍵判斷有個特性
那就是會受到遊戲窗口F1設定改按鍵
   
符號、正數值   
本全鍵盤腳本所採用的指定方式,這裡指的符號不是!#$%^&*....之類有的沒的符號
而是採用Ruby的Symbol對象(定義法為『:內容』,也就是左邊加冒號,內容如同變數命名類似)
原則上可以想像是一個識別用的字串就行了,要指定全鍵盤需使用符號對象來指定
例如要指定鍵盤Y鍵好了,則鍵就必須設定為『:Y』,例如:
Input.trigger?(:Y) # 判斷鍵盤 Y 鍵是否被按下
Input.trigger?(:K) # 判斷鍵盤 K 鍵是否被按下
Input.trigger?(:Shift_R) # 判斷鍵盤 右Shift 鍵是否被按下
Input.trigger?(:Space) # 判斷鍵盤空白鍵是否被按下
能判定的符號都在本文章腳本內容裡面可以找到,很好找的~~
此外要注意,按鍵的判斷全由本文章腳本負責,並且有和預設判斷不同之處
像是不受遊戲窗口F1設定的按鍵影響,這也意味著要玩家自訂按鍵需要另外寫個腳本...
此外也會發現符號旁邊有對應的整數,一樣也可以拿來使用
# 以下兩行腳本效果相同
Input.trigger?(:A)
Input.trigger?(65)
   
數組    
通常你要1次判斷多個按鍵時,可以指定數組來1次性指定多個按鍵
例如我們想要判斷鍵盤Enter、C、空白鍵這3個有如指定『Input::C』的按鍵...
我們可以用 [ ] 框起這3個鍵的符號對象,並且每個符號都用小逗號分開
不過也不一定全部都要用符號對象,用RM按鍵常數也是可行的,但判斷方式依然是分開的
[:Enter, :C, :Space]
# 以下三行腳本判斷的按鍵是一樣的,只不過系統判斷方式不同
Input.trigger?(Input::C) # RM預設判斷
Input.trigger?([:Enter, :C, :Space])
# 全鍵盤判斷
Input.trigger?(:Enter) or Input.trigger?(:C) or Input.trigger?(:Space) # 全鍵盤判斷

Input.trigger?([:W, Input::L]) # 有必要的話也是可以這樣組合
一般來說只要用數組指定多個按鍵之後,只要有其中任一個有按下,都會返回true
也就是說必須指定的所有按鍵沒有一個是有按下的情況下,才會返回false
除此之外,在鍵指定為數組的情況下,如果將設置腳本的 詳細標誌 有設定true或者false的話
則效果為以下這樣...
# 什麼都不按的話
p Input.trigger?([:A, :S, 68], true) #=> []
p Input.trigger?([:A, :S, 68], false) #=> [false, false, false]
p Input.trigger?([:A, :S, 68]) #=> false

# 如果按住鍵盤A和D不放的話
p Input.trigger?([:A, :S, 68], true)
#=> [:A, 68]
p Input.trigger?([:A, :S, 68], false) #=> [true, false, true]
p Input.trigger?([:A, :S, 68]) #=> true

# 按住鍵盤 空白鍵 不放 
Input.update
p Input.trigger?([Input::C], true)
#=> [-13]
# 由於無法直接獲取到該對象是從哪裡來的,所以只返回該對象,也就是Input::C的實際值
   
真值    
鍵指定真值true的話,則視同採用判斷全部鍵盤按鍵判斷
執行的效果等同於指定『Array.new(222){|i| i + 1}』
也就是指定『[1, 2, 3, 4, 5, 6 …省略… 219, 220, 221, 222]』的數組
原則上在沒使用鍵這個引數的話通常預設是採用true來判斷全數按鍵
# 以下兩行腳本效果相同
Input.trigger?(true)
Input.trigger?
使用這個鍵後,也可以指定 詳細標誌 返回結果
# 什麼都不按的話
p Input.trigger?(true, true) #=> []
# 如果按住鍵盤 Q 和 F 和 / 和 右Ctrl 不放的話
p Input.trigger?(true, true)
#=> [163, 191, 17, 81, 70]
以上明明只按了4個按鍵,卻跑出了5個按鍵?!,總之對照本文章腳本的符號定義看看
163為:Ctrl_R(右Ctrl)
191為:Slash(右斜線)
17為:Ctrl(Ctrl)
81為:Q(Q)
70為:F(F)
以上可以看到多了個17,也是判斷Ctrl,不過:Ctrl這個會一次性判斷兩邊的Ctrl
畢竟這些鍵值都是你的系統內設好的,所以才會有17這個鍵值的存在
也不只有這個按鍵有這個特性,請特別注意,查看本腳本介紹的所有符號,通常都有寫
當然詳細標誌也可以設定false,結果當然是返回數量高達222個單元值的數組(笑~)
    
    
預設按鍵改成全鍵盤
這個嘛...就把RM的按鍵常數換個新內容就行了,但解釋方式也會變化喔
像是你將RM按鍵常數的數值替換成符號,則實際用改的RM按鍵常數,會採用全鍵盤判斷喔
# 腳本「Main」上面新增空白腳本,貼上這框的腳本
module Input
  C = [:Space, :Z]
  B = :X
end

# 這是修改後的情況
Input.trigger?(Input::C# 視同 Input.trigger?([:Space, :Z])
Input.trigger?(Input::B)
# 視同 Input.trigger?(:X)
   
   
特別感謝  
狼 (聽說幻影學院的主機遭受攻擊什麼的?!,所以來源連接以後再補上(我沒忘記的話))
● 解答了這篇記事的問題,改使用比較好的修正方案(理論上...因該比我之前連續判斷2次按鍵好?!)
 
另外還參考了穿拖鞋的鱼-鱼的梦乡(百度空間)關於GetAsyncKeyState的文章
 
 
相簿設定
標籤設定
相簿狀態