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.