Quick-lua 中使用box2d
1 网上找到了别人写好的包, 但放到项目里报几个错,地址如下。
Box2D lua binding pkg and c++ files: LuaBox2D.zip
2 把包中的LuaBox2D.h, LuaBox2d.cpp 放到 Class/ 目录中。 编译, 但报N个错误, 挨个修改, 下面是修改后的文件
3 在lua中调用box2d相关函数
local PTM_RATIO = 32.0
local gravity = b2Vec2(0.0, -10.0)
local _world = b2World:new_local(gravity)
-- Create edges around the entire screen
local groundBodyDef = b2BodyDef:new_local()
groundBodyDef.position = b2Vec2(0, 0)
local groundBody = _world:CreateBody(groundBodyDef)
local groundEdge = b2EdgeShape:new_local()
local boxShapeDef = b2FixtureDef:new_local()
boxShapeDef.shape = groundEdge
local winSize = cc.Director:getInstance():getWinSize();
groundEdge:Set(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0))
groundBody:CreateFixture(boxShapeDef)
groundEdge:Set(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO))
groundBody:CreateFixture(boxShapeDef)
groundEdge:Set(b2Vec2(0, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO))
groundBody:CreateFixture(boxShapeDef)
groundEdge:Set(b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, 0))
groundBody:CreateFixture(boxShapeDef)
body_list = {}
sprite_list = {}
local x = 100
local y = 500
local sp = cc.Sprite:create("center0.png")
sp:setPosition(cc.p(100, 100))
self:addChild(sp, 1, 100)
table.insert(sprite_list, sp);
-- Create body and shape
local bodyDef = b2BodyDef:new_local()
bodyDef.type = b2_dynamicBody
bodyDef.position:Set(x/PTM_RATIO, y/PTM_RATIO)
bodyDef.userData = sp
local _body = _world:CreateBody(bodyDef)
local circle = b2CircleShape:new_local()
circle.m_radius = 26.0/PTM_RATIO
shapeDef = b2FixtureDef:new_local()
shapeDef.shape = circle
shapeDef.density = 1.0
shapeDef.friction = 0.2
shapeDef.restitution = 0.8
_body:CreateFixture(shapeDef)
table.insert(body_list, _body)
-- tick
local function tick(dt)
_world:Step(dt, 10, 10)
if body_list ~= nil then
for i, body in ipairs(body_list) do
local sprite = sprite_list[i]
sprite:setPosition(cc.p(body:GetPosition().x * PTM_RATIO, body:GetPosition().y * PTM_RATIO))
-- sprite:setRotation(-1 * CC_RADIANS_TO_DEGREES(body:GetAngle()))
end
end
end
cc.Director:getInstance():getScheduler():scheduleScriptFunc(tick, 0, false)
参考:
就算当不成英雄,也要是一条好汉| 空谈误国,实干兴邦。

LuaBox2D.cpp
浙公网安备 33010602011771号