Full Totem Destroyer prototype
2009-11-12 00:00:00 来源:WEB开发网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<LevelArray.length;a++){
for(var b:int = 0;b<10;b++){
switch(b){
case 0:
nx = LevelArray[a][b]
break;
case 1:
ny = LevelArray[a][b]
break;
case 2:
n_width = LevelArray[a][b]
break;
case 3:
n_height = LevelArray[a][b]
break;
case 4:
n_static = LevelArray[a][b]
break;
case 5:
if(LevelArray[a][b]=="Box0"){
n_name = "Box"+boxCount
}
else{
n_name = LevelArray[a][b]
}
boxCount++
break;
case 6:
n_destroyable = LevelArray[a][b]
break;
case 7:
n_restitution = LevelArray[a][b]
break;
case 8:
n_friction = LevelArray[a][b]
break;
case 9:
CreateBox(nx,ny,n_width,n_height,n_static,n_name,n_destroyable,n_restitution,n_friction,Decode(LevelArray[a][b],"iden"))
break;
}
}
}
}
public function CreateBox(x:Number,y:Number,width:Number,height:Number,static:Boolean,name:String,destroyable:Boolean,restitution:Number,friction:Number,Cover){
boxDef = new b2PolygonDef();
boxDef.SetAsBox(GetB2Nums(width,true),GetB2Nums(height,true))
if(!static){
boxDef.density = 1.0
}
else{
boxDef.density = 0.0
}
boxDef.friction = friction
boxDef.restitution = restitution
bodyDef = new b2BodyDef();
bodyDef.position.x = GetB2Nums(x,false)
bodyDef.position.y = GetB2Nums(y,false)
bodyDef.userData = Cover
bodyDef.userData.name = name
bodyDef.userData.destroyable = destroyable
bodyDef.userData.width = 30 * 2 * GetB2Nums(width,true)
bodyDef.userData.height = 30 * 2* GetB2Nums(height,true)
body = m_world.CreateBody(bodyDef)
body.CreateShape(boxDef)
body.SetMassFromShapes();
addChild(bodyDef.userData)
}
public function Decode(WTD:String,Encryption:String){
switch(Encryption){
case "iden":
if(WTD =="Block"){
return new Block();
}
if(WTD == "Floor"){
return new Floor();
}
if(WTD == "Totem"){
return new Totem();
}
if(WTD == "unBreakable"){
return new unBreakable();
}
if(WTD == "Slimy"){
return new Slimy();
}
break;
}
}
public function CreateCircle(x:Number,y:Number,radius:Number,static:Boolean){
circleDef = new b2CircleDef();
circleDef.radius = GetB2Nums(radius,true)
if(static){
circleDef.density = 0.0
}
else{
circleDef.density = 1.0
}
bodyDef = new b2BodyDef();
bodyDef.position.Set(GetB2Nums(x,false),GetB2Nums(y,false))
body = m_world.CreateBody(bodyDef)
body.CreateShape(circleDef)
body.SetMassFromShapes();
}
public function destroyBody(evt:MouseEvent):void{
var selectedShape = GetBodyAtMouse();
var user = selectedShape.GetUserData().name
var susceptable = selectedShape.GetUserData().destroyable
var Child = getChildByName(user)
if(selectedShape){
if(susceptable){
m_world.DestroyBody(selectedShape)
removeChild(Child)
Child = null
user = null
selectedShape = null
}
}
}
public function GetBodyAtMouse(includeStatic:Boolean=false):b2Body {
var mouseXWorldPhys = (mouseX)/30;
var mouseYWorldPhys = (mouseY)/30;
mousePVec.Set(mouseXWorldPhys, mouseYWorldPhys);
var aabb:b2AABB = new b2AABB();
aabb.lowerBound.Set(mouseXWorldPhys - 0.001, mouseYWorldPhys - 0.001);
aabb.upperBound.Set(mouseXWorldPhys + 0.001, mouseYWorldPhys + 0.001);
var k_maxCount:int=10;
var shapes:Array = new Array();
var count:int=m_world.Query(aabb,shapes,k_maxCount);
var body:b2Body=null;
for (var i:int = 0; i < count; ++i) {
if (shapes[i].GetBody().IsStatic()==false||includeStatic) {
var tShape:b2Shape=shapes[i] as b2Shape;
var inside:Boolean=tShape.TestPoint(tShape.GetBody().GetXForm(),mousePVec);
if (inside) {
body=tShape.GetBody()
break;
}
}
}
return body;
}
public function findTotem(includeStaticBodies:Boolean = false){
for (var tm:b2Body = m_world.m_bodyList; tm; tm = tm.m_next){
if (tm.m_userData is Sprite){
if(tm.m_userData.name=="Totem" && foundTotem==false){
totemFound==tm
foundTotem=true
break;
}
}
}
}
public function GetB2Nums(Num:Number,WH:Boolean){
switch(WH){
case true:
return Num/30/2
break;
case false:
return Num/30
break;
}
}
public function Update(e:Event):void{
m_world.Step(m_timeStep,m_iterations)
for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next){
if (bb.m_userData is Sprite){
bb.m_userData.x = bb.GetPosition().x * 30;
bb.m_userData.y = bb.GetPosition().y * 30;
bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
}
}
}
public var m_world:b2World
public var m_timeStep:Number = GetB2Nums(1.0,false)
public var m_iterations:int = 10
public var lose:Boolean = false
}
}
更多精彩
赞助商链接