liangzhimy

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

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)
 
 
参考:
posted on 2015-03-13 11:59  liangzhimy  阅读(1969)  评论(2)    收藏  举报