C++ + Lua for WindowsでMetaluaを使う

C++へLuaを組み込んでいる場合にMetaluaを使用するやりかたがわかったのでメモしておきます。LuaはLua for Windowsの5.1.4を使っています。
ちなみにMetaluaというのは、Luaにマクロ等の拡張機能を追加できるものです。Lua for Windowsに最初から入っているのですぐ使用できます。

まずはMetaluaの文法に則ってスクリプトを書きます(とりあえず script.mlua とします)。このままでは実行出来ませんのでMetaluaでコンパイルします。コマンドプロンプトにて以下を実行します。

metalua script.mlua -o script.luac -v --no-runtime

※–no-runtimeパラメータは状況により付けたり付けなかったり

この”metalua”というのはLuaのインストール先にあるバッチファイルです。見つからないというエラーが出る場合はパスを通してください(Win7ならC:\Program Files (x86)\Lua とかですね)
パラメータ -o でコンパイル後のファイル名を決めています。-v は進捗状況を細かく見たいという指定です。

最後の –no-runtime ですが、これはコンパイル後のスクリプトが自動でMetaluaライブラリをロードしないようにするオプションです。これを付けないと、コンパイル後のスクリプトに require “metalua.runtime” が付加されます。その場合、今回はC++からLuaスクリプトを呼び出すという前提なので、C++側の実行ファイルと同じフォルダにMetaluaライブラリが一式揃っていないとエラーになってしまうので注意してください。もちろん、–no-runtimeを付けた場合は他の方法でMetaluaライブラリをロードしておく必要があります。自分はprecompiler.luaを使ってruntime.luaがロードしている3つのファイル(base.lua, string2.lua, table2.lua)をコンパイルしておきC++に組み込む形にしました。具体的にはLuaインストール先のluaフォルダで以下を実行します。

lua precompiler.lua -o metalua -l metalua/?.lua metalua/base.lua metalua/string2.lua metalua/table2.lua

するとmetalua.cとmetalua.hが生成されるのでC++プロジェクトに追加し、そのファイル内に定義されている関数をlua_open()の後くらいに実行することでライブラリをロードできます。

そしてmetaluaコマンドにより生成されたファイルを読み込み、luaL_loadbuffer(), lua_pcall()して無事実行できました。

Visual Studio 2008のインストーラでエラーが出る

Visual Studio 2008のディスクからコンポーネントを追加しようとインストーラを起動したら、
「セットアップ コンポーネントの読み込み時にエラーが発生しました。セットアップはキャンセルされます。」
というエラーメッセージが出てしまい先に進めなくなっていました。

Image1
こんな

この現象ですが私のPCでは、CDから直接インストーラを起動するのではなく、コントロールパネルの「プログラムの追加と削除」からVisual Studio 2008を選択することによりエラーを回避することができました。

原因はわからず。サービスパックあてたから、ではないですよねえ…

Google日本語入力のプライバシー関連の設定on/offを切り替えるAutoHotkeyスクリプト

いちいちダイアログ開いて項目探して、って毎回やるのが面倒だったので。

Google日本語入力プロパティダイアログの「プライバシー」タブにある2つのチェックボックスをクリックして終了します。チェック状態を取得してなにか判定したりはしてません。というかAutoIt3でチェックボックスのクラス名とか取得できなかったので諦めました。

#NoEnv
#WinActivateForce
SetKeyDelay,100
SendMode, Event

; コントロールパネル「地域と言語のオプション」を実行
Run, intl.cpl
WinWait, 地域と言語のオプション, , 5
WinActivate
Sleep,100
; 最初のタブじゃないと操作できない
ControlGet, tabid, Tab, , SysTabControl321
if (tabid != 1) {
    MsgBox, 最初のタブじゃない(1)
    return
}
; 「テキスト サービスと入力言語」ダイアログを開く
Send, ^{TAB}d
WinWait, テキスト サービスと入力言語,,5
; 最初のタブじゃないと操作できない
ControlGet, tabid2, Tab, , SysTabControl321
if (tabid2 != 1) {
    MsgBox, 最初のタブじゃない(2)
    return
}
; Google日本語入力が選択されてないといけない
ControlGetText, combotext, ComboBox1
if (combotext != "日本語 - Google 日本語入力") {
    MsgBox, Google日本語入力を使っていない
    return
}
; プロパティを開く
Send, !p
WinWait, Google 日本語入力 プロパティ, , 5
; 目的のタブページで設定切替
Send, ^{TAB}^{TAB}^{TAB}^{TAB}{TAB}{SPACE}{TAB}{SPACE}
; 確認して終了
Sleep, 1500
ControlSend, , {ENTER}, A
ControlSend, , {ESC}, A
ControlSend, , {ESC}, A

お絵描きとか

何かに使う?予定の絵を描いてました。
東方Project 霊夢


描きかけっす

ペンタブ握ってから12時間ほど経過しましたが全然終わりません…
しかしやっぱお絵かきは楽しい。

Visual Studioでブレークポイントが設定できなかったり

Visual Studio 2008でC++プログラムのデバッグをしようと思ったのですが、ブレークポイントを設定しても「!」マークになってしまい「ソースコードが元のバージョンと異なります」という表示が出てブレークできなくなりました。

リビルド、VS再起動を試すも解消せず。

で、結局ソースコードのコメントを少し変えるなどして保存しビルドし直したところ、なぜかまた無事ブレークするように…。

ファイルの文字コードを変更して保存したら解消したという例もあるみたいですがVSのバグなんでしょうか。
http://social.msdn.microsoft.com/Forums/ja/vcgeneralja/thread/eb1744d6-4304-45a2-a69c-502f826b1f40
VS2010は以前インストールしてみたんですがIDEの反応のもたつきが気になって使うのをやめてしまったので、まだ移行する気にはならず。。

Boost.Preprocessorを少しだけ使ってみる

使ったこと無いなーと思いまして、触り程度にちょっとだけ

例えば以下のように、ある一部分を除いてほぼ同じ内容の関数をたくさん定義しなきゃいけない場合


void test1() {
cout << "A" << endl; } void test2() { cout << "B" << endl; } …(以下延々と続く)… [/cpp] Boost.Preprocessorのリファレンスをだらだら眺めながら、以下のように書いてみました。 ちゃんと上記のように展開されるようです。 [cpp] #define SEQ1 (test1) (test2) (test3) (test4) #define SEQ2 (A) (B) (C) (D) #define MACRO(r,data,i,elem) \ void elem () { \ cout << BOOST_PP_STRINGIZE(BOOST_PP_SEQ_ELEM(i,SEQ2)) << endl; \ } BOOST_PP_SEQ_FOR_EACH_I(MACRO, _, SEQ1) [/cpp] BOOST_PP_SEQ_FOR_EACH_Iを使ってMACROをSEQ1の数だけ展開して、 そのMACROの中ではインデックスiを使ってSEQ2にアクセスする感じで。 STRINGIZEは、標準の#xみたいなやつですね。 今の自分には使う機会が思いつきませんが、いつか必要になった時のとっかかりになればという事で。

レーザーの先端を尖らせてみたり

今までレーザーをこういう長方形な形で描画していたんですが、

せっかくなので東方チックに先端を尖らせてみようと思い試してみました

けっこうきれい?

やってることはただの画像の拡縮なんですが、ちょっとしたことで見た目がかなり変わるんだなーと

Seleneでドットサイズ2倍で描画したい

ドット絵のドット感を目立たせたいがために、グラフィックの1ドットを画面上では2×2ドット(とかそれ以上)の大きさで描画したい。
最初から2倍に拡大した画像を作るというのも一つの手ですが、あとから3倍に拡大表示したくなったりしそうです。例えばStudio PixelさんのGuxt(ガスト)というゲームでは1~5倍まで好きな拡大率を選ぶことができます。

ということで今回は、現在使用中のゲーム用ライブラリSeleneにて、320×240の解像度で描画したものを2倍に拡大して640×480で画面に出力する方法を書いてみようと思います。今回描画するものは2Dスプライトのみですが、ほかのもの(線とか)も同じやり方でなんとかなると思います。

※現在Seleneのサイトがいろいろとリンク切れしているみたいですが、ファイル自体は存在するみたいです。
 Seleneライブラリは http://www.moon.sakuraweb.com/download/SeleneSDK-01.24l.exe からダウンロードできます。

Continue reading →

製作中のゲームについて

今作っているものは、東方プロジェクト(©上海アリス幻樂団)の二次創作縦シューティングゲームです。だんだんゲームの方向性が固まってきたので、先日動作テスト版を公開してみました。

以下のサイトで公開しています。
http://voidproc.com/

Windows専用アプリケーションです。細かな説明は同サイトまたはアーカイブ内のreadme.txtに書いてありますのでそちらをどうぞ。

まだまだ開発途中でして、現在は1面END/BGM等いろいろ無かったりしますが、ご感想や不具合報告などいただけるとうれしいです。

ブログはじめました

現在、Windows向け自作ゲーム(2Dシューティング)を製作しています。
このブログでは、その製作状況とか技術的な事を記録していこうと思います。
C++とLuaを使って製作中なので、主にそのあたりの話題になるかと。