質問内容
lua言語でc++ の物理演算ライブラリのBox2Dを利用したいのですがエラーの対処方法わかりません。
ChatGDPを参考に行ったのですがそもそも含まれていない等の原因はどこで間違えていて何をすればいいのでしょうか?
実現したいこと
SWIGを使ってC++ コードをlua言語に変換?してlua言語で利用する方法が知りたい
知りたいこと
この原因と対処方法が知りたい
> lua Main.lua 18:54:21 lua: Main.lua:5: attempt to index a nil value (field 'World') stack traceback: Main.lua:5: in main chunk [C]: in ?
前提
OS: ubuntu
C++ 言語のライブラリをlua言語で利用
発生している問題・エラーメッセージ
> lua Main.lua 18:54:21 lua: Main.lua:5: attempt to index a nil value (field 'World') stack traceback: Main.lua:5: in main chunk [C]: in ?
該当のソースコード
lua
1-- Box2Dライブラリを読み込む 2local box2d = require("box2d") 3 4-- 物理世界の作成 5local world = box2d.World.new(0, 10) 6 7-- 地面の作成 8local groundBody = world:CreateBody(box2d.BodyDef.new()) 9local groundShape = box2d.PolygonShape.new() 10groundShape:SetAsBox(10, 1) 11groundBody:CreateFixture(groundShape, 0) 12 13-- ダイナミックなボックスの作成 14local dynamicBodyDef = box2d.BodyDef.new() 15dynamicBodyDef.type = box2d.BodyType.DYNAMIC 16dynamicBodyDef.position:Set(0, -5) 17 18local dynamicBody = world:CreateBody(dynamicBodyDef) 19local dynamicShape = box2d.PolygonShape.new() 20dynamicShape:SetAsBox(1, 1) 21 22local dynamicFixture = dynamicBody:CreateFixture(dynamicShape, 1) 23 24-- シミュレーションの更新 25function love.update(dt) 26 world:Step(dt, 8, 3) 27end 28 29-- 物理オブジェクトの描画(表示にLove2Dを使用している例) 30function love.draw() 31 local x, y = dynamicBody:GetPosition() 32 love.graphics.rectangle("fill", x - 0.5, y - 0.5, 1, 1) 33end 34
行ったこと
SWIGでChatgdtを参考に以下のことを実行
1:.iファイルを作成
%module box2d %{ #include "box2d/box2d.h" %} %include "box2d/box2d.h"
2:コマンドを実行しbox2d_wrap.cpp
を生成
swig -lua -c++ -o box2d_wrap.cpp box2d.i
3: コマンドを実行してlibbox2.so
を作成
g++ -shared -fPIC -I./include -I./src -o libbox2d.so ./include/box2d_wrap.cpp ./src/box2d.cpp`
3:/usr/local/lib/lua/5.4/
に生成したlibbox2d.so
を配置
> sudo mv libbox2d.so /usr/local/lib/lua/5.4/
4:提示コードを実行
エラー
> lua Main.lua 18:40:33 lua: Main.lua:2: module 'box2d' not found: no field package.preload['box2d'] no file '/usr/local/share/lua/5.4/box2d.lua' no file '/usr/local/share/lua/5.4/box2d/init.lua' no file '/usr/local/lib/lua/5.4/box2d.lua' no file '/usr/local/lib/lua/5.4/box2d/init.lua' no file './box2d.lua' no file './box2d/init.lua' no file '/usr/local/lib/lua/5.4/box2d.so' no file '/usr/local/lib/lua/5.4/loadall.so' no file './box2d.so' stack traceback: [C]: in function 'require' Main.lua:2: in main chunk [C]: in ?
5:名前をlibbox2d.so
からbox2d.so
に変更してサイド実行
> lua Main.lua 18:54:21 lua: Main.lua:5: attempt to index a nil value (field 'World') stack traceback: Main.lua:5: in main chunk [C]: in ?
5について
Chatgdtに質問したことこ
このエラーは、box2dモジュールが World という名前のテーブル(またはクラス)を含んでいないことを示しています。可能性としては、Worldの代わりに別の名前が使われているか、またはbox2dモジュールが期待通りにロードされていない可能性があります。
という回答を得たのですがこれはおそらくSWIGを使った時の上記の行った事1
番の.iファイルの作成に問題があると思うのですが対処方法がわかりません。
補足情報(FW/ツールのバージョンなど)
Box2D(ダウンロードしてきたサイト): https://github.com/erincatto/box2d