fc2ブログ

本気で仕事がやばいので月末まで潜る~(FAM)

2009.11.26.Thu
とりあえずメモだけでも残す。

ペンぷっとを作ってよかったことは以前よりもluaの挙動がわかった(ような気がする)ことですかね。
やっぱり実際にいじってみないと覚えられないです。
しかし、いまだにluaを使うことによるメリットを肌で感じてはいないなあ。
自分の使い方だとせいぜい変数の取り扱いが便利になったのと文字列をいじりやすくなったのとNSExecが使えるようになった、ということぐらいでしょうか。
まあ、それだけで十分大きいという見方もありますが。

ペンぷろった~でペンぷっとの機能を取り込むことは確定で。
構想では擬似的にNスクのスクリプト処理(テキスト表示含む)を行いながらスクリプトの修正できそう。
gotoやgosub、ifといった命令は正常に行えないんでユーザー定義命令を作る必要もありそうですが。
そんなこと考えるよりはやく動かせるようにすることのほうが大事なんですけどね!



以下、いつものごとく自分専用覚え書き。
・ローカル変数とローカル関数は実際に使う部分よりも前に書いておく。内部的には順番に読んでは置き換えていってるんかしら。
・if文の閉じ忘れ注意。ブロックが閉じないエラーはどこが悪いのかわかりにくいことが多いのでやっかい。中身を書く前にまず閉じてしまえ。
・Nssleepがおかしい? もしかしたらバグ掲示板に報告すべきことかもしれませんが多分自分の解釈違い。ウェイト目的ではなく無限ループでのビジー回避目的には使えない(NSDoEventsを使えってことかもしれない)。無限ループでのビジー回避目的なら面倒なんでNSExec("wait 1")でOK。
スポンサーサイト



ツールを使わない場合(FAM)

2009.11.24.Tue
せっかくだからツールを使わずinputで命令文を入力させる場合のを。

--ここから
NSExec("luasub penput2")

----------文字列の全角半角を判断する(全角なら2を、半角なら1を、""なら0を返す)
function getbyte(linestr)
  local rtnint
  local int0=NSGetIntValue(0)
  local getstr=string.sub(linestr,1,1)
----------cmpに入れるとエラーになりそうなものをあらかじめ排除
  if linestr=="" then
    return 0
  end
  if getstr=="," or getstr=='"' then
    return 1
  end
  
  function getbyte_cmp(cmpstr)
    NSExec('cmp %0,"'..getstr..'","'..cmpstr..'"')
    return NSGetIntValue(0)
  end
  function getbyte_judge()
    if getbyte_cmp("、")<0 or (getbyte_cmp("。")>=0 and getbyte_cmp("゚")<=0) then
      return 1
    end
    return 2
  end
  
  rtnint=getbyte_judge()
  NSSetIntValue(0,int0)
  return rtnint
end

function NSCOM_penput2()
  local rtnstr
  local str0=NSGetStrValue(0)
  NSExec('inputstr $0,"命令文、もしくはテキスト文を入力してください",2047,0')
  rtnstr=NSGetStrValue(0)
  NSSetStrValue(0,str0)
  
  if string.sub(rtnstr,1,1)==";" then
    return
  end
  if getbyte(rtnstr)==1 then
    NSExec(rtnstr)
  end
  if getbyte(rtnstr)==2 then
    NSExec('puttext "'..rtnstr..'"')
  end
end
--ここまで


全部luaで。htmlの見た目重視で本来タブを入れている所を全角スペース2つに置き換えているので、コピペする方は全角スペースをタブなり半角スペースなりに置換してください。
Nスクのスクリプトにpenput2と書くと命令文待ちになり、1文字目が半角なら命令文を実行、全角ならテキストを表示し、元のスクリプトに戻ります。
なにもせずに戻る時は1文字目が「;」の文を打ち込んでください。

上のスクリプトは最初の1文字が何バイト文字か返すgetbyte命令とメインの実行部分のpenput2命令。getbyte命令はpenput2命令で使うので一緒に書いてください。
getbyte命令は幻惑郷さん永字八法さんのところに書かれていた記事を元にそれっぽく。(※のちにこのままだと不完全だということがわかりましたんで、getbyte命令はこちらのを使ってください)
penput2命令はそのままだと使いにくいと思うので、NSExec(rtnstr)の後にNSUpdate()なりNSExec(print 1)を入れるなりいれるなど使う人が各自でいじってくださいな。

思いつかなきゃよかったかも(FAM)

2009.11.24.Tue
この間、通勤中に「Nスクでリアルタイムでスクリプト内容を実行させようとするなら命令文をNSExecで実行させていけばいいんじゃね?」などということを思いつきました。
今となってはinput命令で文字列を受け取ってNSExecに渡すルーチンで十分だったような気もしますが、なぜかその時は専用ツールにせねば! という気になりまして。
時間ないし、今はいいやと思って放っておいたのですが、連休中うっかり時間がたくさんあるような錯覚に陥り、昨日今日を目一杯使って作ってしまいました。
自分自身は使うつもりがないのに・・・。


こちらです。
詳しくはマニュアルに書いてありますが、要は起動中のNスクに任意の命令文を実行させることができるようになる、というツールです。

ペンぷろを作る過程で得たノウハウを使って作ってることもあってペンぷろと似ている部分もありますが、似て非なるものですね。
将来的にはペンぷっとの機能の一部をペンぷろでも使えるように調整すると思いますが。


このツールは自分自身で使う気がないので、自分からこれ以上機能追加するつもりはありません。
ただ、バグ報告や実現できそうな機能追加がありましたらできる限り動くつもりなので、なにかありましたらゆにたりのHPのBBSまでどうぞ。

仕事を優先して作業する予定だったのに(FAM)

2009.11.22.Sun
現実逃避のためにたまにペンぷろの作業もやったりもします。
うん、現実逃避っていいよね。
主目的にするより現実逃避の手段にした時のほうが進むのはなぜなんだろう。



通信手段としてのファイルを作成して云々ってことになったんで、エラー起こらないように調査。
ファイルの存在を監視、ファイル作成、ファイル読み、ファイル削除という流れでやり取りするんですが、以前試した時にたまに同時にアクセスする時にエラーが起きたことがあったんですよ。
その時は別の手段を使って事なきを得たのですが、今回はメインで使わなきゃならんので、そういうわけにもいかず。

以下その結果を残しとく。将来なんかの参考にするかもなので(自分が)。
・ファイルの存在を監視する分にはファイル作成、ファイル削除が同時に行われてても平気
・ファイルの読みとファイル削除が同時に行われるとやばい
・Nスクのファイル削除が高性能?


1、2番目より操作するファイルとは別にそのファイルを操作中か確認するためのファイルが必要ってことに。
3番目はNスクのファイル削除はなでしこ側のファイル削除より実行速度が明らかに速く、ファイルがない時に実行してもエラーが起きないから(なでしこのファイル削除はファイルがない時はエラーが起きる)。
あんまし活用する機会がなさそうだけど、Nスク→なでしこの通信速度が問題になりそうならなでしこで読み終わったあとになでしこでファイル削除せずにNスクにファイル削除を依頼するファイルを作ることにするかも。
一見迂遠なことやってるようにみえますが、(自分のパソコンのスペックでは)なでしこでファイル削除するのに1秒間以上かかり、なでしこ→Nスクでファイル作成→存在確認→削除の工程はその2~30倍の速度なので十分元が取れるのです。

なでしこの方のはwindowsのファイル削除機能を使って、Nスクの方は直接メモリをいじってる、とかそーいうことなのかしら。まあどうでもいいけど。

予想通り間に合いそうにない(FAM)

2009.11.17.Tue
23日締め切りのつもりで作ってきましたが、どうも間に合うペースではないです。
仕事の昼休み中にプログラムの見直しだけならできるけど、テストプレイまではできないから確実に今よりもペースが落ちるわけで。

月末締め切りの仕事があり、ペンぷろをアップさせてからやるつもりでしたが、先に仕事を仕上げてしまうことにします。
今のペースではペンぷろが月末までに上がったとしても仕事のほうが間に合う保証なくなってきたので。

ペンぷろアップするまではこたつ抜き等を自分に対する戒めにして引き続き作業をしていきます。

Lua、なんかめんどい(FAM)

2009.11.11.Wed
表をある列を引数にしてソートするとかって普通のことだと思うんだけど、Luaだとこーいうの自分で実装させるにも一苦労でした。
ん~、不安定ソートといえどもソート機能があるだけましなんだろーか。
Nスク単体だと表のソートどころかソート機能から自力で実装しなきゃだし。

以下、自分用メモ。

・tableはテーブルの名前に使っちゃダメ
 table.sortを使おうとして「nilを呼んじゃだめですよ~」とかよくわからんエラーが出続けていて困ってました。
 原因はその前の段階でtableという名前のテーブルを使っていたためtable.sortをtable["sort"]と解釈するようになったためと思われ。
 試してないけど同様にosだのioだのもテーブルの名前に使うとそれに関わる関数が使えなくなるんじゃないかと。
 ローカル変数にしておけばブロック外なら大丈夫かもしれんけど、最初から使わないほうがいい。
 どーせこうなるならこういうのも予約語として弾いてくれりゃいいと思うんだけど。

よくよく考えたら普通にゲーム作ってたらそこまで頻繁にスプライト番号を変更したいという場面もないのかも(FAM)

2009.11.10.Tue
スプライト番号についての挙動をきめました。

元のままの挙動は同じ立ち絵があれば反映ウインドウで反映させても表情が変わるだけということと、同じスプライト番号にスプライトを反映させたら前のは消すということ。
変える挙動は選択したスプライトのスプライト番号を変えて他のスプライトを踏んだときは警告をしてそれでもいいなら前のスプライトを消す、スプライト番号の扱える範囲を0~999にすること、ld命令のスプライト番号をNスクと同様に指定し取り扱うこと、立ち絵要素を1つのスプライト番号に描かれた1つの画像として上下位置を扱えるようにすること(複数のスプライトとして扱うのも可。自分のように元々複数の画像で立ち絵を表していたり、物を持たせたり腕を組んだりといったことをすること前提に立ち絵をわけて表示させている人いるかもだし)。

だいたいこんな感じ。意識して別のスプライトを同じスプライト番号にさせることはできず、Nスクと同様の挙動になるようにしました。
使っててだめだったらまた変えるかもですが。
いずれにしても確定したものをヘルプで説明しなおします。

頭で考える便利さと実際に扱う快適感(FAM)

2009.11.09.Mon
前回スプライト番号が同じでも表示できるようにする云々って書きましたが、実際使ってみると例えば背景を次から次へと表示させてみようとするときなんかは不要なスプライトがたまっていって不便ですね。
どうすればもっと直感的に扱えるか仕事中にでも考えてみることにします。

結果的にテキストにして2割ほど小さくなりました(FAM)

2009.11.06.Fri
ペンぷろのなでしこ部分のプログラムは何も知らない状態から書き始めたこともあり、えらくこんがらまった書かれ方がされていました。
処理スピードや可読性が向上することもあり、ペンぷろの仕様変更に合わせて新しい書き方に直してみたのですが、格段に見やすくなっただけでなく、予想以上にシェイプアップされてました。
今まで苦労して書いていた部分は贅肉ばかりだったのかとちょっと愕然。


●次回更新時の変更予定
・ファイル名等に別候補の物を設定できるように。
 昔ブログに書いていたもの。
 例えば、ファイル名に「truefile|dummy」と入力すると、まずファイル名を「truefile」としてファイルがあるか判定し、なければファイル名を「dummy」としてファイルがあるか判定します。
 ファイル名以外にNSA、パス、拡張子も同様に指定でき、上記のファイル名の指定と合わせて拡張子を「png|jpg」とすると、それぞれtruefile.png、dummy.jpgで判定、といった具合です。
 「A|B|C|D|・・・」というように何個でも候補を設定できますが、まあそんなにたくさん必要になることもないでしょう。
 ファイルができていない時の仮ファイルを使うとき等に役に立つかもしれません。
 これは実装済み。

・時間指定で画像が変わるように
 イメージとしては例えば、

200911060.jpg

 この状態で時間を夕方に指定すると

200911061.jpg

 このように勝手に画像が変わるようになります。
 時間以外にも天候等で立ち絵や背景の画像の色合いを変えたい場合に使うこともできます。
 指定例としては、ファイル名の指定を「chara1wwarai{時間:()/(yuugata)/(yoru)}」とし、時間の要素を「昼/夕方/夜」の3つとしておくと、時間が昼なら「chara1wwarai」を、夕方なら「chara1wwaraiyuugata」を、夜なら「chara1wwaraiyoru」をファイル名として画像が呼び出されます。
 時間という要素を変えると画面上の全部の画像が自動的に変わるので、時間は夜だけど昼用の立ち絵を立たせたい時は別個にファイルを指定してください。
 
 ・同じスプライト番号の画像を同時に画面に反映できるように
 仕様変更の類。
 まともにスプライト番号を指定する方法だとスプライト番号を変更した時にスプライト番号が被らないようにする処理だけでかなりスパゲッティなプログラムになる(なった)ので、今後はNスクに反映させるときはスプライト番号はソートして上下関係だけ利用して、実際の値は使わないことにしようかと。
 実際にプログラムするときはスプライト番号が被ると困るかもなので、後で設定で被りを禁止できるようにするかもですが、今はなしで。
 

内部的にはスプライトのグループ化だの履歴の利用だのできるようになってるんですが、インターフェイスを作るの面倒なので後回しに。
先日ファンキーファンクションさんと賭けをして早く更新しなくてはならなくなったので、再来週の日曜辺りに新しいバージョンをアップすることになると思います。
・・・前回更新時からNスク部分をあまりいじってないんで間に合うかわかりませんが。