2018年10月28日

wxLuaApp 開発中:Love2D っぽく使えるようになった

 GitHub - wxLuaApp をぼちぼちと開発中。いろいろと忙しくてなかなか進まんけど、こんな感じになってます。

20181028-1.png

 コードの方は、wxmain.lua, Document.lua, Controller.lua の3ファイルを1つのフォルダに入れて、このフォルダを wxLuaApp のアプリケーションに Drag&Drop する。Love2D と同じようなスタイル。

-- wxmain.lua
require "Document"

function LuaApp.OpenDocument(file)
  local doc = Document.new(file)
end

function LuaApp.NewDocument()
  LuaApp.OpenDocument(nil)
end
-- Document.lua
require "Controller"

--  Class definition
Document = {}
Document.untitled_count = 0

function Document.new(filename)
  local doc = {}
  setmetatable(doc, { __index = Document } )
  local bname
  if filename == nil then
    bname = string.format("Untitled %d", Document.untitled_count)
    Document.untitled_count = Document.untitled_count + 1
  else
    bname = filename
  end
  doc.controller = Controller.new(doc, bname)
  return doc
end
-- Controller.lua
--  Class definition
Controller = {}

function Controller.new(doc, bname)
  local cont = {}
  setmetatable(cont, { __index = Controller } )
  cont.document = doc
  --  Create frame
  local frame = wx.wxFrame(wx.NULL, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxSize(640, 400))
  frame.controller = cont
  frame:SetTitle(bname)
  cont.frame = frame
  cont.scrollwin = wx.wxScrolledWindow(frame, wx.wxID_ANY)
  cont.scrollwin:SetScrollbars(1, 1, 640, 400)
  cont.panel = wx.wxPanel(cont.scrollwin, wx.wxID_ANY, wx.wxDefaultPosition, wx.wxSize(640, 400))
  cont.panel:Connect(wx.wxEVT_PAINT, function (event) cont:OnPaint(event) end)
  frame:Show(true)
  return cont
end

function Controller.OnPaint(self, event)
  local dc = wx.wxPaintDC(self.panel)
  dc:DrawLine(0, 0, 640, 400)
  dc:delete()
end

 実際にコーディングしてみると、ピリオドとコロンの間違いでしょっちゅう引っかかる。これは Python や Ruby にはないストレス。要は「なんちゃってオブジェクト指向」の悲しさだな。「Lua の良さ」を引き出すには、「処理速度」と「組み込み向け」の特徴を生かさないといけない。つまり、重い処理を Lua で書いて、「C++ 使わなくてもここまでできるでしょ?」と見せつけるのと、単体のアプリをそこそこのサイズ(実行形式で 200 MB とかじゃなくて)で作ってみせること。

Posted at 2018年10月28日 12:28:13
email.png