Difference between revisions of "Event.BEGIN CONTACT"

From GiderosMobile
m (Text replacement - "<source" to "<syntaxhighlight")
m (Text replacement - "</source>" to "</syntaxhighlight>")
 
Line 89: Line 89:
 
end
 
end
 
function LevelX:goMenu() scenemanager:changeScene("menu", 1) end
 
function LevelX:goMenu() scenemanager:changeScene("menu", 1) end
</source>
+
</syntaxhighlight>
  
  
 
{{B2.World}}
 
{{B2.World}}

Latest revision as of 14:26, 13 July 2023

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