前日譚: Python pygameをMacで使うのはヤメとこうぜ
前日譚では問題点がふたつあった。

  • mp3が読めねー
  • キー入力受け付けねー

後者のキー入力をマウスクリックで代用するモジュールを作ったぜ。現在緑さんはMacとWindowsの2台使いなわけだけれど、やっぱMacでもpygameアプリを開けないと不便だ。mp3のほうはムリ。OSがWindowsじゃなければ読み込みをスキップするくらいしか思いつかん。

# accept_mouse_click.py

import pygame.locals as pgl

def switch(event,
           left_click  =pgl.K_z,
           scroll_click=pgl.K_c,
           right_click =pgl.K_x,
           scroll_up   =pgl.K_UP,
           scroll_down =pgl.K_DOWN):
    '''マウスクリックをキー入力に変換します。
    かえたいとこだけ指定してください。
    '''

    change_table = {
        1: left_click,
        2: scroll_click,
        3: right_click,
        4: scroll_up,
        5: scroll_down,
    }

    if event.type != pgl.MOUSEBUTTONDOWN:
        return event

    if event.button not in change_table.keys():
        print('<accept_mouse_click NOTICE> Unknown mouse click:'
              + str(event.button))
        return event

    return DummyEvent(pgl.KEYDOWN, change_table[event.button])

class DummyEvent:
    '''eventのダミー。
    オリジナルのeventがreadonlyだったため、ダミーを作ります。
    ようはtypeの中にMOUSEBUTTONDOWN、keyの中にK_*が入ってりゃいいんだからさ!
    '''

    def __init__(self, type_, key):
        self.type = type_
        self.key = key

いやあモジュールを作るのにも慣れてきたなあ! クラスなんかもサクッと作っちゃったりしてね! ほんで使い方が以下。

for event in pygame.event.get():

    # 左クリックをZキー、スクロールボタンをAキーに変換したい場合。
    event = accept_mouse_click.switch(
        event,
        left_click=K_z,
        scroll_click=K_a
        )

    if event.type == KEYDOWN:
        # 以下、キー入力を受け付けるスクリプト……。

こんなのをこれまでのpygameアプリにぺたぺた貼り付ければ、Macでもマウス操作で遊べるようになるというわけだ。

今回のポイントは DummyEvent クラス。このモジュール、ようは event オブジェクトの中身を覗いてみて、マウスクリックだったらキー入力に入れ替えるってことをしてる。でも実は event オブジェクトの野郎が生意気にもreadonlyだったんだよな。だから書き換えられない。どうしたもんかと頭を捻ったのだが、こいつがどんな高度なクラスから生成されたオブジェクトだろうと、結局必要なのは type パラメータと key パラメータに定数が入ってるという事実だけなんだよな。であれば、そのふたつのパラメータをもったオブジェクトを自分で作っちまえばいいじゃんという流れで解決。やったー!