Gosu中的鼠標(biāo)和鍵盤輸入
根據(jù)定義,游戲是互動的。Gosu通過一個簡單的界面直接進行這種交互,用于檢測和響應(yīng)按鍵和鼠標(biāo)按鈕夏季飲食養(yǎng)生小常識。
處理程序中的輸入有兩種主要方法。首先是面向事件的方法。按下按鈕時,您的程序會收到一個事件,您可以做出相應(yīng)的反應(yīng)。第二個是檢查在更新時是否按下了某個按鈕。這兩種技術(shù)都是完全有效的,使用最適合你的任何一種。
鍵和按鈕常數(shù)
在后臺,按鈕由整數(shù)表示。這些整數(shù)代碼依賴于平臺,可能不應(yīng)該'無法進入游戲代碼。為了抽象這一點,Gosu提供了許多常數(shù)來使用。
對于每個鍵盤鍵,都有一個Gosu::Kb*常量。對于大多數(shù)密鑰,這些常量的名稱很容易猜測。例如,箭頭鍵是Gosu::KbLeft,Gosu::KbRight,Gosu::KbUp和Gosu::KbDown。有關(guān)完整列表,請參閱Gosu模塊的文檔。
鼠標(biāo)按鈕也有類似的常數(shù)。您'll主要使用Gosu::MsLeft和Gosu::MsRight進行左鍵和右鍵單擊。還通過Gosu::Gp*常數(shù)支持gamepads。
本文是系列文章的一部分。閱讀更多關(guān)于Ruby中快速游戲原型的文章
面向事件的輸入
輸入事件被傳送到Gosu::窗口實例。在主循環(huán)中,在調(diào)用update之前,Gosu將為已按下或釋放的所有按鈕傳送事件。它通過調(diào)用按鈕和按鈕方法,通過按下鍵或按鈕的id來實現(xiàn)。
在按鈕和按鈕方法中,你經(jīng)常發(fā)現(xiàn)一個case語句。這除了非常有用外,還提供了一種非常優(yōu)雅和富有表現(xiàn)力的方式來決定根據(jù)按下或釋放哪個按鈕該做什么。以下是一個簡短的例子,說明按鈕方法可以是什么樣子。它應(yīng)該放置在您的Gosu::Windows子類中,并在按下escape鍵時關(guān)閉窗口(結(jié)束程序)。
def按鈕(id)案例編號當(dāng)Gosu::KbEscape關(guān)閉結(jié)束結(jié)束
簡單,對?讓's擴展它。這是玩家班。如果按下左右鍵,它可以左右移動。請注意,這個類還有按鈕和按鈕方法。它們的工作方式就像Gosu::窗口子類中的方法一樣。Gosu不知道'不知道關(guān)于玩家盡管如此,我們'將從Gosu::窗口手動調(diào)用玩家's方法's方法。這里可以找到一個完整的,可運行的示例。
班級玩家#以像素/秒為單位速度200def自加載(窗口)與U數(shù)據(jù)(39);player.png')做| f|@@圖片=Gosu::圖片(窗口,f,假)結(jié)束結(jié)束def初始化(窗口)@窗口=窗口@x=(@窗口寬度/2)-(@@圖片寬度/2)@y=@窗口高度- @@圖片高度@方向=0結(jié)束def update(增量)@x+=@方向*速度*增量@如果@x,x=0@窗口寬度- @@圖片寬度@x=@窗口寬度- @@圖片寬度結(jié)束結(jié)束def繪制@@圖片(@x,@y,Z::玩家)結(jié)束def按鈕(id)案例編號當(dāng)Gosu::KbLeft@方向-=1當(dāng)Gosu::KbRight@方向+=1結(jié)束結(jié)束def按鈕(id)案例編號當(dāng)Gosu::KbLeft@方向+=1當(dāng)Gosu::KbRight@方向-=1結(jié)束結(jié)束結(jié)束
本文是系列文章的一部分。閱讀更多關(guān)于Ruby中快速游戲原型的文章
查詢輸入
如果基于事件的輸入不是你的風(fēng)格,y您可以查詢?nèi)魏?b>Gosu::窗口,隨時查看是否按下了任何按鈕或鍵。您可以完全忽略按鈕和按鈕回訪。
要查詢Gosu::窗口以查看是否按下了鍵,請致電按鈕?帶有按鈕id的方法,您要檢查'd。不要'不要忘記這個電話中的問號!如果您致電按鈕down(Gosu::KbLeft),則'將報告按鈕按下Gosu::窗口子類。即使您沒有't定義任何回調(diào)方法,父類Gosu::窗口也會。沒有錯誤,它只會像你預(yù)期的那樣工作。只需don'不要忘記這個問號!
這里是玩家類重新編寫為使用按鈕?而不是事件。這里有一個完整的,可運行的示例。此時,在update方法開始時檢查輸入。你'也會注意到這個例子較短,但在我看來,不那么優(yōu)雅。
班級玩家讀者:x,:y#以像素/秒為單位速度200def自加載(窗口)與U數(shù)據(jù)(39);player.png')做| f|@@圖片=Gosu::圖片(窗口,f,假)結(jié)束結(jié)束def初始化(窗口)@窗口=窗口@x=(@窗口寬度/2)-(@@圖片寬度/2)@y=@窗口高度- @@圖片高度@方向=0結(jié)束def update(增量)@方向=0如果@Windows.button?下來?(Gosu::KbLeft)@方向-=1結(jié)束如果@Windows.button?下來?(Gosu::KbRight)@方向+=1結(jié)束@x+=@方向*速度*增量@如果@x,x=0@窗口寬度- @@圖片寬度@x=@窗口寬度- @@圖片寬度結(jié)束結(jié)束def繪制@@圖片(@x,@y,Z::玩家)結(jié)束結(jié)束
本文是系列文章的一部分。閱讀更多關(guān)于Ruby中快速游戲原型的文章
鼠標(biāo)輸入
鼠標(biāo)bUTT的處理方式與鍵盤和游戲墊按鈕相同。你都可以用按鈕查詢它們嗎?和按鈕和按鈕的事件。但是,只能查詢鼠標(biāo)移動,沒有鼠標(biāo)移動事件。Gosu::窗口's鼠標(biāo)x和鼠標(biāo)y方法提供鼠標(biāo)指針的x和y坐標(biāo)。
請注意,X和Y坐標(biāo)是相對于游戲窗口的。因此,例如,如果鼠標(biāo)位于左上角,它將靠近坐標(biāo)(0,0)。此外,如果鼠標(biāo)指針完全在游戲窗口的之外,它仍然會報告指針相對于窗口的位置。因此,鼠標(biāo)?x和鼠標(biāo)?y都可以小于零并且大于窗口的寬度或高度。
以下程序?qū)⒃趩螕羰髽?biāo)的任何位置顯示新的sprite。請注意,它使用事件驅(qū)動輸入(用于單擊)和查詢驅(qū)動輸入(以獲取鼠標(biāo)的位置)。這里有一個完整的可運行文件。
類MyWindow