You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.3 KiB
120 lines
3.3 KiB
/* |
|
DynAPI Distribution |
|
MotionX Class by Raymond Irving (http://dyntools.shorturl.com) |
|
|
|
The DynAPI Distribution is distributed under the terms of the GNU LGPL license. |
|
|
|
requires: Dynlayer |
|
*/ |
|
|
|
MotionX = {}; // used by dynapi.library |
|
|
|
DynLayer.prototype.makeSolid=function(){ |
|
this.isHard=true; |
|
this._collideX=this.x; |
|
this._collideY=this.x; |
|
this.collideEvent ={ |
|
onlocationchange:function(e) { |
|
var me=e.getSource(); |
|
var dirX='',dirY=''; |
|
// get direction |
|
if (me._collideX!=me.x) { |
|
if (me._collideX<me.x){dirX="E"}else{dirX="W"}; |
|
} |
|
if (me._collideY!=me.y){ |
|
if (me._collideY<me.y){dirY="S"}else{dirY="N"}; |
|
} |
|
// get angle direction |
|
me._setCollideAngleDirection(me._collideX,me._collideY,me.x,me.y); |
|
me._collideX=me.x; |
|
me._collideY=me.y; |
|
me._collideDirection=dirY+dirX; |
|
me._checkForCollision(); |
|
} |
|
} |
|
this.addEventListener(this.collideEvent); |
|
}; |
|
// reversing the make solid method |
|
|
|
DynLayer.prototype.makeEphemeral = function() { |
|
this.isHard=false; |
|
this.removeEventListener(this.collideEvent); |
|
}; |
|
|
|
DynLayer.prototype._setCollideAngleDirection = function(x1,y1,x2,y2) { |
|
var distx = (x2-x1),disty = (y1-y2),angle; |
|
//if (distx==0 && disty==0) return 0; |
|
var rad=Math.abs(Math.atan2(disty,distx)) |
|
if (disty>=0) { |
|
if (distx>=0) angle = 90-(rad*180/Math.PI); |
|
else angle = 270+(180-(rad*180/Math.PI)); |
|
}else{ |
|
angle = 90+(rad*180/Math.PI); |
|
} |
|
this._collideAngle=Math.ceil(angle); |
|
}; |
|
DynLayer.prototype._checkForCollision=function(){ |
|
if (!this.parent.children.length>0) return false; |
|
var ch,chX,sX,sY,colX1,colX2,colY1,colY2,n1,n2; |
|
this.collideObject==null; |
|
for (var i in this.parent.children) { |
|
ch=this.parent.children[i]; |
|
if (ch!=this && ch.isHard==true) { |
|
chX=ch.x; |
|
chY=ch.y; |
|
sX=this.x; |
|
sY=this.y; |
|
colX1=(sX>=chX && sX<=chX+ch.w); |
|
colX2=(chX>=sX && chX<=sX+this.w); |
|
colY1=(sY>=chY && sY<=chY+ch.h); |
|
colY2=(chY>=sY && chY<=sY+this.h); |
|
if ((colX1 || colX2) && (colY1 || colY2)) { |
|
if (this._collideDirection=='NE') { |
|
n1=((chY+ch.h)-this.y);n2=((sX+this.w)-chX); |
|
if (n1<n2) {face="S"}else{face="W"} |
|
}else if (this._collideDirection=='NW') { |
|
n1=((chY+ch.h)-this.y);n2=((chX+ch.w)-sX); |
|
if (n1<n2) {face="S"}else{face="E"} |
|
}else if (this._collideDirection=='SE') { |
|
n1=((sY+this.h)-ch.y);n2=((sX+this.w)-chX); |
|
if (n1<n2) {face="N"}else{face="W"} |
|
}else if (this._collideDirection=='SW') { |
|
n1=((sY+this.h)-ch.y);n2=((chX+ch.w)-sX); |
|
if (n1<n2) {face="N"}else{face="E"} |
|
}else if (this._collideDirection=='E') { |
|
face="W"; |
|
}else if (this._collideDirection=='W') { |
|
face="E"; |
|
}else if (this._collideDirection=='N') { |
|
face="S"; |
|
}else if (this._collideDirection=='S') { |
|
face="N"; |
|
} |
|
|
|
ch._impactSide=face; |
|
if (face=="W"){this._impactSide="E"} |
|
if (face=="E"){this._impactSide="W"} |
|
if (face=="N"){this._impactSide="S"} |
|
if (face=="S"){this._impactSide="N"} |
|
|
|
this._collideObject=ch; |
|
this.invokeEvent("collide"); |
|
ch._collideObject=this; |
|
ch.invokeEvent("collide"); |
|
} |
|
} |
|
} |
|
return false; |
|
}; |
|
DynLayer.prototype.getImpactSide=function(){ |
|
return this._impactSide; |
|
} |
|
DynLayer.prototype.getObstacle=function(){ |
|
return this._collideObject; |
|
} |
|
DynLayer.prototype.getDirection=function(){ |
|
return this._collideDirection; |
|
} |
|
DynLayer.prototype.getDirectionAngle=function(){ |
|
return this._collideAngle; |
|
}
|
|
|