あくまでも 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-essential
とcython
がこれに該当する。
pkg install x11-repo
pkg install build-essential
- build-essential
$ pkg show build-essential
Package: build-essential
Version: 4.1
Maintainer: Leonid Plyushch <leonid.plyushch@gmail.com> 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
- Pygame のソースコード
https://www.pygame.org/ftp/pygame-1.9.6.tar.gz
このソースコードをダウンロードするために 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) などのモニターにできるのか、ということに興味がある。