別に寂しいわけじゃないぞ!作り方のメモだ!
まず、AviUtlはフレームの移動や操作、
つまるところ画面の変化によって、
その都度Luaが呼ばれます。
そのため、毎回値が初期化されてしまいます。
値の後方参照(前フレームの変数を使う)には、
ちょっとした工夫がいります。
- if (obj.time==0)then
- init_map()
- end
一番手っ取り早いのは0フレーム目のみ初期化処理をしてやること。
上の例だとinit_map()という関数を呼んで、各種必要な処理を行わせます。
もう少し厳密に初期化処理を行いたい場合は、
条件式に初期化完了フラグをおいて判断させるのもいいかもしれませんね。
あとはゲーム処理を書くだけなんですが、
今回は既存のDLLをお借りして楽をしました。
キーインプットに関する関数が見当たらなかったので、
どちらにしろ外部モジュールを使うしかないと思います。
(もしかしたら関数あるのかもしれないけど)
おかげで2日ほどで原型が完成しました。
再利用って大事。
入力方法を確保したら、特定フレームだけ入力を調べるようにします。
剰余が手っ取り早いです。
毎フレーム調べたら重くなるし、移動が早すぎてすぐ壁に激突してしまいます。
移動可能か調べて、ダメだったらそれ相応の処理(ゲームオーバーとか)。
最後にマップの描画をしておわり。
次フレームに移れば入力チェックから始まるので、自分で無限ループを作る必要はなし。
whileの中を書くイメージです。
ゲームを作るようになってからプログラミングが楽しくなってきた。
学校で習うと嫌になるらしいし、独学でよかったのかも。
暇すぎてしかたないけど。
本格的に授業が始まりました。
苦手(というか習ってない分野)な教科の先生に限ってハズレで、
単位が取れるのか心配です。
GPAだかPTAだか知りませんが、指数なんて考えてる余裕ありません。
特に物理が危なっかしく、捨てる覚悟で臨んでます。
サークルは・・・うん、そっちのほうのものに入りました。
あわよくば勉強を教えてもらうなんてことも目論んでますが、
活動する部屋が結構狭いのでなかなか厳しそう。
・・・と。こんな感じで、とっても余裕が無い。
1日1〜2時間の自由時間しかない。
そこに課題やら予習やらが入ってくるとあらもう就寝。
今日みたいな休日ならまだいいんですけどね…。
作品(スクリプトとか動画とか)作る時間がなかなか取れません。
かなりペースが落ちると思います。
ネタが無いのでどちらにしろ動けないのですが。
・・・こんなこと書きながら今日動画上げたような気がしたんだが?
メイン垢より伸びるってのがなかなかに悲しい。
SNESはWAVとMIDIが抽出できるので準備が楽です。
新生活が始まり、慣れない環境化で寿命をすり減らしております。
高校以上の放置教育で、本当にこれで大丈夫なのかと気になる点が多々あり、
胃が痛む毎日です。
当然プログラミングなんてやってる余裕は…あるんですよね。
初心者の壁であるテトリス作ろうとしてます。
これができれば、学校のほうではかなりのアドバンテージになると思います。
おおよその人が求めているスクリプトですが、
いつもどおりネタ切れです。
ユックリヤリマショー
というかプログラミング関係以外で授業についていける気がしない。
1年目で浪人とか笑えんで。
サークルどうしよう。
バイトも見つけないとな。
しばらく生活が安定しないと思うので、
ある程度の余裕ができるまでおとなしくなると思います。
安いからと言って買ったジュースが合成甘味料入りだった。
腹立たしい。
滅びろ。
もうすぐ学生ニートが終わるのかと思うと寂しいです。
一つプログラムが作れたので今年は割と有意義だったと思います。
教科書を買いに行きましたが、
何か小難しいタイトルがいっぱいでした。
わざと難しく書いて俺頭良いみたいな風潮。
本当の教え上手な人は簡単な言葉を使います。
ついにobj.getpixeldata()で画像処理に手を出してしまった。
できるわけねーよと思って手を出さなかったんですが、
高速化のためなら仕方あるまい。
- for(i=0;i<img_w*img_h*4;i+=4){
- work[i+0] = user[i+0];
- work[i+1] = user[i+1];
- work[i+2] = user[i+2];
- work[i+3] = user[i+3];
- }
こんな感じのことをすればワークバッファにユーザーデータをコピーできます。
変数名はお察しを。
でまあこんなんじゃi+1とか言われてもピンと来ないので、
#defineでもしておきましょう。
処理が終わったら、
- lua_pushlightuserdata(L, work);
- return 1;
戻り値の数がreturnの値になるので、ワークバッファをスタックにプッシュします。
追加で何か情報を乗っけたい場合はそれぞれ対応する関数を使いましょう。
アセンブラ以外、しかもスクリプト言語で「スタックにプッシュ」と聞くことになるとは。
まあ汗もRAMアドレスちょっといじるくらいで、スタックとか全く触れませんでしたけど。
で、気になったのがワークバッファ前後のメモリ破壊について。
乱数によってはバッファオーバーランを起こしていたのに、
エラー一つも見せずに動き続けるAviUtl。
ある程度メモリにパディングがあるにしろ、
バッファサイズ1/4ぐらい先に書き込んでもビクともしないなんて。。。
最近活動時間が22時頃で限界を迎える。
生活リズムが夜行性から一周したのかね。
それでも25時くらいまでは起きてしまうのですが。
今ではすっかりPNG厨。
知らないから嫌いって考えは改めるべきでした。
で、そんなこんなでPNGを吐き出すコードを書きました。
5日前ですけど。
長い間苦戦してたお仕事ようやく片付いた感じです。
書き始めたのは去年の12月、
いろんな解説サイトめぐってコピペして、
それでもうまくいかず。
やっぱむずいなーと放置すること2ヶ月。
夢にも出てきやがったんですよ。
これは消化するしかないとやってみたら実はミスは別な場所で。
するとあれよあれよと出来上がってしまいました。
諦めないって大事ね。
getpixeldata()はvoid*型のポインタ。
画像データの先頭アドレスで、(0,0)のRGBA(0,1)のRGBA〜となってます。
バイトオーダーは知らん。リトルエンディアンじゃないかしら。
各行の先頭アドレスは、
userdata + (横幅*行数*sizeof(char))
userdataはポインタなので&いらない。はず。
ポインタとか難しい以前に実践不足で全くわからないの。
読んでできたように勘違いしちゃうタイプ。
今回は丁度いい勉強になりました。
まだ不安だけど。
80行とか中途半端な長さだとここにも貼れず、
かといっていつもの配布物の中やwikiに貼るのも微妙。
さてどうしよう。
年末の大掃除まで自分用ですかね。
既に2つくらい没あるのに…