pygame on termux


あくまでも Android で termux で pygame を使ってゲームプログラムや openCV + pygame を使う必要がある場合についての事だということをことわっておく。

pygame 2 は pydroid3 というアプリでは python で pygame2 のマルチタッチセンサーの機能を使ったコードを書いたもの正常に動いたので、アプリ単体でオールインワンで使う場合は、pydroid3 の方が簡単で、当初 pygame がどのプラットフォームで動くのかわからなかったので、pydroid3 で試してみたところかんたんに実現できたので使っていた。
QPython というアプリでは、使えるという情報も古いものにはあったので、2つのバージョン( QPython 3L と QPython OL)でとりくんではみたが、今現在のところ不明。コミュニティーページ(Facebookページが指定されている)も関係のないように見える投稿だらけでカオスで、github issue にもメンテナンスがされている印象がない。

pygame とは何かは wikipedea を。最初のリリースが 2000年10月28日だそうです。2001年9月11日のアメリカ同時多発テロより一年前

必要なアプリ

  • termux
  • XServer XSDL

termux の pkg には予め pygame は用意されていない。

termux の中で、pygame をビルトする必要がある。(とは限らないけれどもクロスコンパイルされたものが無いので)

大事なことなので太字で コンパイルって何だっけ、ビルドってなんや、という疑問を持ちながらでも三十分以内でできることなので、わかっていても確かめてるとそのくらいかかることが、コンパイルって何だっけという躊躇につながっている。何が必要で、どうすんのということが、よく知ってる人なら解るんだろうが、自分は全くわからない、だからできないと考えがち(料理に似ている)だけども、これが実は誰でも同じで、ようはあんま個別の案件に丁寧に説明されてないから、よネ。

termux で SDL 関連のパッケージのインストールにはx11-repoが必要になるので、まずこれをインストールしてから pygame のビルドに必要なライブラリをpkgからインストールする。ソースコードからビルドにはツールのインストールも必要で、build-essentialcythonがこれに該当する。

pkg install x11-repo
pkg install build-essential
  • build-essential
$ pkg show build-essential
Package: build-essential
Version: 4.1
Maintainer: Leonid Plyushch <[email protected]>                                                     Installed-Size: 4096 B
Depends: clang, make, pkg-config
Recommends: autoconf, automake, bc, bison, cmake, flex, gperf, libtool, m4
Suggests: git, golang, nodejs, patchelf, proot, python, ruby, rust, subversion
Homepage: https://github.com/termux/termux-packages
Download-Size: 810 B/
APT-Manual-Installed: yes
APT-Sources: https://termux.org/packages stable/main arm Packages                                           Description: A metapackage that installs essential development tools

また、pygame とは SDL を python で扱えるものにしたものなので、termux で pygame を使うのには python の実行が必要なのでインストールする。

pkg install python
  • Python
$ pkg show python
Package: python
Version: 3.9.5
Maintainer: @termux
Installed-Size: 46.4 MB
Depends: gdbm, libandroid-support, libbz2, libcrypt, libffi, liblzma, libsqlite, ncurses, ncurses-ui-libs, openssl, readline, zlib
Recommends: clang, make, pkg-config
Suggests: python-tkinter
Breaks: python2 (<= 2.7.15), python-dev
Replaces: python-dev
Homepage: https://python.org/
Download-Size: 8167 kB
APT-Manual-Installed: yes
APT-Sources: https://termux.org/packages stable/main arm Packages
Description: Python 3 programming language intended to enable clear programs

pipを使えるようにしておいたほうがいい。

python3 -m pip install pip -U

だったかしら?

$ pip --version
pip 21.1.1 from /data/data/com.termux/files/usr/lib/python3.9/site-packages/pip (python 3.9)

そして pygame の display は SDL の video デバイスを x 転送して termux CLI から Xserver XSDL アプリの GUI へ表示されるという流れになる。SDL-mixer も含めてコンパイルされている場合は音も出力される。

このように。(無音)

pygame のビルドに必要なライブラリは termux でもパッケージ化されているのでpkgでインストールできる。

  • sdl2, sdl2-image, sdl2-ttf, sdl2-mixer
pkg install sdl2 sdl2-image sdl2-ttf sdl2-mixer

このソースコードをダウンロードするために wget を pkg からインストールする必要がある。

pkg install wget

pygame バージョン 1.9.6 なのはたんにバージョン 2.0.1 の在り処をまだ探せていないからなので、バージョン 1.9.6 では、バージョン 2.0.1 用に書いたスマートフォンなどのタッチセンサー用のプログラムは対応していない。

新たなディレクトリを作るか、どこか場所を確認してから圧縮ファイルのソースコードをダウンロードして解凍する。

$ pwd

$ wget https://www.pygame.org/ftp/pygame-1.9.6.tar.gz
$ tar zxvf pygame-1.9.6.tar.gz
  • cython
pip install cython

build

pygame-1.9.6.tar.gz を解凍してできたディレクトリに移動する。

cd pygame-1.9.6

pygame -1.9.6 ディレクトリの中でコマンドでビルド。cythonでコンパイル。

$ python3 setup.py -config -auto -sdl2

$ python3 setup.py install cython

Erorr なければビルド完了。

$ ls
PKG-INFO    build        examples         src_py
README.rst  buildconfig  pygame.egg-info  test        Setup
dist         setup.py                     Setup.bak   docs
src_c

termux (CLI) から GUI ヘ表示。

pkg にはxorgprotoというプログラムもあって、これで x Window の表示ができそうなのだけども、どうやって使うか未だしらない。表示するいわゆる display を指定すると指定された方から GUI を表示できるようになっている のかな
でもわからないので、今のところはアプリでそれをできるようにしたものを使う。

  • XServer XSDL

ここで使い方の一部を説明すると、例えば pygame を import して書いた python のプログラムを termux の中で自分で用意したフォルダに設置して実行できるようにする。

python がインストールされた termux 上で何もせずこれを実行すると、

paygame.erorr: No available video device

というエラーになる。pygame のインストールに成功していると pygame がそう応えてくれる(ということなので、このエラーを見たときは、やったと思った)。
デスクトップ PC だとこうならないと思う。python のプログラムの中での設定でビデオデバイスを指定していなくても。

ビデオデバイスを正しく取得して、そのビデオデバイスで表示したらいいわけで、それを x 転送という方法でやる。XServer XSDL で。

まず、XServer XSDL のアプリを起動する。設定メニューが現れるが、何もしなくてもつぎの画面になる。

この指示にしたがって、termux に戻って、export を使って、デバイスの指定と、画面を送るアドレスの指定をする。

export DISPLAY=:0 PULSE_SERVER=tcp:127.0.0.1:4713

enter キーを押してから、python で pygame を import したプログラムを実行する。

pygame がきげんよくあいさつしてエラーを表示しなかったら、アプリを termux から XServer XSDL に切り替えて見ると python プログラムの pygame GUI 出力が表示される。termux の方は時が止まったかのように hello と言ったままです。これは、pygame の display は SDL の video デバイスを x 転送して termux CLI から Xserver XSDL アプリの GUI へ表示されるという流れになるよということを前もって知ってないとポカンとしてしまうと思う。「 termux の黒い画面からプログラムが出力した映像を XServer XSDL で見れるようにしてるんだ」ということなので、それを一番先に書いとけばよかったかもしれない。

Rf.pip install pygame ERROR #1411
https://github.com/termux/termux-packages/issues/1411#issuecomment-767733921

冒頭に書いた pydroid3 の場合は、アプリの中で pygame をインストールすれば、プログラムをただ実行するだけで自動的に GUI 出力画面がたちあがってくるので x 画面転送の設定をする必要はない。

ここでは、pygame をどうやって Android でコンパイルして使えるようにするのか興味があったのでとりくんだ結果こうなった、という記事にした。実は、できるはずと思いこんでから、半年以上経っていた。わからなかったのは、知らないことがたくさんあったから、情報を見てもやくにたてるところまで辿り着かなかった。
「termux はコマンドラインツールなので GUI を持たない、だから pygame は動かせない」 という意見のほうが情報としては多く、そこで立ち止まってしまうが、そうなんかな?ディスプレイの仕組みってそういうことじゃないんじゃないかな?と考えるのもまた自然なことで、google colab でも GUI プログラムをたちあげているひともいるようだ。

x 転送は画面をネットワーク上のデバイスに指定して送れる(ssh接続)ので複数のタブレットを Awesome (window manager) などのモニターにできるのか、ということに興味がある。