pygame on termux

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

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

pygame とは何かは wikipedea を。最初のリリースが 2000年10月28日だそうです。[2001年9月11日のアメリカ同時多発テロより一年前](https://ja.m.wikipedia.org/wiki/%E3%82%A2%E3%83%A1%E3%83%AA%E3%82%AB%E5%90%8C%E6%99%82%E5%A4%9A%E7%99%BA%E3%83%86%E3%83%AD%E4%BA%8B%E4%BB%B6)

https://ja.m.wikipedia.org/wiki/Pygame

##必要なアプリ

* 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 も含めてコンパイルされている場合は音も出力される。

このように。（無音）

https://m.youtube.com/watch?v=XDysdEdTgvo&feature=youtu.be

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
```

![IMG_20210508_023940_865.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/541337ca-614b-1e85-03f1-5eca96ddbc0c.jpeg)


```
$ 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 だとこうならないと思う。](https://m.youtube.com/watch?v=VSLtXTGWeQA)python のプログラムの中での設定でビデオデバイスを指定していなくても。

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

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

![Screenshot_20210508-151141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/f2857f74-79d3-7507-bbb3-5b8b3165e36a.png)

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

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

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

![IMG_20210507_225655_264.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/5ffe8e23-fed6-6eba-3cac-3ebe8ad1681e.jpeg)


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

![IMG_20210508_025640_288.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/8e2db707-72e4-c710-895c-1ce9c07a048b.jpeg)

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

冒頭に書いた pydroid3 の場合は、アプリの中で[ pygame をインストールすれば、プログラムをただ実行するだけで自動的に GUI 出力画面がたちあがってくる](https://m.youtube.com/watch?v=CAWKhh-mlmU)ので x 画面転送の設定をする必要はない。

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


x 転送は画面をネットワーク上のデバイスに指定して送れる（ssh接続）ので複数のタブレットを[ Awesome (window manager) ](https://en.m.wikipedia.org/wiki/Awesome_(window_manager))などのモニターにできるのか、ということに興味がある。