2013-05-11 26 views
1

我正在使用Phratch(Smalltalk中的Scratch 2.0),並修改了InputEventSensor >> processEvent方法來存儲按下的最後一個鍵,類似於修改鍵的存儲方式,讓他們if <key> pressed塊工作。將對現有內核方法的修改保存到Monticello

所以我現在有一個定製的InputEventSensor類:

  • 新的實例變量keyPressed
  • 改進方法processEvent
  • 新方法keyPressedclearKeystate

的新方法是在一個類別*Phratch這很好,所以這些得到保存到Phratch Monticello包。但是processEvent應該移到*Phratch類別嗎?那個實例變量呢?

+0

順便說一句,我花了相當多的時間試圖不改變InputEventSensor類,但無法讓事件處理正常工作。我查看了原始的Scratch + Squeak源代碼,可以看到他們已經按照這些方法做了一些事情,所以我複製了他們的方法。 – 2013-05-11 08:55:37

回答

4

有幾件事情正在進行:)。

首先,將一個現有的方法移動到您的項目包中就是我們所說的重寫。也就是說,當您將包加載到映像中時,現有的方法定義將被您的定義覆蓋。我不會建議,只有在非常必要的時候才進行覆蓋。實際上,最好的方法應該是創建鉤子,將它們集成到Pharo的代碼庫中,然後在給定的鉤子中插入項目。

關於用實例變量擴展類,我不認爲蒙蒂塞洛真的處理了這個問題。一種可能的解決方案是在metacello配置中添加預加載操作,將實例變量添加到給定的類。這樣,inst var安裝在方法之前。

第三也是最後一個,確定某個鍵是否仍然按下的實際好方法是偵聽KeyDown和KeyUp事件。 KeyUp事件發佈時會釋放一個密鑰。但是,keyDown和keyUp事件現在在Pharo上無法正常工作(在所有平臺中,識別鍵的鍵碼都會生成操作系統特定的值,並且還有一些鍵處理得不好)。但是,我相信在即將到來的3.0版本的Pharo中這會變得更好。

當然,如果你想讓這點更好的話,你可以貢獻:)。

+0

感謝guillepolito的建議,我仍然在學習Smalltalk,並感謝聽到正確的做事方式。所以我要研究一個更好的方法來在Phratch中做到這一點。 – 2013-05-12 20:24:44