自己紹介

低層をがむしゃらに走る自称プログラマ ちょっとWebとかに手を出してる

ブログ アーカイブ

2010年10月29日金曜日

運命の明日

冬コミ合否は明日です
うっほ!うっほーう!っほお11!11

売かっても受かってなくても、
来年の頭くらいには、変なものをなんとか提供する予定ですけど
受かって欲しい、というか、受かってくれ!

2010年10月20日水曜日

結論

勘 違 い で す
日本語はLuaInterfaceでも使えました

先日出したあのソースは確かにCallで失敗していました
結局それは治りませんでしたがそんなことは良かったのです

LuaInterfaceで動いたからイイノデス!


LuaInterfaceで日本語を使う方法は簡単な事だった。

'日本語を書き込むところの処理
            If (System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(_targetFullPass)) = True) Then
                System.IO.File.WriteAllText(_targetFullPass, Writestr, System.Text.Encoding.GetEncoding("shift_jis"))
            Else
                Dim GrfPath As String = New System.IO.FileInfo(URLTextBox.Text).Directory.Name
                System.IO.Directory.CreateDirectory(_exeurl + "\scripts\GraphicScripts\" + GrfPath + "\")
                System.IO.File.WriteAllText(_targetFullPass, Writestr, System.Text.Encoding.GetEncoding("shift_jis"))
            End If

まぁ説明もなしなんでどうかと思うんですが
ようは.GetEncoding("shift_jis")ですよ.GetEncoding("shift_jis")

前まで、ここの
.GetEncoding("shift_jis")

.GetEncoding("EUC_jp")
だったんですよねー

ニホチニヒホリみたいな文字化けしてたんで
おかしいなーとか心の浅いところで思ってたんだけど
LuaInterfaceのせいにしてたよ俺

最低だ……

あ、ちなみに前にも書いたけど
LuaInterfaceでの記述はこんな感じね、
最新版じゃなくてちょっと古いやつを使っているよ

'存在している場合
            Dim L As New LuaInterface.Lua
            'LUA読み取り
            L.DoFile(full)
            'LUAのGraphicSettingを格納
            Dim func As LuaInterface.LuaFunction = L.GetFunction("GraphicSetting")
            '関数呼び出し
            Dim a = func.Call()
            '関数の戻り値を格納
            HelpTextBox.Text = a(0)
            TypeComBox.SelectedIndex = a(1)
            AllNumNmBox.Text = a(2)
            XNumNmBox.Text = a(3)
            YNumNmBox.Text = a(4)
            XSizeNmBox.Text = a(5)
            YSizeNmBox.Text = a(6)

2010年10月19日火曜日

ぐぬぬ(メモ)

LuaInterfaceだと日本語読めないよといわれたから
仕方ないからTaoを使うようにした

そしたらどうもCallがうまいこといかない

            '存在している場合
            Dim L As New System.IntPtr

            L = Tao.Lua.Lua.luaL_newstate()
            Tao.Lua.Lua.lua_open()

            'LUA読み取り
            Tao.Lua.Lua.luaL_openlibs(L)

            If Tao.Lua.Lua.luaL_loadfile(L, full) Then
                Dim str = Tao.Lua.Lua.lua_tostring(L, 1)
                MessageBox.Show(str, "err")
            End If

            Dim top = Tao.Lua.Lua.lua_gettop(L)

            '関数名Push
            Tao.Lua.Lua.lua_getglobal(L, "GraphicSetting")

            '関数呼び出し(ここでNULLがかえる)
            If Tao.Lua.Lua.lua_pcall(L, 0, 7, 0) Then
                Dim str = Tao.Lua.Lua.lua_tostring(L, 1)
                MessageBox.Show(str, "err2")
            End If
            '関数の戻り値を格納

            Dim a = Tao.Lua.Lua.lua_tostring(L, 1)
            Dim b = Tao.Lua.Lua.lua_tointeger(L, 2)
            Dim c = Tao.Lua.Lua.lua_tointeger(L, 3)
            Dim d = Tao.Lua.Lua.lua_tointeger(L, 4)
            Dim f = Tao.Lua.Lua.lua_tointeger(L, 5)
            Dim g = Tao.Lua.Lua.lua_tointeger(L, 6)
            Dim h = Tao.Lua.Lua.lua_tointeger(L, 7)

            'HelpTextBox.Text = Tao.Lua.Lua.lua_tostring(L, 0)
            'TypeComBox.SelectedIndex = Tao.Lua.Lua.lua_tointeger(L, 1)
            'AllNumNmBox.Value = Tao.Lua.Lua.lua_tointeger(L, 2)
            'XNumNmBox.Value = Tao.Lua.Lua.lua_tointeger(L, 3)
            'YNumNmBox.Value = Tao.Lua.Lua.lua_tointeger(L, 4)
            'XSizeNmBox.Value = Tao.Lua.Lua.lua_tointeger(L, 5)
            'YSizeNmBox.Value = Tao.Lua.Lua.lua_tointeger(L, 6)

            Tao.Lua.Lua.lua_settop(L, top)

2010年10月18日月曜日

四苦八苦

VB.netマルチスレッドで動かしているプログラムで

DX.GetMouseInput()

を利用できない。
私の書き方が悪いのか、なんか良く解らんが困った。

とりあえず、
WinAPIのGetAsyncKeyStateで代用

同時に問題が発生。
DX.GetMouseInput()
の場合、当然だがウィンドウ内でクリックされた時に
「ボタンが押されたよ」と返事が来るわけだが、

GetAsyncKeyStateの場合は
画面上でなくても「ボタンが押されたよ」と返事が来る。

そこで、DXライブラリによって生成されたWindowが
Active状態でのみ判定を起こすことにした

DX.GetWindowActiveFlag()

かなりブサイクな挙動だけどできたー!やったー!


'マウス左クリック
        If DX.GetWindowActiveFlag() Then
            If GetAsyncKeyState(Keys.LButton) Then
                _Mouse = DX.MOUSE_INPUT_LEFT
            End If
        End If

2010年10月17日日曜日

小言

しらなんだ、DXライブラリは、VB.netでも動くんだ
これで色々と楽になりそう。

使い方
1.公式からC#のDXライブラリを取ってくる
2.VSでDXライブラリを使いたいプロジェクトを開く
3.プロジェクト→参照の追加
4.参照を追加→DXLibDotNet.dllを参照する
5.Releaseフォルダ及びDebugフォルダに
(VisualStudioフォルダのProject→開いたプロジェクト→bin)
DxLib.DLLを入れる
6.Imports DxLibDLL と入れて
あとはDX.と入力するとインテリジェンス君が色々教えてくれる

実際使ってみると
Formとは別窓にウィンドウが出ます
素敵!

2010年10月14日木曜日

考えてること

突然なんですが、


今度の冬コミに出すのは、(出れればの話だが)
「うさぎは絵本の中の~」の体験版ではなく、

うさぎは絵本の中の~を作るための勉強として作っている
ある意味習作を、出せればと思っています。

というか絶賛製作中です。

ーーー

今回は、ジオメトリーウォーズ風なシンプルな形で、
360度のSTGで、プチプチ敵を倒せるようにしたいと考えてます。

それと、今回は、誰でもが自機や敵を作れればいいなー、
という事をコンセプトに、のそのそと作っております。
今月末あたりから、スクリーンショットを上げれる形に
仕上げられればいいかな、と計画しています。

ががが、がんばります!

ーーー

はい、思い出しました。
今年の4月にコメントがきていたことを…。

内容は、Box2DのDebugDrawがうまく動かないという事でした。
Box2Dのバージョンは2.0.1。

C++の場合です。

Box2DのDebugDrawを使用するためには、前提としてまず
「b2DebugDraw」クラスを継承したクラスを作る必要があります。

http://www.linuxuser.at/elements/doc/box2d/classb2_debug_draw.htm

b2DebugDrawクラス


enum  {
  e_shapeBit = 0x0001, e_jointBit = 0x0002, e_coreShapeBit = 0x0004, e_aabbBit = 0x0008,
  e_obbBit = 0x0010, e_pairBit = 0x0020, e_centerOfMassBit = 0x0040
}


上記Enumは簡単に言えば
DebugDrawで何を描画するかというフラグです。


virtual void DrawPolygon (const b2Vec2 *vertices, int32 vertexCount, const b2Color &color)=0
Draw a closed polygon provided in CCW order. 
virtual void DrawSolidPolygon (const b2Vec2 *vertices, int32 vertexCount, const b2Color &color)=0
Draw a solid closed polygon provided in CCW order. 
virtual void DrawCircle (const b2Vec2 &center, float32 radius, const b2Color &color)=0
Draw a circle. 
virtual void DrawSolidCircle (const b2Vec2 &center, float32 radius, const b2Vec2 &axis, const b2Color &color)=0
Draw a solid circle. 
virtual void DrawSegment (const b2Vec2 &p1, const b2Vec2 &p2, const b2Color &color)=0
Draw a line segment. 
virtual void DrawXForm (const b2XForm &xf)=0
Draw a transform. 


それからこれは「virtual」ですから、抽象メソッド(仮想関数)です。
抽象メソッドは、別クラスによって継承しなければ使用することができません

そのため、このb2DebugDrawクラスを継承させる必要があります…

class DebugDraw : public b2DebugDraw
{

public:
 void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color);
 void DrawPolygon(const b2Vec2& center, const b2Vec2* vertices, int32 vertexCount, const b2Color& color);
 void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color);
 void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color);
 void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color);
 void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color);
 void DrawXForm(const b2XForm& xf);
};


こんな感じです:-)
内容に関しては、私の場合DXライブラリを使っていろいろやってます。


void DebugDraw::DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color)
{
 int mode;//一時BLEND記録領域
 int parm;//一時BLENDパラメータ記録領域
 GetDrawBlendMode(&mode,&parm);
 
 SetDrawBlendMode(DX_BLENDMODE_NOBLEND,128);

 int i = 1;

 for(; i < vertexCount; i++)
 {
  DrawLine(static_cast(vertices[i-1].x * global::SCALE),static_cast(vertices[i-1].y * global::SCALE),
     static_cast(vertices[i].x * global::SCALE),static_cast(vertices[i].y * global::SCALE),
     GetColor(static_cast(255*color.r),
        static_cast(255*color.g),
        static_cast(255*color.b)));
 }
 
 DrawLine(static_cast(vertices[0].x * global::SCALE),static_cast( vertices[0].y * global::SCALE),
    static_cast(vertices[i-1].x * global::SCALE),static_cast( vertices[i-1].y * global::SCALE),
    GetColor(static_cast(255*color.r),
       static_cast(255*color.g),
       static_cast(255*color.b)
       ));
 
 SetDrawBlendMode(mode,parm);
}

DrawPolygonに関してはこんな感じです
注釈すくなく、さらにきたなくてすんません。
さらに言えばタグがひどい(w

さて、これをVirtualがあるだけやっていくと
とりあえずはDebugDrawは動く状態になります。

ーーー

実際に使う際はこうです

DebugDraw* debug = new DebugDraw();

 debug->SetFlags( 0xFFFF );

 global::boxglobal::g_world->SetDebugDraw(debug);


0xFFFF の部分には、上記の enum を入れましょう

debug->e_***

という感じで、複数指定したいときは

debug->e_*** + debug->e_***

で問題ありません。


そんなもんです、はい。
それじゃあ今日のところは終わり

2010年10月11日月曜日

.netからLUAの呼び出し

お久しぶりです、そろそろ適当ノリが良くなってきたので
個人的な事をひたすら書き連ねていきたいと思います

ちょっとした理由から、VB.netからLuaを呼び出す必要が出た(というかそのほうが楽だった)
ので、色々と調べてみた所、呼び出すことは可能なようだったのでメモ書き

VBからLUAを呼び出すには
LuaInterface.dllが必要

luainterface-2.0.1.zip

中のLuaとLuaInterfaceのdllをとりあえず
プロジェクトファイルにでも突っ込む

次にVisualStudioのプロジェクト
参照の追加
LuaInterface.dllを追加する

でとりあえずLuaDLLが使える状態になる

---------------------

'関数を呼び出し、5つの戻り値を各TextBoxに格納するのだ

'Luaクラスをインスタンス化
 Dim L As New LuaInterface.Lua


'fullはLuaファイルへのフルパスが格納されている
L.DoFile(full)


'GetFunctionメソッドでLuaメソッドを、func(LuaFunctionクラス)に格納
Dim func As LuaInterface.LuaFunction = L.GetFunction("GraphicSetting")


'関数を呼び出す
Dim a = func.Call()


'各戻り値が a() に格納される、
'それをTextBoxに入れる作業…


AllNumTextBox.Text = a(0)
XNumTextBox.Text = a(1)
YNumTextBox.Text = a(2)
XSizeTextBox.Text = a(3)
YSizeTextBox.Text = a(4)

---------------------

こんな感じで
VB.netでLuaの呼び出しが出来ました
最新版のLuaInterface.dllは使い方がよくわからなかったので、触ってません
大分使い方が違うよう?でしたが…
以下のサイトを参考にさせていただきました


http://blog.cnu.jp/2008/11/18/csharp%E3%81%ABlua%E3%82%92%E7%B5%84%E3%81%BF%E8%BE%BC%E3%82%80/#more-163 http://blog.livedoor.jp/akf0/archives/51607378.html