2018年01月27日

LÖVE でゲームプログラミング

 スクリプト言語で簡便にプログラミングできる環境をいろいろ検討していたのだが、最近 LÖVE というのを見つけた。

 これ、ファイナルアンサーじゃないかなと思いつつある。こういうのが欲しかったんだよ。

  • Windows/Mac/Linux のクロスプラットフォーム。Raspbian でも動く。iOS/Android 版もある?
  • 完全にフリーでオープンソース。
  • プログラム言語は Luajit。
  • GPU によるハードウェア描画をサポート。Raspbian 上では、X がなくてもフレームバッファ直書きで動く。
  • コミュニティが活発。フォーラムには毎日数件の投稿がある(英語だけど)。

 惜しむらくは、入門者向けのチュートリアルが少ない。例えば Scratch で遊んでいた人が移行できる感じではない。もともと Lua の知識がある人なら、スムーズに入っていけるんだと思うけど。また、日本語の情報はまだまだ少ない。このへんを参考に。

 とりあえず Mac で動かしてみた。LÖVE のホームページから Mac 版をダウンロードして展開、/Applications に置いておく。適当な場所に fish というディレクトリを作って、その中に main.lua を以下の内容で作成する。PNG ファイルはこれをダウンロードして、fish/images ディレクトリとして展開する。

player     = {}
fish       = {}
images = {}
cwide      = 320
chigh      = 240

love.window.setTitle('Les Poissons Danse')
swide = love.graphics.getWidth()
shigh = love.graphics.getHeight()

function love.load()
  images.fish0 = love.graphics.newImage('images/fish0.png')
  images.man0 = love.graphics.newImage('images/man0.png')
  fish.x    = 0
  fish.y    = 0
  fish.img  = images.fish0
  fish.width = fish.img:getWidth()
  fish.height = fish.img:getHeight()
  fish.speed = 150
  player.x     = 150
  player.y     = 150
  player.img   = images.man0
  player.width = player.img:getWidth()
  player.height = player.img:getHeight()
  player.speed = 200
end
    
function love.update(dt)
  dx = player.speed * dt
  if love.keyboard.isDown("right") then
    if player.x <= (cwide - player.width - dx) then
      player.x = player.x + dx
    end
  elseif love.keyboard.isDown("left") then
    if player.x >= dx then
      player.x = player.x - dx
    end
  elseif love.keyboard.isDown("down")  then
    if player.y <= (chigh - player.height - dx) then
      player.y = player.y + dx
    end
  elseif love.keyboard.isDown("up") then
    if player.y >= dx then
      player.y = player.y - dx
    end
  end
  dx = fish.speed * dt
  fish.x = fish.x + dx
  if fish.x >= cwide - fish.width then
    fish.speed = -math.abs(fish.speed)
    fish.x = fish.x - dx
  elseif fish.x <= 0 then
    fish.speed = math.abs(fish.speed)
    fish.x = fish.x - dx
  end
end
    
function love.draw()
  love.graphics.scale(swide / cwide, shigh / chigh)
  love.graphics.draw(player.img, player.x, player.y, 0, 1, 1, 0, 0)
  love.graphics.draw(fish.img, fish.x, fish.y, 0, 1, 1, 0, 0)
end

 ターミナルから /Applications/love.app/Contents/MacOS/love fish で実行。まだキャラクタを動かしているだけで、ゲームにはなってませんけどね。

20180127-1.png

 ラズパイでも動くことは確認した。ちょっとインストールが面倒なのと、挙動不審なところもあるので、まだ調査中。そのうちまとめます。

posted by toshinagata at 11:34| 日記

2018年01月25日

iPS研不正の件:利益相反なのか?

 共同通信の記事。今見ると、記事のタイトルは「山中所長が給与全額寄付 京大iPS研、論文不正」となっているし、利益相反を疑わせる印象操作は(あるけど)強くはない。批判を受けて記事を差し替えたんでしょうか。そうだとしたら、そのことを明記すべきですね。

(以下、上記の共同通信記事についてではなくて、一般論として書いています。)

 科学誌の世界では、誤報を出してしまったら、元の記事と同等の扱いで撤回記事が出ます。誌面の隅っこに小さく載せてごまかすようなことは許されません。また、元記事は「取り消された」ということが明記された上で、そのまま公開され続けるはずです(無かったことにはならない)。科学的事実を伝えていくための責任を負うためには、そういう扱いが必要とされるからです。

 新聞社も、自分が「社会的事実を伝えている」という矜持があるんだったら、誤報は元記事と同等の扱いで公開することと、誤報記事を「誤報である」という注釈付きで公開し続けることを選ぶべきだと思います。なぜなら、最初の報道の時点で自社が「誤報を伝えた」ということ自体が、一つの社会的事実であるからです。そこまでの客観的姿勢を貫く新聞社があれば、誰からも「フェイクニュース」などと嘲られることはなくなると思う。

タグ:社会
posted by toshinagata at 22:01| 日記

2018年01月21日

SmileBASIC で「コリドール」(ボードゲーム)

 パソコンミニの SmileBASIC で「コリドール」というボードゲームを実装してみた。二人プレイのみ。コンピュータとの対戦は(まだ)できません。

20180121-1.jpg

 「コリドール」は、正しくは "Quoridor" と書く。Gigamic 社が開発・販売しているゲームです。 ルールの説明と SmileBASIC のソースコードはこちらにあります。

 一人二役の対戦しかしてないのだけれども、二人でプレイしたら雰囲気悪くなりそう。お互いの進路を邪魔し合うゲームだからね。将棋で待ち伏せされたら「ひきょうだ」とか怒り出すタイプの人とはやらない方が無難。

 コンピュータにプレイさせるとしたら、どういう思考プラグラムを作ればいいだろうか。コマを動かす手は最大5種類だから選択肢が少ないが、壁を置く手はルール上可能な手が非常に多いので、案外面倒かもしれない。特に評価が難しそうなのが、「壁を置くことによって、相手に壁を置かれることを防ぐ」という戦略だな。誰か作ってみませんか。BASIC では難しそうだけど。

posted by toshinagata at 21:23| 日記

2018年01月20日

ジャズピアニストとクラシックピアニスト

 「同じ『ピアニスト』でもジャズとクラシックでは脳の使い方が違うことが判明」(Gigazine)。ああ、そりゃそうだろうなあ。クラシックピアノのトレーニングを受けていても、ジャズピアノって弾けるようにはならないんですよね。

 逆はどうなんだろう。ジャズの人で、ある程度その道を極めた後に、クラシックの勉強を始める人がいるじゃないですか。「脳の使い方」はともかくとして、音楽の捉え方が変わって、ジャズの演奏にもいい影響を及ぼしたりするんだろうか。中途半端な音楽になってしまったりしないんだろうか。

 ジャズの人が学ぼうとする音楽は、たいていバッハかモーツアルト。近現代の音楽に興味を持つ人もいるようです。いわゆるロマン派の音楽(たぶんベートーヴェンも含む)はあまり関心を持たれないようです。これも何か意味があるんだろうか。

タグ:音楽
posted by toshinagata at 10:41| 日記

2018年01月16日

PQI Air Card II でラズパイのベアメタル開発

 PQI Air Card II を購入。32 GB の microSD カードとセットで、2,400 円。

20180116-1.jpg

 一見 microSD カードのアダプタなのだが、実は無線 LAN の機能を持っている。SD カードの形をした無線 LAN 機器として FlashAir が有名だけど、この品物は、挿入された microSD を外部記憶装置として認識できる。無線 LAN 部分と記憶装置部分が分離されているため、使い道はさらに広い。

 今回は、ベアメタルラズパイの microSD カードに無線でアクセスできるようにする目的で購入した。こんな風に使っています。サンコーのmicroSD-SD エクステンションケーブル を使って、ラズパイの microSD スロットにフルサイズの SD が接続できるようにする。もともとラズパイに入れていた microSD を PQI Air Card II に入れて、それを SD スロットに挿入する。このままラズパイの電源を入れると、普通に立ち上がります。つまり、microSD-SD アダプタとしてもちゃんと機能している。

20180116-4.jpg

 無線 LAN の設定。立ち上げると、"PQI Air Card" という無線 LAN アクセスポイントが見える。そこに接続して(初期設定ではパスワードはない)、192.168.1.1 にウェブブラウザでアクセスすると、次の画面になる。

20180116-2.jpg

 PQI Air Card に PC からアクセスするとき、初期設定通りに PQI Air Card がアクセスポイントとなっていると、アクセスするたびに通常のインターネット接続と PQI Air Card を切り替えないといけないので、相当に煩わしい。そこで、PQI Air Card が自分ちの無線 LAN アクセスポイントにクライアントとして接続するように設定を変更する。Wifi Setup の画面で、Hotspots の項に自分ちの無線 LAN アクセスポイントの設定を書き込んでおく(下図の@)。

20180116-3.jpg

 ちなみにAは、PQI Air Card をアクセスポイントとして使う時のパスワード。普段は使わないけど、念のために設定しておく。

 立ち上げ時にクライアントモードで起動させるためには、microSD のルートディレクトリに autorun.sh というファイルを作成して、次の内容を書いておけばよい。(この情報は、ひとりぶろぐさん「デジカメ内部でRubyを動かす狂気!無線LAN内蔵SDカードアダプタPQI Air Cardの間違った使い方」による。)

#!/bin/sh
sleep 5
/usr/bin/w2

 再起動して、ターミナルから ftp でアクセス。IP アドレスが何かは推測するしかない。固定 IP で接続する方法ってあるのかな。

$ ftp 192.168.1.17
ftp: Can't connect to `192.168.1.17': Connection refused   #  違った!
ftp: Can't connect to `192.168.1.17'
ftp> quit
$ ftp 192.168.1.18
Connected to 192.168.1.18.     #  通りました
220 Operation successful
Name (192.168.1.18:xxxxxx):    #  ユーザー名もパスワードもなし
230 Operation successful
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 EPSV ok (|||37389|)
150 Directory listing
drwxr-xr-x    4 root     root             0 Dec 31 17:00 mtd
drwxr-xr-x   10 root     root          4096 Dec 31 17:00 sd
226 Operation successful
ftp> ls sd
229 EPSV ok (|||36661|)
150 Directory listing
-rwxr-xr-x    1 root     root         18693 Aug 21  2015 COPYING.linux
drwxr-xr-x    3 root     root          4096 Dec 31  1979 DCIM
-rwxr-xr-x    1 root     root          1494 Nov 18  2015 LICENCE.broadcom
...(snip)...
-rwxr-xr-x    1 root     root       3939492 Jul  3  2017 start_x.elf
226 Operation successful
ftp>

 SmileBASIC のファイルは /sd/PCM/SB, MZ-80C エミュレータのファイルは /sd/PCM/MZ80 に入っている。大文字・小文字は区別される。ディレクトリ名を打ち間違えてもエラーを返してくれないので、要注意。


ftp> cd sd/PCM/SB
250 Operation successful
ftp> put something
local: something remote: something
229 EPSV ok (|||52093|)
150 Ok to send data
100% |***********************************|  3852       27.41 MiB/s    00:00 ETA
226 Operation successful
3852 bytes sent in 00:00 (200.65 KiB/s)
ftp> 

 ところが、SmileBASIC 側で Files しても、ファイルは認識されていない。こっそりファイルを書き換える操作はサポートしていないのかも。結局 reboot が必要だった。さらに、リブートしたあと USB キーボードが認識されない。一度コネクタを抜き差ししないといけない。なんだか、いろいろ不便だな。電源を切って microSD を差し替えて、というよりはよほど楽だけどね。

タグ:Raspberry Pi
posted by toshinagata at 22:19| 日記

2018年01月14日

京都大学にムーミン出現

 Yahoo! トップページの「話題のツイート」で「京都大学」が一位に上がっていたから、何かと思ったら。

 あははは、京大生の仕業やな。左の写真のはあまりムーミンっぽくないけど、右2つの写真のはよくできてますね。昨日の「センター試験でムーミン出題」という話題に乗じて、一晩で作ったんだろう。

 この写真を見ると、京都もかなり雪が降ったようですね。センター試験の日って、天気が荒れることが多いような印象がある。受験生のみなさん、健闘を祈ります。

タグ:社会
posted by toshinagata at 12:20| 日記

2018年01月13日

SmileBASIC で「マージャンソリティア」

 引き続き「パソコンミニ」の SmileBASIC で、「マージャンソリティア」を実装してみた。ソースコードはこちらにあります。

20180113-1.jpg

 SmileBASIC の特徴、つづき。

  • グラフィックは4面。スプライトの画像データ置き場も兼ねている。つまり、スプライトは「あるグラフィック画面の指定した長方形部分の画像」として定義される。画像ファイルをいくつも並べて定義するよりずっと扱いやすい。
  • スプライトには「Z 座標」を指定できる。これは重ね合わせの順序を指定するだけで、自動的に遠近処理をしてくれるわけではない。
  • なぜか画面上部の 32 ドット分が表示されない。config.txt をいじって、ディスプレイ設定を 1280x800 にしているせいかも。「ちょっと違う設定」にすると正常に動かなくなるのはつらいですね。
  • テキスト画面は、8x8 ドットのフォントで表示される。漢字と英数字が同じサイズで表示されるのは、正直言って美しくない。
  • ただ、SmileBASIC の仕様として、「文字列の内部表現は UTF-16」となっていて、漢字も英数字も UTF-16 の1ワードで表現されている。「1文字=画面上の1文字」と対応づけることで、テキスト画面の扱いを単純化しているのだろう。
  • ファイル操作は少し弱い印象。たとえば、300 行弱のプログラムを save コマンドで保存する時、はっきり分かる程度の待ち時間がある。ベアメタルラズパイだと、SD カードを高速に読み書きするのが難しいので、その影響があるかも。
  • 外部記憶装置はサポートされていない。パソコンで作成したプログラムをパソコンミニに転送するには、一度シャットダウンして、micro SD カードを取り外して、パソコンにマウントしてコピーするほかない。
  • 本体でプログラムを編集したあと、うっかり未セーブでシャットダウンすると、そのままプログラムは消えてしまう。こんなところまでレトロパソコンを模倣しなくてもいいんじゃないの?
posted by toshinagata at 13:40| 日記

2018年01月11日

SmileBASIC で「さめがめ」

 「さめがめ」をパソコンミニSmileBASIC で実装してみた。ソースコードはこちらにあります。

20180111-1.jpg

写真が下手すぎだな。スクリーンショットの機能が欲しい…

 SmileBASIC は初めて使った。特徴はこんな感じかな。

  • 行番号に頼らないのは◎。今どき当たり前だけど、昔の BASIC に慣れた人は「やっぱり行番号への GOTO がわかりやすい」とか言うんだよな。(その価値観を子供向けの「プログラミング教育」に持ち込むのはやめてほしい、と切実に思う。)
  • 関数・手続きが定義できるのもよい。また、関数・手続きの中で VAR, DIM で変数を宣言すると、ローカル変数とみなされる。これも、今どきの言語では当然実装されているべき。
  • 手続きの定義は DEF name arg1, arg2,... で、関数の定義は DEF name(arg1, arg2,...)。つまり、カッコのあるなしで区別される。この仕様はちょっと違和感があるけど、「命令(カッコなしで使う)」と「関数(カッコありで使う)」の定義だと思えばいい。
  • 2つ以上の値を返す「命令」は、DEF name arg1, arg2,... OUT var1, var2,... と定義する。あまり見たことがない仕様だが、「アドレス渡し」の引数を実装するよりは、わかりやすいかもしれない。
  • 配列参照は a(i) ではなくて a[i]。関数と見た目を区別する意味では、この変更は良いと思う。
  • 「等しい」演算子は = ではなくて ==。また、「等しくない」演算子は <> ではなくて !=。配列参照も含めて、このあたりは現在よく使われている言語に合わせてある。
  • ビット演算子 (NOT, AND, OR, XOR) と論理演算子 (!, &&, ||) は分けてある。&&, || は C などと同様にショートカット機能を持つ。
posted by toshinagata at 19:47| 日記

2018年01月08日

WIMAXIT ラズパイ8インチ HDMI モニタ 1280x800

 ラズパイ用の8インチモニタで、1280x800 が表示できるものを Amazon で買った。8,999円。


中国からの発送でした。1/4に発注して、1/8に到着。思ったより早かった。中国からの発送は FedEx で、国内配送は日本郵便。


簡素な梱包だが、特に問題はなかった。


本体はこんな感じ。一応組み立ててあるが、保護シートをはがすのに一旦ネジを外してばらす必要がある。


裏面。真ん中にあるのがコントロール基板、その横はボタン類だが、電源ボタン以外は使わないかな。


付属品。アクリルの脚、短いHDMIケーブル、液晶拭きの布、micro USB ケーブル。


コントロール基板を覆っているアクリルの保護板を外す。


スペーサの位置をラズパイ基板の取り付け穴に合わせてあるのだが、残念ながら M3。ラズパイ基板に無理やり M3 ネジをねじ込んで固定した。スペーサを M3/M2.6 の異径にしておいてくれたら満点だったのだが。


ケーブルを装着。コントロール基板には micro USB 端子が2つあるが、HDMI 端子に近い方が電源。


電源は「Anker 24W 2ポート USB急速充電器」を使う。このディスプレイの良いところは、電源が 5 V (2 A) である点。12 V だと AC アダプタが2個になってかさばる。この充電器は 2.4 A 2ポートで、ラズパイ3にはギリギリかも。


電源ボタンは裏面ボードにある。


起動画面。


ラズパイ3を立ち上げてみました。config.txt に次の記述を書き込んでおく。

hdmi_group=2
hdmi_group=87
hdmi_cvt=1280 800 60 6 0 0 0

GUI が立ち上がった。表示は細かいが、老眼でもギリギリ読めるレベル。つい画面に手を伸ばしたくなるが、タッチパネル機能はないので、念のため。


ずっと塩漬けになっていた「パソコンミニ」がようやく日の目を見ました。パソコンミニ本体からラズパイ A+ を取り出してこのディスプレイに接続し、立ち上げ。


MZ-80C エミュレータの動作も確認できた。


 やっと動くようになったので、Smile BASIC で何か作ってみたい。

タグ:Raspberry Pi
posted by toshinagata at 17:45| 日記

2018年01月07日

CCさくら、クリアカード編スタート!

 来ましたよ!

 早起きして正座して見た(うそ、正座はしてない)。絵も声も違和感ないですねえ。18年ぶりというのに、声優さんたちほんとプロだな。

 アニメイトでは、さくら役の丹下さんとケロちゃん役の久川さんのロングインタビュー。現場の仲良さが伝わってきますね。

 注目していたのは、坂本真綾さん作詞・水野良樹さん作曲のOP「CLEAR」。これまでの CCさくらの歌は、ウェットな感じがどこかにあったんだけど、今回のは「透明感、疾走感」が前面に出ている。坂本さんは「プラチナ」も歌っていたし、劇場版第2作では重要な役で出演していたから、「さくら」の雰囲気をよく知っているんでしょう。水野さんもいい仕事してますね。Bメロから始まって、Aメロに入る前の間奏でちょうどタイトル画面が出てくる。菅野よう子さんの「プラチナ」は複雑に転調していたけど、「CLEAR」は下属調と平行調に行くぐらいで(水野さんの十八番)、割合シンプルな音使いだった。

20180107-1.png

(著作権保護のコンテンツなので、YouTube 本体での視聴になります)

タグ:アニメ
posted by toshinagata at 09:50| 日記
email.png
Powered by さくらのブログ