2013年10月31日

ツールでlua その3

ところで、対話形式で lua を使いたい時に、変数の中身を表示させるにはどうすればいいんでしょう?
たとえば変数 a の中身を見たい時に、わざわざ print(a) と打つのではなく、Python みたいに
a と打つだけで中身が表示されてほしいわけです。「必ず変数名が単独で入力される」という前提なら、

char line[256];
gets(line);
lua_getglobal(ls, line);
printf("%s", lua_tostring(ls, -1));

でも一応出来ますが、さすがに
a+2
とか
a[1]
とかって入力に対処できないのはひどすぎます。
luaL_dostring("a+2"); を実行した後にスタックトップに式の評価結果が
残っていてくれてれば話は早いのですが…

と思ったら、lua の i オプションでそういうことができるらしいです。
lua のソースを見てみたところ、luac.c にそれっぽいソースがありました。
lua を -i で起動すると args[has_i] に 1 が入ります。さらに追って行くと
dotty() という関数に行き着きました。どうやらここのソースを見れば目的の機能が
実現できるみたいです。みてみたら、やはり実行後にスタックに値が残っているみたいですね。
実行前のスタックサイズを 0 と仮定して、実行後にスタックにある値吐き出すようになっているみたいです。
今度、実際に試してみることにします。
posted by JUNOSOFT at 00:04| Comment(0) | プログラミング

2013年10月29日

ツールでlua その2

(つづき)

たとえば、ツール起動時に、DLL 側には編集画面を描画するためのウィンドウハンドルを渡します。
以後、編集中のアニメなんかは DirextX なり OpenGL なりを使い、指定されたウィンドウに対して描画します

ユーザーが編集画面内のある点をクリックして、部品を選択した場合は、その操作を lua スクリプトという形に変換して、それを DLL に渡して処理させます。たとえば、100, 120 をクリックしたなら

DoCommand("select_object_at(100, 120)");

のように。さらにそれをドラッグして 200, 160 に移動したなら、

DoCommand("move_object(200, 160)");

のようにします。
この方法の利点は、ユーザーの操作をすべてテキスト形式で記録しておく、ということが極めて自然に実現できるということです。マクロを作るのも簡単です。上記操作を一度にやりたければ、各命令の後ろに改行またはセミコロンを追加して

DoCommand(
"select_object_at(100, 120)\n"
"move_object(200, 160)");

などとすれば OK ですから。結構便利に使っていますよ〜

(微妙に続く)
posted by JUNOSOFT at 00:32| Comment(0) | プログラミング

2013年10月27日

ツールでlua

ツールはすべてコマンド文字列で操作できるようにしておき、(つまり対話型CUIでつくる)
それに GUI の皮をかぶせたら楽ができるのでは…と考えたのは数年前。

ツールの核となる部分は C++ でサクサク作りたい。
ツールの GUI は C# でサクサク作りたい。ならばどうすればよいか。
と考えたときに、核心部分をDLL化しておき、C# でつくったツール側からそれを呼び出せばよいという結論になりました。

さらに DLL に対する処理要求はすべて lua プログラム文字列という形で渡します。
DLL のインターフェースは、初期化、lua文字列を受け取って実行、内部状態を取得、内部状態を描画、終了処理。
ツール側で機能を増やしても、DLL のインターフェースを変える必要はなく、DLL 側に渡す lua 命令を修正するだけです

(つづく)
posted by JUNOSOFT at 07:55| Comment(0) | プログラミング

2013年10月23日

コマンドライン引数lua

ちょっとしたツールを作る場合、GUIをつけるのは面倒なので CUI のみで作っていたのですが、
コマンドライン引数の解析が面倒だし、どうせ自分しか使わないのでかなり適当な解析をしていました。

で、そういうのは lua に任せればいいじゃないかということに気づいてしまったのです。
コマンドライン引数の解析には getopt などがありますが、自分がいつも使っている lua で
実装したほうが楽だったのです。というわけで、これまでは

mytool.exe dest.dat src.dat

などとしていたものは、

mytool.exe arg("dest.dat", "src.dat")

となり、このコマンドライン引数をそのまま lua_dostring に渡せばよいということになります
ツール側には arg という関数を登録していれば OK と。あるいは単に

mytool.exe arg={"dest.dat", "src.dat"}

などとして lua_dostring した後に、lua_getglobal で arg の中身を得る、でもよいと。
...うん、まあ getopt 使っとけって話ですね
posted by JUNOSOFT at 00:14| Comment(0) | プログラミング

2013年10月21日

止まらない

131021.jpg

現在秒間47億枚ぐらい……しかし兵籐会長の「足らんわっ……まるで……!!」というあの気分。
まぁ、たまに見ては買えそうな物を買ってるだし、何がどうって事も無いんですけどね。


※なんのこっちゃ?という人へ
Cookie Clickerでググってはいけません。いけませんったらイケマセン。
posted by JUNOSOFT at 01:19| Comment(0) | 雑談

2013年10月18日

アクセント記号付きのアルファベット


とあるフリーの辞典ソフト向けに配られている外国語辞書データを調べていたんですが、そのテキスト形式のデータはSJIS と Latin-1 が混在していたので最初はすごく戸惑いました。テキストエディタをどう設定しても文字化けが解消されないぞと。というか Latin-1 なんてまったくなじみがないですよね。バイナリエディタで文字コード調べて、ようやく気がつきました。

見出し文字や例文などはアクセントやウムラウトつきのアルファベットに対応する為に Latin-1 コードで、日本語での解説部分は SJIS になっていたのです。というわけで、欧州言語の基本的な文字コードは Latin-1 です。覚えておくことにします。

イラっとしたので、例の辞書データは Python スクリプトで一括処理し、全部 UTF-8 に統一してやりました。すっきりです。あとは入力文章に出現した単語に対応する日本語説明文を並べて表示するだけで、簡易直訳ツールの出来上がりです。なんせ翻訳ツールによっては、下手に日本語らしい文章にしようと努力されるよりも、直訳で表示してくれた方がよほど分かりやすい場合がありますから…

posted by JUNOSOFT at 15:43| Comment(0) | プログラミング

2013年10月13日

プログラム用フォント

突然ですが、フォントの美しさというのは、開発意欲に少なからず影響を与えると思っています。
きたないフォントだとやる気もなくなりますからね。
ところがプログラムに使えるフォントとなると、それは自動的に固定ピッチフォントになるわけで、あまり数がないんですよね。
そのうえ日本語にも対応してないといけませんし。読みやすさも考えると結局 MSゴシック, Consolas, Lucida, ぐらいしか選択肢がありません。

そんなわけで、メイリオを固定ピッチ化したという救世主的なフォントの登場です。

http://jutememo.blogspot.jp/2013/03/windows-meiryoke-mactype.html

しかしこれ、自分の環境 WinXP+VC2008 では快適に使えてたのに、WinXP/Win7+VC2010 だと文字が表示されないという問題がありました。
さらに Win7 で使ってみようとしたらフォントがうまく生成されなかったという…. VC2012 ではそのへんどうなっているのでしょうか。
プログラマ向け日本語フォントは難しいですね。
posted by JUNOSOFT at 20:44| Comment(0) | プログラミング

2013年10月09日

頂点カラー

これまで頂点には D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1 を使っていたのですが、
2Dゲームを作っていると、四角形ポリゴンの4頂点には全て同じ頂点カラーを適用することがほとんどです。
そうしないのはグラデーションを作りたいときぐらいですから。そうすると、頂点ごとに個別のカラー設定をしているのが無駄に思えてきます。
実際そのせいで1頂点に付き4バイトが消費されているわけで、わざわざ各頂点ごとにカラー情報をもたせる必要はないよな、
ということで D3DFVF_DIFFUSE を頂点定義から外し、D3DTSS_CONSTANT / D3DTA_CONSTANT で定数色を設定するようにしました。

ところが、これでつくったプログラムを配布したとところ、なんか表示がおかしいという報告がいくつもありました。
D3DTSS_CONSTANT が使えるかどうかを判別するには D3DPMISCCAPS_PERSTAGECONSTANT を使うのですが、
どうやら思った以上にサポートしていない環境が多いみたいです。

http://www.kludx.com/capability.php?capability=97

で、よくよく考えてみれば D3DTSS_CONSTANT はマルチテクスチャ用なわけで、
マルチテクスチャ使わないなら素直に D3DRS_TEXTUREFACTOR / D3DTA_TFACTOR を使っておけばよかったんですね。
一件落着。
posted by JUNOSOFT at 16:08| Comment(0) | プログラミング