2018年11月04日

wxLuaApp 開発中:完成度はイマイチだが一応使える

 GitHub - wxLuaApp の件。実用アプリが開発できるかどうか、試してみた。こんな感じです。見る人が見れば、何を作ってるかわかると思う。

20181104-1.png

 本気でアプリを作り始めると、wxLua の未完成なところがいろいろ見えてきた。公式の開発チームは開店休業状態で、ゲリラ的に開発されている状態だからなあ。

  • wxWidgets 3.0.x で一応ビルドできるのだが、これだと 3.0 以降の機能が使えないことがある。コンパイルの条件が wxCHECK_VERSION(3,1,1) で書かれているため。いったん一括変換で wxCHECK_VERSION(3,0,0) に変えたあと、3.0 でコンパイルエラーを起こすところを手動で修正した。
  • wxPointx, y をフィールドのようにアクセスできるのだが、wxSizewxRect は関数を使わないとメンバにアクセスできない。
    pt = wx.wxPoint(2, 3); print(pt.x) -- "2"
    sz = wx.wxSize(2, 3); print(sz.width) -- エラー
    rc = wx.wxRect(2, 3, 10, 20); print(rc.x) -- エラー
    print(sx:GetWidth(), rc:GetX()) -- どちらも OK
    
    これらのクラスは wxcore_gdi.cpp で定義されている。上記の不統一は、別に本質的な理由があるわけではなくて、単に実装されていないだけだった。
  • wx.wxPoint じゃなくて wx.Point でよかったんじゃないの?と思うのだが、これは今さら変えられないかな。
  • wx.wxBLACK_PEN はあるけど wx.wxBLUE_PEN はないとか、他にも不統一はいろいろありそう。
  • wx.wx**** クラスのオブジェクトにフィールドを追加する(インスタンス変数みたいなもの)ことはできるけど、nil が入れられない。
    sz = wx.wxSize(2, 3)
    sz.field = 1; print(sz.field) -- "1"
    sz.field = nil; print(sz.field) -- "Unable to call an unknown method 'field' on a 'wxSize' type.
    
    これは Lua のメタテーブルの仕様なのかな。false か何かで代用するしかないか。

 いろいろ不十分ではあるけど、悪くないですよ。Mac ではアプリ本体が 25 MB ぐらいで、あとはスクリプトとアイコンの画像ファイルだけ。LuaJIT なので、いざとなったら C のライブラリ関数を呼べる。上で試作中のアプリでも、バイナリファイルを読むために memmove() などを使ったりしている。

Posted at 2018年11月04日 10:37:13
email.png