パックマンもどき(その3)

モンスターの次はパックマン。

v55.patch

$ mv rt_v54 rt_v55
$ cat v55.patch | ( cd rt_v55 ; patch -p1 )
$ cd rt_v55
$ make clean
$ make

例によって pac/ ディレクトリは一旦消去して作り直します。

$ rm -rf pac/
$ ./pac_dat.py

パックマンの位置の他に、エサの食べられた情報、モンスターのモードの変化も、加えてログ出力するようにしてみました。 以下、v54のときと同じ手順ですが、ログファイル名を pac.log に変更してます。

別の端末から netcat をポート番号55765で起動しておいて

$ nc -l 55765

元の端末に戻って、 pac.pyを実行してログを記録しつつ

$ cd pac/
$ chmod +x pac.py
$ ./pac.py -o | tee pac.log

別の端末の表示を見ながら、 pac.py を起動してる端末でキー操作して、 パックマンが捕まらないようにしばらく頑張ります。

適当なところで ^C で停止。

$ head pac/pac.log 
mode R run 1529896226.54
mode C cage 1529896226.55
mode M cage 1529896226.55
mode Y cage 1529896226.56
. 9 17 1529896227.6
R 10 9 1529896227.78
Y 11 11 1529896227.78
C 9 11 1529896227.78
M 10 11 1529896227.78
. 8 17 1529896227.93

$ tail pac.log 
P 11 1 1529896298.4
. 12 1 1529896298.41
. 13 1 1529896298.64
Y 3 17 1529896298.85
. 14 1 1529896298.98
mode C blink 1529896299.13
mode M blink 1529896299.13
. 15 1 1529896299.32
M 5 19 1529896299.45
Y 1 17 1529896299.46

などと記録されてます。

基本的に4つのカラム。 最後のカラムは時刻(秒)です。

先頭が'C,M,Y,R'はモンスターの位置情報。

先頭が'P'はパックマンの位置情報。

先頭が '.' はエサ、'O'はパワーアップエサで、 パックマンに食べられたときの位置と時刻の情報。

上記の行はv54のモンスターの場合と同様に、次の形式です。

先頭のカラムが 'mode' のときは、モンスターのモード変化の情報で、 次の形式です。

例によってlogファイルもあげておきます。 pac/ ディレクトリにコピーして使います。 pac.log

pac/pac.log が存在する状態で、もう一度 pac_dat.py を実行します。

$ cd ..
$ ./pac_dat.py

$ ls -t *.yaml | head -12
dots.yaml
pm.yaml
blk_bars.yaml
blk_balls.yaml
mons.yaml
mon.yaml
pman.yaml
pac.yaml
dot.yaml
defs.yaml
blk.yaml
big_ball.yaml

生成されたものを含めて、これらのYAMLファイルが揃っていればOK。

$ ./cg.py eyep=[0,0,0],[60,60,40],10 sec=20 yaml=pac.yaml data_name=all name=out_v55/pac_tst div=8 fps=4
  :
wh : 4800/4800(100.0%) : fin 0.49s
frm : 80/80(100.0%) : fin 3m 7.86s
estimated 25.05 hour at 640*480 30fps

なんだか肝心のところが、見えてない感じではがゆいです。 視点の動きを変えてみます。

$ ./cg.py eyep=[0,0,20],[50,50,10],20 sec=30 yaml=pac.yaml data_name=all name=out_v55/pac_tst2_ div=8 fps=4
  :
wh : 4800/4800(100.0%) : fin 0.68s
frm : 120/120(100.0%) : fin 5m 14.42s
estimated 41.92 hour at 640*480 30fps

さっきのよりは、いい感じだと思います。 30秒で、いつもより長めにまわしてますが、が、、、予想時間42時間。 ほぼ2日って...

と、その前に、適当に5秒間隔で6コマほど仕上がりを確認しておきます。

$ ./cg.py eyep=[0,0,20],[50,50,10],20 sec=30 yaml=pac.yaml data_name=all name=out_v55/pac_tst3_ fps=0.2
  :
wh : 307200/307200(100.0%) : fin 51.75s
frm : 6/6(100.0%) : fin 5m 19.28s
estimated 13.30 hour at 640*480 30fps

解像度は原寸で、フレームレートをおとすだけからの計算なら、予想時間13.3時間。

ちょっと角度が「ちょうど」な感じばかりなので、もうちょっと変えてみます。

$ ./cg.py eyep=[0,0,20],[50,50,10],20 sec=30 yaml=pac.yaml data_name=all name=out_v55/pac_tst4_ fps=0.3
  :
wh : 307200/307200(100.0%) : fin 48.78s
frm : 9/9(100.0%) : fin 8m 9.25s
estimated 13.59 hour at 640*480 30fps

予想時間13.59時間。

$ ./cg.py eyep=[0,0,20],[50,50,10],20 sec=30 yaml=pac.yaml data_name=all name=out_v55/pac
  :
wh : 307200/307200(100.0%) : fin 38.11s
frm : 900/900(100.0%) : fin 13h 4m 18.95s

$ ls -lt out_v55/ | head
-rw-r--r--  1 kondoh  staff   1250825  6 27 13:23 pac_6.mp4
-rw-r--r--  1 kondoh  staff   3145465  6 27 13:23 pac_5.mp4
-rw-r--r--  1 kondoh  staff   3140473  6 27 13:22 pac_4.mp4
-rw-r--r--  1 kondoh  staff   3143159  6 27 13:21 pac_3.mp4
-rw-r--r--  1 kondoh  staff   3136201  6 27 13:19 pac_2.mp4
-rw-r--r--  1 kondoh  staff   3134764  6 27 13:17 pac_1.mp4
-rw-r--r--  1 kondoh  staff  18565027  6 27 13:16 pac.mp4
  :

13時間ちょいでした。

パックマンとエサはXORをとって表示してるのですが、 開始してからパックマンが最初に方向を変えるまでの一瞬がいい感じで、 XORっぽく見えます。

パックマンが向きを変えて以降は、エサが消えるタイミングがちょっと早くなってて、 食べる前に消えてる感じです。残念ながらXORの意味がありませんね。

食べられたモンスターの帰還(ret)モードの表示は、 意図してた回転動作とちょっと違ってました。 粗削り設定では、そこまで確かめれてなかったです。

mon.yamlの

eye:
- kind: ball
  rtd: '*rtd_a'
  def_col: '*dark'
  m2g:
  - ax.zoom_all(0.2)
  - ax.slide_x(-0.2)
  rxs:
  - [ m2g, append, 2, [ ax.slide_x(0.4) ] ]

mon_ret:
- kind: export
  export: eye
  m2g:
  - 'ax.rot_z( way.get( [(0,0.5),(360,None)], sec ) )'

ここですね。 なんでそうなるんだろうか? あとでよく考えてみます。

あと、視線と円柱の物体とかが並行になって交点が無いときに、 どうも画面にヘアラインが一瞬現れるようです。

円柱の底面とかに、気泡的なつぶつぶが多く見られるのも気になりますね。