ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Raspberry Pi/python】pygameのインストールとタッチパネルを使ったサンプル

 Raspberry Pi用に使っている小型ディスプレイがタッチパネルにもなっているので、タッチ機能を使った何かができないかと調べていたらpygameというライブラリを見つけました。

 このライブラリはpythonでゲームを作るためのものらしいのですが、タッチパネルの機能を扱えるということで今回記事にしてみた次第です。

 では始めます。


1:pygameのインストール
※「Raspberry Pi OS (32-bit) with desktop and recommended software」の場合はすでにインストールされています。

 pygameはpipが入っていれば以下のコマンドでインストールできます。

$ pip3 install pygame

 pygameが正常にインストールされているかはpythonを起動させてimportすることで確認できます。

$ python3
Python 3.7.3 (default, Dec 20 2019, 18:57:59)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygame
pygame 1.9.4.post1
Hello from the pygame community. https://www.pygame.org/contribute.html
>>>


2:pygameを使ったタッチパネル機能のサンプル
 pygameをインストールできたら参考資料のソースコードを見つつ、自分が作った簡単なサンプルを動かしてみます。

・touch_test.py

# -*- coding: utf-8 -*-
import pygame
import os

FONT_PATH = '/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf'
FONT_SIZE = 30
FPS = 24

def main():
    print("--- start ---")

    screen, display_clock, font = setup_gui() # gui部分の設定
    init_display(screen, font) # 画面の初期化
    pygame.display.update() # 画面更新

    counter = 0

    while True:
        display_clock.tick(FPS) # fps設定(最大は40fps)

        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN: # マウスボタン押下イベント
                pos = event.pos
                put_text(counter, pos[0], pos[1], (255,255,255), font, screen) # テキスト表示
                pygame.display.update() # 画面更新
                counter = counter + 1

        # ESCキーが押されたら終了
        if (event.type == pygame.KEYDOWN) and (event.key == pygame.K_ESCAPE):
            pygame.quit()
            break

    print("--- end ---")


# GUIの設定を行う関数
def setup_gui():
    pygame.init() # 初期化
    pygame.mouse.set_visible(True) # マウスポインタ表示

    size = (pygame.display.Info().current_w, pygame.display.Info().current_h) # ディスプレイの画面サイズを取得
    print ("display size: %d x %d" % (size[0], size[1]))

    font = pygame.font.Font(os.path.join(FONT_PATH), FONT_SIZE) # フォントの読み込み

    # ウインドウサイズ指定(ここではフルスクリーン。フルスクリーンの引数がないと全画面表示にはならない)
    screen = pygame.display.set_mode(size, pygame.FULLSCREEN)
    display_clock = pygame.time.Clock() # 画面のクロック

    return screen, display_clock, font


# 画面を初期化する関数
def init_display(screen, font):
    screen.fill((0,0,0)) # RGBで黒

    label = font.render("Please Touch or MouseClick (Exit [esc] key)", 1, (255, 0, 0))
    screen.blit(label, (0, 0))


# テキストを表示させる関数
def put_text(text, xpos, ypos, color, font, screen):
    gap = int(FONT_SIZE / 2)
    label = font.render(str(text), 1, (color))
    screen.blit(label, (xpos-gap, ypos-gap))


if __name__ == '__main__':
    main()

 このソースコードを実行すると自動的にフルスクリーンになります。タッチやマウスクリックなどをするとその場所にクリックした回数が表示されます。終了させるにはESCキーを押します。
f:id:rikoubou:20200616180905p:plain


 以上がpygameを使ってタッチパネル機能を使ってみた内容です。

 pygameというライブラリの内容をよく知らないで使ってしまっていますが、マウスポインタをFalseで非表示にするとタッチの座標が大きくずれたりといくつか問題がありました。マウスカーソルの画像も変更できるようなので、その場合は透明な画像をマウスカーソルにしたりして対応する必要がありそうです。

 pygameをもっと理解してタッチパネルを利用した何か面白いものを作ってみたいです。


・参考資料