Breakout(2) ロータリーエンコーダとマウス

PyGameで作ってみたブロック崩し、ロータリーエンコーダのプログラムと組み合わせて、パドルコントローラ風に遊べるバージョンも作ってみた。

動くには動いたのだが、どうもあまり動きが滑らかではない。やはりPythonだけでロータリーエンコーダの検出をやらせるのは無理があるのだろうか?GPIOまわりのアクセスをC言語で直接叩くようにすればもっと高速に取り込むことができて、滑らかに動かせると思うのだが、そこまで突っ込んでやってしまうと遊びの範疇からずれてしまう気がするので、今のところはここまでにしておく。

その代わりに、マウス入力で遊べるバージョンも作成。こっちはレスポンスも良く、ゲームとしてかなり遊べる状態になった。

ソースコードは長くなるので、ロータリーエンコーダ版とマウス版の両方をまとめてGoogle Driveに置いた。ここからダウンロードできる。Breakout_m.pyがマウス版。

マウスを入力デバイスとした場合、デフォルトではマウスポインタがウィンドウを外れるとパドルが動かなくなってしまうため、それではゲームにならない。PyGameはマウスポインタ(マウスカーソル)が非表示で、なおかつ pygame.event.set_grab がTrueに設定されている時は、常にマウスイベントが送られてくるようになっている。

その代わり他のプログラムにマウスやキーボードイベントが送られなくなってしまうので、注意が必要だ。プログラムを終了するためにウィンドウの[閉じる]をクリックする事もできなくなるので、QUITイベントで終了する代わりにエスケープキーによって終了するように変更した。

    pygame.mouse.set_visible(False)
    pygame.event.set_grab(True)
    mx, my = pygame.mouse.get_rel()
    while True:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN and event.key == K_ESCAPE:
                pygame.mixer.quit()
                pygame.quit()
                sys.exit()
        mx, my = pygame.mouse.get_rel()
        paddle.rect.left = paddle.rect.left + mx

サンプルのつもりで作ってみたゲームだが、マウス版は意外と遊べたので、もう少し手を加えればちゃんとしたゲームになりそう。時間があればやってみるかも知れないが、どうせならオリジナリティのあるゲームも作ってみたい。良いアイデアが思い付けばの話だけど。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中