Gosu中的鼠標(biāo)和鍵盤輸入

根據(jù)定義,游戲是互動(dòng)的。Gosu通過(guò)一個(gè)簡(jiǎn)單的界面直接進(jìn)行這種交互,用于檢測(cè)和響應(yīng)按鍵和鼠標(biāo)按鈕夏季飲食養(yǎng)生小常識(shí)。

處理程序中的輸入有兩種主要方法。首先是面向事件的方法。按下按鈕時(shí),您的程序會(huì)收到一個(gè)事件,您可以做出相應(yīng)的反應(yīng)。第二個(gè)是檢查在更新時(shí)是否按下了某個(gè)按鈕。這兩種技術(shù)都是完全有效的,使用最適合你的任何一種。

鍵和按鈕常數(shù)

在后臺(tái),按鈕由整數(shù)表示。這些整數(shù)代碼依賴于平臺(tái),可能不應(yīng)該'無(wú)法進(jìn)入游戲代碼。為了抽象這一點(diǎn),Gosu提供了許多常數(shù)來(lái)使用。

對(duì)于每個(gè)鍵盤鍵,都有一個(gè)Gosu::Kb*常量。對(duì)于大多數(shù)密鑰,這些常量的名稱很容易猜測(cè)。例如,箭頭鍵是Gosu::KbLeft,Gosu::KbRight,Gosu::KbUpGosu::KbDown。有關(guān)完整列表,請(qǐng)參閱Gosu模塊的文檔。

鼠標(biāo)按鈕也有類似的常數(shù)。您'll主要使用Gosu::MsLeftGosu::MsRight進(jìn)行左鍵和右鍵單擊。還通過(guò)Gosu::Gp*常數(shù)支持gamepads。

本文是系列文章的一部分。閱讀更多關(guān)于Ruby中快速游戲原型的文章

面向事件的輸入

輸入事件被傳送到Gosu::窗口實(shí)例。在主循環(huán)中,在調(diào)用update之前,Gosu將為已按下或釋放的所有按鈕傳送事件。它通過(guò)調(diào)用按鈕按鈕方法,通過(guò)按下鍵或按鈕的id來(lái)實(shí)現(xiàn)。

按鈕按鈕方法中,你經(jīng)常發(fā)現(xiàn)一個(gè)case語(yǔ)句。這除了非常有用外,還提供了一種非常優(yōu)雅和富有表現(xiàn)力的方式來(lái)決定根據(jù)按下或釋放哪個(gè)按鈕該做什么。以下是一個(gè)簡(jiǎn)短的例子,說(shuō)明按鈕方法可以是什么樣子。它應(yīng)該放置在您的Gosu::Windows子類中,并在按下escape鍵時(shí)關(guān)閉窗口(結(jié)束程序)。

def按鈕(id)案例編號(hào)當(dāng)Gosu::KbEscape關(guān)閉結(jié)束結(jié)束

簡(jiǎn)單,對(duì)?讓's擴(kuò)展它。這是玩家班。如果按下左右鍵,它可以左右移動(dòng)。請(qǐng)注意,這個(gè)類還有按鈕按鈕方法。它們的工作方式就像Gosu::窗口子類中的方法一樣。Gosu不知道'不知道關(guān)于玩家盡管如此,我們'將從Gosu::窗口手動(dòng)調(diào)用玩家's方法's方法。這里可以找到一個(gè)完整的,可運(yùn)行的示例。

班級(jí)玩家#以像素/秒為單位速度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)案例編號(hào)當(dāng)Gosu::KbLeft@方向-=1當(dāng)Gosu::KbRight@方向+=1結(jié)束結(jié)束def按鈕(id)案例編號(hào)當(dāng)Gosu::KbLeft@方向+=1當(dāng)Gosu::KbRight@方向-=1結(jié)束結(jié)束結(jié)束

本文是系列文章的一部分。閱讀更多關(guān)于Ruby中快速游戲原型的文章

查詢輸入

如果基于事件的輸入不是你的風(fēng)格,y您可以查詢?nèi)魏?b>Gosu::窗口,隨時(shí)查看是否按下了任何按鈕或鍵。您可以完全忽略按鈕按鈕回訪。

要查詢Gosu::窗口以查看是否按下了鍵,請(qǐng)致電按鈕?帶有按鈕id的方法,您要檢查'd。不要'不要忘記這個(gè)電話中的問(wèn)號(hào)!如果您致電按鈕down(Gosu::KbLeft),則'將報(bào)告按鈕按下Gosu::窗口子類。即使您沒有't定義任何回調(diào)方法,父類Gosu::窗口也會(huì)。沒有錯(cuò)誤,它只會(huì)像你預(yù)期的那樣工作。只需don'不要忘記這個(gè)問(wèn)號(hào)!

這里是玩家類重新編寫為使用按鈕?而不是事件。這里有一個(gè)完整的,可運(yùn)行的示例。此時(shí),在update方法開始時(shí)檢查輸入。你'也會(huì)注意到這個(gè)例子較短,但在我看來(lái),不那么優(yōu)雅。

班級(jí)玩家讀者: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?下來(lái)?(Gosu::KbLeft)@方向-=1結(jié)束如果@Windows.button?下來(lái)?(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)移動(dòng),沒有鼠標(biāo)移動(dòng)事件。Gosu::窗口's鼠標(biāo)x鼠標(biāo)y方法提供鼠標(biāo)指針的x和y坐標(biāo)。

請(qǐng)注意,X和Y坐標(biāo)是相對(duì)于游戲窗口的。因此,例如,如果鼠標(biāo)位于左上角,它將靠近坐標(biāo)(0,0)。此外,如果鼠標(biāo)指針完全在游戲窗口的之外,它仍然會(huì)報(bào)告指針相對(duì)于窗口的位置。因此,鼠標(biāo)?x鼠標(biāo)?y都可以小于零并且大于窗口的寬度或高度。

以下程序?qū)⒃趩螕羰髽?biāo)的任何位置顯示新的sprite。請(qǐng)注意,它使用事件驅(qū)動(dòng)輸入(用于單擊)和查詢驅(qū)動(dòng)輸入(以獲取鼠標(biāo)的位置)。這里有一個(gè)完整的可運(yùn)行文件。

類MyWindow