Event.BEGIN CONTACT

From GiderosMobile
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Available since: Gideros 2011.6
Value: beginContact
Defined by: b2.World

Description

This event is dispatched when contact between box2d bodies begin.

Parameters

contact: (b2.Contact) contains instance of b2.Contact holding information about this collision
fixtureA: (b2.Fixture) contains instance of b2.Fixture of first colliding body
fixtureB: (b2.Fixture) contains instance of b2.Fixture of second colliding body

Example

LevelX = Core.class(Sprite)

function LevelX:init()
	-- liquidfun
	self.world = b2.World.new(0, 9.8 * 3, true) -- gravity x, gravity y, allow sleeping?
	-- listeners
	self:addEventListener("enterBegin", self.onTransitionInBegin, self)
	self:addEventListener("enterEnd", self.onTransitionInEnd, self)
	self:addEventListener("exitBegin", self.onTransitionOutBegin, self)
	self:addEventListener("exitEnd", self.onTransitionOutEnd, self)
	self.world:addEventListener(Event.BEGIN_CONTACT, self.onBeginContact, self)
	self.world:addEventListener(Event.END_CONTACT, self.onEndContact, self)
	self.world:addEventListener(Event.PRE_SOLVE, self.onPreSolveContact, self)
	self.world:addEventListener(Event.POST_SOLVE, self.onPostSolveContact, self)
end

-- GAME LOOP
function LevelX:onEnterFrame(e)
	self.world:step(1/60, 8, 3)
end

-- collisions handler
function LevelX:onBeginContact(e)
	local fixtureA, fixtureB = e.fixtureA, e.fixtureB
	local bodyA = e.fixtureA:getBody()
	local bodyB = e.fixtureB:getBody()
	-- PLAYER
	if (bodyA.name == G_PLAYER and bodyB.name == G_GROUND) or (bodyA.name == G_GROUND and bodyB.name == G_PLAYER) then
		if bodyA.name == G_PLAYER then bodyA.numfloorcontacts += 1
		else bodyB.numfloorcontacts += 1
		end
	end
end

function LevelX:onEndContact(e)
	local bodyA = e.fixtureA:getBody()
	local bodyB = e.fixtureB:getBody()
	-- PLAYER
	if (bodyA.name == G_PLAYER and bodyB.name == G_GROUND) or (bodyA.name == G_GROUND and bodyB.name == G_PLAYER) then
		if bodyA.name == G_PLAYER then bodyA.numfloorcontacts -= 1
		else bodyB.numfloorcontacts -= 1
		end
	end
end

function LevelX:onPreSolveContact(e)
	local bodyA = e.fixtureA:getBody()
	local bodyB = e.fixtureB:getBody()
	local platform, player
	if bodyA.name == G_PTPLATFORM then platform = bodyA player = bodyB
	else platform = bodyB player = bodyA
	end
	if not platform then return end
	-- do stuff...
end

function LevelX:onPostSolveContact(e)
end

-- EVENT LISTENERS
function LevelX:onTransitionInBegin() self:addEventListener(Event.ENTER_FRAME, self.onEnterFrame, self) end
function LevelX:onTransitionInEnd() self:myKeysPressed() end
function LevelX:onTransitionOutBegin()
	if self.channel then self.channel:stop() end
	self:removeAllListeners()
end
function LevelX:onTransitionOutEnd() end

-- KEYS HANDLER
function LevelX:myKeysPressed()
	self:addEventListener(Event.KEY_UP, function(e)
		if e.keyCode == KeyCode.BACK or e.keyCode == KeyCode.ESC then self:goMenu() end
	end)
end
function LevelX:goMenu() scenemanager:changeScene("menu", 1) end





LiquidFun