2017/09/15(金) [n年前の日記]
#1 [pi3d][python][raspberrypi] pi3dでキー入力を取得
2Dのリアルタイムゲームを作りたいならキーボード入力の取得ぐらいはできないと話にならないだろう、と思えてきたので、pi3dでキー入力を取得する方法について少し調べたのだけど。これが…ちょっとなかなか厳しい気配が…。
◎ フツーに取得。 :
pi3d_demos のサンプルを眺めながら、フツーに取得するソレを試してみたり。
_get_keyboard1.py
_airplane_01_64x64.png (CC0 License)
動いた。と思いきや、これはこれでかなり問題が。動きをよく見ると分かるけど…。キーを押すと、「タッ……タタタタタ」という感じの動きになってしまっている。
要するに、ブラウザやエディタ等で文字を打ち込む際に、キーのオートリピートが働いたりするけど、アレがそのまま入力されてる・取得されてしまっているわけで。
ゲームを作ろうとした場合、コレは非常にマズイ。インベーダーゲームですら、レバーを倒してから自機が「タッ……タタタタタ」なんて動いたりしないわけで。ということで、このやり方はマズイ。これじゃ使い物にならない。
_get_keyboard1.py
_airplane_01_64x64.png (CC0 License)
u""" pi3d input keyboard sample. キーボード入力を取得してみるサンプル。 WASDキーで上下左右に動かしてみる。 ESCキーで終了する。 Windows10 x64 + Python 2.7.12 32bit + pi3d 2.21 """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import pi3d # ウインドウ生成 display = pi3d.Display.create(w=640, h=480, frames_per_second=60) # シェーダーを生成。uv_flatは照明関係の計算をしない。 shader = pi3d.Shader("uv_flat") # カメラを平行投影に camera = pi3d.Camera(is_3d=False) # テクスチャを読み込み tex = pi3d.Texture("airplane_01_64x64.png", mipmap=False) # スプライトを生成 x, y, z = 0.0, 0.0, 20.0 spr = pi3d.ImageSprite(tex, shader, w=64, h=64, x=x, y=y, z=z) # スプライトをDisplayに登録 display.add_sprites(spr) # キーボード取得用クラスを生成 keys = pi3d.Keyboard() # メインループ while display.loop_running(): spd = 8.0 # キー入力で座標を変化させる k = keys.read() if k == ord("w"): spr.translateY(spd) # スプライトのy座標を変化 if k == ord("a"): spr.translateX(-spd) # スプライトのx座標を変化 if k == ord("s"): spr.translateY(-spd) if k == ord("d"): spr.translateX(spd) if k == 27: # ESCキーが押されたらループを抜けて終了 keys.close() display.destroy() break
動いた。と思いきや、これはこれでかなり問題が。動きをよく見ると分かるけど…。キーを押すと、「タッ……タタタタタ」という感じの動きになってしまっている。
要するに、ブラウザやエディタ等で文字を打ち込む際に、キーのオートリピートが働いたりするけど、アレがそのまま入力されてる・取得されてしまっているわけで。
ゲームを作ろうとした場合、コレは非常にマズイ。インベーダーゲームですら、レバーを倒してから自機が「タッ……タタタタタ」なんて動いたりしないわけで。ということで、このやり方はマズイ。これじゃ使い物にならない。
◎ TestEvents.pyが動かない。 :
_pi3dのFAQページ
によると、
_pi3d_demos の TestEvents.py
を実行するとキー入力やマウス入力、ジョイスティック入力を取得する様子を確認できるよ、と書いてある。
試してみたところ、Raspberry Pi Zero W 上では動作した。
ところが、Windows上で実行するとエラーが出る。
調べてみたところ、Windows版Pythonに、fcntl というモジュールは無いようで。fcntl は Linux版Pythonでしか使えないという…。
_python - fcntl substitute on Windows - Stack Overflow
上記フォーラムで、「fcntl.py というファイルを作って、中でこういう記述をすれば、とりあえずエラー回避はできるよ。機能としては一切働かないけどな」と書かれていたので試してみたのだけど。
「fcntlなんてモジュールはねえよ」と怒られなくなったものの。しかし今度は、「/proc/bus/input/devices なんてファイルもディレクトリもねえよ」と怒られるという。…うん。そのファイル、Linuxは持ってるけどWindowsが持ってるわけないんだよねえ…。
_epics/powermate-event - Epics Users JP
Linuxに接続された入力デバイスの状態は、そこで提示されるという仕組みで…。Windowsにはそんなの無いんだよ…。
ということで、Windows上でも動くようにと考えると、TestEvents.py のソレではダメっぽいなと。
試してみたところ、Raspberry Pi Zero W 上では動作した。
- キーを押した瞬間
- キーを離した瞬間
- オートリピートが働いてキー入力された瞬間
ところが、Windows上で実行するとエラーが出る。
> python TestEvents.py Traceback (most recent call last): File "TestEvents.py", line 6, in <module> from pi3d.event.Event import InputEvents, code_to_key File "C:\Python\Python27\lib\site-packages\pi3d\event\Event.py", line 4, in <module> from pi3d.event import EventHandler File "C:\Python\Python27\lib\site-packages\pi3d\event\EventHandler.py", line 4, in <module> from pi3d.event.EventStream import EventStream File "C:\Python\Python27\lib\site-packages\pi3d\event\EventStream.py", line 1, in <module> import fcntl ImportError: No module named fcntl
調べてみたところ、Windows版Pythonに、fcntl というモジュールは無いようで。fcntl は Linux版Pythonでしか使えないという…。
_python - fcntl substitute on Windows - Stack Overflow
上記フォーラムで、「fcntl.py というファイルを作って、中でこういう記述をすれば、とりあえずエラー回避はできるよ。機能としては一切働かないけどな」と書かれていたので試してみたのだけど。
> python TestEvents.py Traceback (most recent call last): File "TestEvents.py", line 30, in <module> inputs = InputEvents( key_handler_func, mouse_handler_func, joystick_handler_func, syn_handler_func, unhandled_handler_func) File "C:\Python\Python27\lib\site-packages\pi3d\event\Event.py", line 70, in __init__ keyboards = find_devices("kbd") File "C:\Python\Python27\lib\site-packages\pi3d\event\FindDevices.py", line 179, in find_devices with open("/proc/bus/input/devices", "r") as filehandle: IOError: [Errno 2] No such file or directory: '/proc/bus/input/devices'
「fcntlなんてモジュールはねえよ」と怒られなくなったものの。しかし今度は、「/proc/bus/input/devices なんてファイルもディレクトリもねえよ」と怒られるという。…うん。そのファイル、Linuxは持ってるけどWindowsが持ってるわけないんだよねえ…。
_epics/powermate-event - Epics Users JP
Linuxに接続された入力デバイスの状態は、そこで提示されるという仕組みで…。Windowsにはそんなの無いんだよ…。
ということで、Windows上でも動くようにと考えると、TestEvents.py のソレではダメっぽいなと。
◎ pi3d.Keyboard.PygameKeyboardをどうにかできれば。 :
_pi3d/Keyboard.py
を眺めた感じでは、Windows上でpi3dを動かした場合、pi3d.Keyboard() は pi3d.Keyboard.PygameKeyboard() を返すようで。ということは、pygame がキー入力をそれらしく取得できるなら、pi3d 上でもキー入力を取得できるように変更できそうな…。
しかしコレ、pi3d.Keyboard.PygameKeyboard() の read() を眺めていて気付いたけど、キーの同時押しを取得できないのでは…。リストの一番最初の値しか取得してなくて、他のキー入力は全部捨ててるよな…。
しかしコレ、pi3d.Keyboard.PygameKeyboard() の read() を眺めていて気付いたけど、キーの同時押しを取得できないのでは…。リストの一番最初の値しか取得してなくて、他のキー入力は全部捨ててるよな…。
[ ツッコむ ]
#2 [anime] 「異世界はスマートフォンとともに。」なるアニメがなんだか気になる
BS11で放送されてる、「異世界はスマートフォンとともに。」なるアニメを一応視聴してるのだけど。なんだか気になるというか、興味深い作品だなと思ってしまったのでそのあたりをメモ。
◎ テンプレ集合体としての個性。 :
原作はWeb小説発祥のラノベらしいけど…。作者さんの意図や背景が全く分からんので色々と断言するのは難しいのだけど、なんでも巷の評では、異世界転生モノのテンプレートをひたすらかき集めて列挙した、てな感じの作品だそうで。
テンプレ展開というのは、「あ、これテンプレだ」「こういうのは○○で見たぞ」と認知されると、その時点からえてして面白くない印象を受けるわけだけど。しかし全てがテンプレで構成されると、それはそれでまた違った印象を受けるのだと、この作品を通じて気づかされたというか。
たとえテンプレでも、次から次へと提示されれば、質はともかくそこには膨大な情報量がたしかに提示されているわけで、その情報量に対してある種のトリップ感、酩酊状態が発生してしまう、とでもいうか…。結果、瞬間瞬間で見ると何一つこれっぽっちも欠片も面白くないし正直なところ頭痛がしてくるぐらいに酷いレベルなのだけど、しかし全体を通してみると他の作品には無い独特な面白さが感じ取れなくもない、なんとも不思議な作品になってる、ような気がするわけで。面白くないのに、面白い。一体なんなんだろう、この作品は。こういう作り方もあるのか、これはこれでアリと言えばアリかもしれないなあ、などと感心させられてしまったり。もっとも、こういう作り方をするためには、既存作品に対するテンプレの探索と発見の作業が必要になるわけで、それはそれで結構大変じゃないのかなと想像したりもするのだけど…。
まあ、庵野監督あたりが「自分達はコピー世代」と言ってたりするけれど、コピー世代にはコピー世代なりの作り方・戦い方がある、てな話でもあるのかなあ…。あるいは、どんな手法も本気で取り組めば見世物になるんだよ、てな事例なのかも。
テンプレ展開というのは、「あ、これテンプレだ」「こういうのは○○で見たぞ」と認知されると、その時点からえてして面白くない印象を受けるわけだけど。しかし全てがテンプレで構成されると、それはそれでまた違った印象を受けるのだと、この作品を通じて気づかされたというか。
たとえテンプレでも、次から次へと提示されれば、質はともかくそこには膨大な情報量がたしかに提示されているわけで、その情報量に対してある種のトリップ感、酩酊状態が発生してしまう、とでもいうか…。結果、瞬間瞬間で見ると何一つこれっぽっちも欠片も面白くないし正直なところ頭痛がしてくるぐらいに酷いレベルなのだけど、しかし全体を通してみると他の作品には無い独特な面白さが感じ取れなくもない、なんとも不思議な作品になってる、ような気がするわけで。面白くないのに、面白い。一体なんなんだろう、この作品は。こういう作り方もあるのか、これはこれでアリと言えばアリかもしれないなあ、などと感心させられてしまったり。もっとも、こういう作り方をするためには、既存作品に対するテンプレの探索と発見の作業が必要になるわけで、それはそれで結構大変じゃないのかなと想像したりもするのだけど…。
まあ、庵野監督あたりが「自分達はコピー世代」と言ってたりするけれど、コピー世代にはコピー世代なりの作り方・戦い方がある、てな話でもあるのかなあ…。あるいは、どんな手法も本気で取り組めば見世物になるんだよ、てな事例なのかも。
◎ スマートフォンに対する認知。 :
それとは別に、作中でのスマートフォンというアイテムの捉えられ方が非常に気になるというか。
主人公は、神様に、「異世界に行ってもスマートフォンが使えるように」とお願いして異世界転生する、という設定なのだけど。時々ふと思い出したようにスマートフォンを使いつつも、しかしそこで提供されている機能が、すべて回線の向こう側に存在するネットサービスだったりするあたりが実に興味深いなと。
このあたり、作者が天然でやってるのか、それともわざとやってるのかは分からんのだけど…。もしかすると今時の若い人は、スマートフォン=ネットサービスを利用するための端末、ではなくて、スマートフォン自体にネットサービスが提供している各機能がまるっと含まれていると捉えてるのではあるまいか、てな疑念が自分の中で生じてしまったわけで。
いやまあ、おそらく主人公の思考の安易さは読者にとってのツッコミどころとしてわざとらしく提示されているのだろうと想像もするし、若い人達は、スマートフォンの回線の向こう側に存在するサーバにアクセスして各種サービスを享受してることをちゃんと分かってるだろうと想像もするのだけど。だって、現実世界のスマートフォン利用者は、日常会話の中で「サーバが落ちてる」云々とつぶやいてるわけで。つまり大多数のユーザは、スマートフォンの本体機能としてそれが提供されてるわけではなく、サーバが実処理をやってるのだ、ぐらいの認識は当然あるはずで。故に、主人公のスマホの使い方を見て、「ねーよ」「なんでだよ」と笑うことができるのだろう、と。
ただ、物心ついた頃にはスマートフォンがあるのが当たり前だった世代にとって、スマートフォンが一体どんなアイテムに見えてるのか、そのあたりは気になるところだよなと…。
彼等は、Googleストリートビューがどうやって写真を集めてきたのか想像することはあるのだろうか。Wikipediaが集合知と寄付で存在できていることを知っているのだろうか。「いせスマ」の主人公のように、回線の向こう側で提供されてるアレやコレがスマートフォンの中に全てまるっと内包されている、スマホさえあれば全てが完結する、スマホはガチで単なる魔法の道具なのだ、と勘違いする可能性はないのだろうか…。
例えば、生まれた時から民放TVチャンネルが存在するのが当たり前だった世代の中には、うっかりすると「どうしてNHKは受信料を取るんだ」「民放のように無料で放送しろ」と言い出しちゃう輩が時々混ざってるわけだけど。どうして民放が放送するチャンネルを無料で視聴できるのか、その仕組みすら想像することもなく、同時に、その仕組みがもたらすデメリットを予想できない状態に陥ってる層が、現実世界では悲しいかな既に一定数存在しているわけで。
同じことが、「生まれた時からスマートフォンがあるのが当たり前」だった世代の中で発生しないと言えるのだろうか…。
彼等の手の中にある、スマートフォンと呼ばれるアイテムは、広大なネットをチラチラ覗くことができるだけの機器に過ぎず、さらにネットは、多くの人達が色んな形で努力することでかろうじて存続できている、どこか危うさを持った存在でもあるわけだけど。そういった認識を一体どの時点で持つことができるのだろうか。彼等は、「いせスマ」の主人公にはならないと、はたして楽観視できるのか…。
いや、自分達だって結構怪しい…。時と場合によっては、「いせスマ」の主人公のような錯覚をしている可能性はないか。ネットサービスを利用する際、回線の向こう側を想像することができているのか。そこにある仕組みだけではなく、向こう側の向こう側でサービスを利用している「相手」の姿を想像しながら、各種サービスを上手に利用していると言えるのだろうか。
今はまだ、読者視聴者がツッコミ入れつつ笑いながら見てるけど、そのうちツッコミ入れてもキョトンとしてる層が出てきたらどうしよう…。「いせスマ」はギャグ作品なのだろうと思うけど、見方によってはホラー作品にもなり得るよなあ、と。
てなあたりをついつい考えてしまうあたり、なんだか興味深い作品だなあ、などと思いながら眺めております。とメモ。
や。1話の冒頭で主人公が、神様に「スマートフォンを使えるように」とお願いした時、「スマホでモンスターに殴りかかるのだろうか…」「あるいはスマホの熱で玉子焼きでも作ったりするのかなあ」「そのぐらいしか使い道ねえよなあ」と想像していたらいきなりGoogleマップ異世界版を使い始めたのでビックリしちゃったんですよね…。ソレ、スマホじゃなくてGoogleのサービスだよね? スマホって…何なの…君達一体どういう認識してるの…。もしかして、俺の認識がおかしいの…? いや待て、これはいわゆる「ボケ」かな? ツッコミ待ちの場面なのか? 「ソレ、スマホじゃねー」って言っとけばいいのか? みたいな。とにかく各所で「スマホとは何ぞや」という命題を提示されて不安になってくる、妙な作品だなと…。
主人公は、神様に、「異世界に行ってもスマートフォンが使えるように」とお願いして異世界転生する、という設定なのだけど。時々ふと思い出したようにスマートフォンを使いつつも、しかしそこで提供されている機能が、すべて回線の向こう側に存在するネットサービスだったりするあたりが実に興味深いなと。
このあたり、作者が天然でやってるのか、それともわざとやってるのかは分からんのだけど…。もしかすると今時の若い人は、スマートフォン=ネットサービスを利用するための端末、ではなくて、スマートフォン自体にネットサービスが提供している各機能がまるっと含まれていると捉えてるのではあるまいか、てな疑念が自分の中で生じてしまったわけで。
いやまあ、おそらく主人公の思考の安易さは読者にとってのツッコミどころとしてわざとらしく提示されているのだろうと想像もするし、若い人達は、スマートフォンの回線の向こう側に存在するサーバにアクセスして各種サービスを享受してることをちゃんと分かってるだろうと想像もするのだけど。だって、現実世界のスマートフォン利用者は、日常会話の中で「サーバが落ちてる」云々とつぶやいてるわけで。つまり大多数のユーザは、スマートフォンの本体機能としてそれが提供されてるわけではなく、サーバが実処理をやってるのだ、ぐらいの認識は当然あるはずで。故に、主人公のスマホの使い方を見て、「ねーよ」「なんでだよ」と笑うことができるのだろう、と。
ただ、物心ついた頃にはスマートフォンがあるのが当たり前だった世代にとって、スマートフォンが一体どんなアイテムに見えてるのか、そのあたりは気になるところだよなと…。
彼等は、Googleストリートビューがどうやって写真を集めてきたのか想像することはあるのだろうか。Wikipediaが集合知と寄付で存在できていることを知っているのだろうか。「いせスマ」の主人公のように、回線の向こう側で提供されてるアレやコレがスマートフォンの中に全てまるっと内包されている、スマホさえあれば全てが完結する、スマホはガチで単なる魔法の道具なのだ、と勘違いする可能性はないのだろうか…。
例えば、生まれた時から民放TVチャンネルが存在するのが当たり前だった世代の中には、うっかりすると「どうしてNHKは受信料を取るんだ」「民放のように無料で放送しろ」と言い出しちゃう輩が時々混ざってるわけだけど。どうして民放が放送するチャンネルを無料で視聴できるのか、その仕組みすら想像することもなく、同時に、その仕組みがもたらすデメリットを予想できない状態に陥ってる層が、現実世界では悲しいかな既に一定数存在しているわけで。
同じことが、「生まれた時からスマートフォンがあるのが当たり前」だった世代の中で発生しないと言えるのだろうか…。
彼等の手の中にある、スマートフォンと呼ばれるアイテムは、広大なネットをチラチラ覗くことができるだけの機器に過ぎず、さらにネットは、多くの人達が色んな形で努力することでかろうじて存続できている、どこか危うさを持った存在でもあるわけだけど。そういった認識を一体どの時点で持つことができるのだろうか。彼等は、「いせスマ」の主人公にはならないと、はたして楽観視できるのか…。
いや、自分達だって結構怪しい…。時と場合によっては、「いせスマ」の主人公のような錯覚をしている可能性はないか。ネットサービスを利用する際、回線の向こう側を想像することができているのか。そこにある仕組みだけではなく、向こう側の向こう側でサービスを利用している「相手」の姿を想像しながら、各種サービスを上手に利用していると言えるのだろうか。
今はまだ、読者視聴者がツッコミ入れつつ笑いながら見てるけど、そのうちツッコミ入れてもキョトンとしてる層が出てきたらどうしよう…。「いせスマ」はギャグ作品なのだろうと思うけど、見方によってはホラー作品にもなり得るよなあ、と。
てなあたりをついつい考えてしまうあたり、なんだか興味深い作品だなあ、などと思いながら眺めております。とメモ。
や。1話の冒頭で主人公が、神様に「スマートフォンを使えるように」とお願いした時、「スマホでモンスターに殴りかかるのだろうか…」「あるいはスマホの熱で玉子焼きでも作ったりするのかなあ」「そのぐらいしか使い道ねえよなあ」と想像していたらいきなりGoogleマップ異世界版を使い始めたのでビックリしちゃったんですよね…。ソレ、スマホじゃなくてGoogleのサービスだよね? スマホって…何なの…君達一体どういう認識してるの…。もしかして、俺の認識がおかしいの…? いや待て、これはいわゆる「ボケ」かな? ツッコミ待ちの場面なのか? 「ソレ、スマホじゃねー」って言っとけばいいのか? みたいな。とにかく各所で「スマホとは何ぞや」という命題を提示されて不安になってくる、妙な作品だなと…。
[ ツッコむ ]
以上、1 日分です。