自己紹介

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

ブログ アーカイブ

2010年10月29日金曜日

運命の明日

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

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

2010年10月20日水曜日

結論

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

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

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


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

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

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

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

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

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

最低だ……

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

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

2010年10月19日火曜日

ぐぬぬ(メモ)

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

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

  1. '存在している場合  
  2. Dim L As New System.IntPtr  
  3.   
  4. L = Tao.Lua.Lua.luaL_newstate()  
  5. Tao.Lua.Lua.lua_open()  
  6.   
  7. 'LUA読み取り  
  8. Tao.Lua.Lua.luaL_openlibs(L)  
  9.   
  10. If Tao.Lua.Lua.luaL_loadfile(L, full) Then  
  11.     Dim str = Tao.Lua.Lua.lua_tostring(L, 1)  
  12.     MessageBox.Show(str, "err")  
  13. End If  
  14.   
  15. Dim top = Tao.Lua.Lua.lua_gettop(L)  
  16.   
  17. '関数名Push  
  18. Tao.Lua.Lua.lua_getglobal(L, "GraphicSetting")  
  19.   
  20. '関数呼び出し(ここでNULLがかえる)  
  21. If Tao.Lua.Lua.lua_pcall(L, 0, 7, 0) Then  
  22.     Dim str = Tao.Lua.Lua.lua_tostring(L, 1)  
  23.     MessageBox.Show(str, "err2")  
  24. End If  
  25. '関数の戻り値を格納  
  26.   
  27. Dim a = Tao.Lua.Lua.lua_tostring(L, 1)  
  28. Dim b = Tao.Lua.Lua.lua_tointeger(L, 2)  
  29. Dim c = Tao.Lua.Lua.lua_tointeger(L, 3)  
  30. Dim d = Tao.Lua.Lua.lua_tointeger(L, 4)  
  31. Dim f = Tao.Lua.Lua.lua_tointeger(L, 5)  
  32. Dim g = Tao.Lua.Lua.lua_tointeger(L, 6)  
  33. Dim h = Tao.Lua.Lua.lua_tointeger(L, 7)  
  34.   
  35. 'HelpTextBox.Text = Tao.Lua.Lua.lua_tostring(L, 0)  
  36. 'TypeComBox.SelectedIndex = Tao.Lua.Lua.lua_tointeger(L, 1)  
  37. 'AllNumNmBox.Value = Tao.Lua.Lua.lua_tointeger(L, 2)  
  38. 'XNumNmBox.Value = Tao.Lua.Lua.lua_tointeger(L, 3)  
  39. 'YNumNmBox.Value = Tao.Lua.Lua.lua_tointeger(L, 4)  
  40. 'XSizeNmBox.Value = Tao.Lua.Lua.lua_tointeger(L, 5)  
  41. 'YSizeNmBox.Value = Tao.Lua.Lua.lua_tointeger(L, 6)  
  42.   
  43. Tao.Lua.Lua.lua_settop(L, top)  

2010年10月18日月曜日

四苦八苦

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

DX.GetMouseInput()

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

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

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

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

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

DX.GetWindowActiveFlag()

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


  1. 'マウス左クリック  
  2.         If DX.GetWindowActiveFlag() Then  
  3.             If GetAsyncKeyState(Keys.LButton) Then  
  4.                 _Mouse = DX.MOUSE_INPUT_LEFT  
  5.             End If  
  6.         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クラスを継承させる必要があります…

  1. class DebugDraw : public b2DebugDraw  
  2. {  
  3.   
  4. public:  
  5.  void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color);  
  6.  void DrawPolygon(const b2Vec2& center, const b2Vec2* vertices, int32 vertexCount, const b2Color& color);  
  7.  void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color);  
  8.  void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color);  
  9.  void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color);  
  10.  void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color);  
  11.  void DrawXForm(const b2XForm& xf);  
  12. };  

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


  1. void DebugDraw::DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color)  
  2. {  
  3.  int mode;//一時BLEND記録領域  
  4.  int parm;//一時BLENDパラメータ記録領域  
  5.  GetDrawBlendMode(&mode,&parm);  
  6.    
  7.  SetDrawBlendMode(DX_BLENDMODE_NOBLEND,128);  
  8.   
  9.  int i = 1;  
  10.   
  11.  for(; i < vertexCount; i++)  
  12.  {  
  13.   DrawLine(static_cast<int>(vertices[i-1].x * global::SCALE),static_cast<int>(vertices[i-1].y * global::SCALE),  
  14.      static_cast<int>(vertices[i].x * global::SCALE),static_cast<int>(vertices[i].y * global::SCALE),  
  15.      GetColor(static_cast<int>(255*color.r),  
  16.         static_cast<int>(255*color.g),  
  17.         static_cast<int>(255*color.b)));  
  18.  }  
  19.    
  20.  DrawLine(static_cast<int>(vertices[0].x * global::SCALE),static_cast<int>( vertices[0].y * global::SCALE),  
  21.     static_cast<int>(vertices[i-1].x * global::SCALE),static_cast<int>( vertices[i-1].y * global::SCALE),  
  22.     GetColor(static_cast<int>(255*color.r),  
  23.        static_cast<int>(255*color.g),  
  24.        static_cast<int>(255*color.b)  
  25.        ));  
  26.    
  27.  SetDrawBlendMode(mode,parm);  
  28. }</int></int></int></int></int></int></int></int></int></int></int></int></int></int>  

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

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

ーーー

実際に使う際はこうです

  1. DebugDraw* debug = new DebugDraw();  
  2.   
  3.  debug->SetFlags( 0xFFFF );  
  4.   
  5.  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が使える状態になる

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

  1. '関数を呼び出し、5つの戻り値を各TextBoxに格納するのだ  
  2.   
  3. 'Luaクラスをインスタンス化  
  4.  Dim L As New LuaInterface.Lua  
  5.   
  6.   
  7. 'fullはLuaファイルへのフルパスが格納されている  
  8. L.DoFile(full)  
  9.   
  10.   
  11. 'GetFunctionメソッドでLuaメソッドを、func(LuaFunctionクラス)に格納  
  12. Dim func As LuaInterface.LuaFunction = L.GetFunction("GraphicSetting")  
  13.   
  14.   
  15. '関数を呼び出す  
  16. Dim a = func.Call()  
  17.   
  18.   
  19. '各戻り値が a() に格納される、  
  20. 'それをTextBoxに入れる作業…  
  21.   
  22.   
  23. AllNumTextBox.Text = a(0)  
  24. XNumTextBox.Text = a(1)  
  25. YNumTextBox.Text = a(2)  
  26. XSizeTextBox.Text = a(3)  
  27. 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