私は現在gloss
'を使用してゲームを書いていplay
ます。このゲームの基本的な構造は非常に単純です。ユニットが配置されたボードがあり、そのうちの 1 つがフォーカスされています。
を使用してボード上のユニットを循環することにより、フォーカスを変更する機能を追加しましたKeyTab
。すぐに、サイクルバックもできるようにしたいことに気付いたShift + KeyTab
ので、この状況では慣例としてそうすることにしました。
gloss
が付属しており、そのうちEvent
のModifiers
1つですshift
。完全?まあ...そうではありません: を押すたびにShift + KeyTab
、イベントはウィンドウで受信されません(受信したすべてDebug.Trace
のtrace
を印刷するために を使用しましたEvent
)。
CAPS LOCK をKeyTab
使用すると、shift
修飾子が とマークされた状態で受け取りDown
ます。Ctrl + KeyTab
ショートカットとして使用するように切り替えると、完全に機能します。問題を再現する最小限の例を次に示します。
module Main where
import Graphics.Gloss
import Graphics.Gloss.Interface.Pure.Game
data Board = Board Color Color Color
forward :: Board -> Board
forward (Board x y z) = Board y z x
backward :: Board -> Board
backward (Board x y z) = Board z x y
displayPoint :: Point -> Color -> Picture
displayPoint (x, y) c = translate x y $ color c $ circle 10
displayBoard :: Board -> Picture
displayBoard (Board x y z) =
Pictures $ zipWith displayPoint coordinates [x, y, z]
where coordinates = [(0, 30), (-30, -30), (30, -30)]
react :: Event -> Board -> Board
react (EventKey (SpecialKey KeyTab) Down mods _) b =
case shift mods of
Up -> forward b
Down -> backward b
react _ b = b
main :: IO ()
main =
let window = InWindow "Buggy" (100, 100) (200, 200)
board = Board blue red yellow
in play window black 24 board displayBoard react (const id)