Do you like my tutorials?

Then consider supporting me on Ko-fi

Talking about Totem Destroyer game, Actionscript 3, Box2D, Flash, Game development and Users contributions.

Some time ago I posted Create a Flash game like Totem Destroyer, and now I am showing you a complete prototype made by Collin Douch.

The prototype features slimy and non-removable blocks and collision detection between the totem and the ground.

Such detection was made customizing Box2D’s b2ContactListener class. For more information about this class refer to Understanding how Box2D manages collisions.

This is the main file:

package{
	import flash.events.*
	import flash.events.MouseEvent
	import flash.display.Sprite
	import flash.text.*
	import Box2D.Dynamics.*
	import Box2D.Collision.*
	import Box2D.Collision.Shapes.*
	import Box2D.Common.Math.*
	
	public class totem extends Sprite{
		
		var boxDef:b2PolygonDef
		var bodyDef:b2BodyDef
		var circleDef:b2CircleDef
		var body:b2Body
		var nx:Number
		var ny:Number
		var nn:String
		var mousePVec:b2Vec2 = new b2Vec2();
		var boxCount:Number = 0
		var bombCount = 3
		var foundTotem:Boolean = false
		var totemFound:b2Body = null
		var n_width:Number
		var n_height:Number
		var n_static:Boolean
		var n_name:String
		var n_destroyable:Boolean
		var n_restitution:Number
		var n_friction:Number
		public function totem(){
			addEventListener(Event.ENTER_FRAME,Update)
			stage.addEventListener(MouseEvent.MOUSE_DOWN,destroyBody)
			
			var worldAABB:b2AABB = new b2AABB();
			worldAABB.lowerBound.Set(-100.0,-100.0)
			worldAABB.upperBound.Set(100.0,100.0)
			
			var gravity:b2Vec2 = new b2Vec2(0.0,10.0)
			var doSleep:Boolean = true
			m_world = new b2World(worldAABB,gravity,doSleep)
			
			var totemContact:b2ContactListener = new b2ContactListener();
			m_world.SetContactListener(totemContact)
			
			findTotem();
			CreateLevel(new Array([275,400,550,100,true,"floor",false,0.3,0.3,"Floor"],[200,340,20,20,false,GetName("Box"),true,1,0.001,"Slimy"],[200,320,20,20,false,GetName("Box"),true,0.3,0.3,"Block"],[300,340,20,20,false,GetName("Box"),true,1,0.001,"Slimy"],[300,320,20,20,false,GetName("Box"),true,0.3,0.3,"Block"],[250,300,120,20,false,"BG",false,0.3,0.3,"unBreakable"],[200,280,20,20,false,GetName("Box"),true,0.3,0.3,"Block"],[200,260,20,20,false,GetName("Box"),true,0.3,0.3,"Block"],[200,240,20,20,false,GetName("Box"),true,0.3,0.3,"Block"],[300,280,20,20,false,GetName("Box"),true,0.3,0.3,"Block"],[300,260,20,20,false,GetName("Box"),true,0.3,0.3,"Block"],[300,240,20,20,false,GetName("Box"),true,0.3,0.3,"Block"],[250,220,120,20,false,"BB",false,0.3,0.3,"unBreakable"],[250,205,21.4,33.6,false,"Totem",false,0.3,0.3,"Totem"]))
		}
		public function GetName(possName:String){
			var nameing = "Box"+boxCount
			return "Box"+boxCount;
			boxCount++
		}
		public function CreateLevel(LevelArray:Array){
			for(var a:int=0;a

and this is the custom b2ContactListener class

/*
* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
*
* This software is provided 'as-is', without any express or implied
* warranty.  In no event will the authors be held liable for any damages
* arising from the use of this software.
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*/

package Box2D.Dynamics{


import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Dynamics.Contacts.*;
import Box2D.Dynamics.*;
import Box2D.Common.Math.*;
import Box2D.Common.*;


/// Implement this class to get collision results. You can use these results for
/// things like sounds and game logic. You can also get contact results by
/// traversing the contact lists after the time step. However, you might miss
/// some contacts because continuous physics leads to sub-stepping.
/// Additionally you may receive multiple callbacks for the same contact in a
/// single time step.
/// You should strive to make your callbacks efficient because there may be
/// many callbacks per time step.
/// @warning The contact separation is the last computed value.
/// @warning You cannot create/destroy Box2D entities inside these callbacks.
public class b2ContactListener
{
var lose:Boolean = false
	/// Called when a contact point is added. This includes the geometry
	/// and the forces.
	public virtual function Add(point:b2ContactPoint) : void{
		if(point.shape1.GetBody().GetUserData().name == "Totem" && point.shape2.GetBody().GetUserData().name == "floor" && lose==false){
			lose = true
			trace("lose")
			point.shape1.GetBody().GetUserData().gotoAndPlay("broken")
		}
		if(point.shape1.GetBody().GetUserData().name == "floor" && point.shape2.GetBody().GetUserData().name == "Totem" && lose==false){
			lose = true
			trace("lose")
			point.shape2.GetBody().GetUserData().gotoAndPlay("broken")
		}
		};

	/// Called when a contact point persists. This includes the geometry
	/// and the forces.
	public virtual function Persist(point:b2ContactPoint) : void{};

	/// Called when a contact point is removed. This includes the last
	/// computed geometry and forces.
	public virtual function Remove(point:b2ContactPoint) : void{};
	
	/// Called after a contact point is solved.
	public virtual function Result(point:b2ContactResult) : void{};
};

}

Download the full source code (Box2D excluded)

Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.