does anyone have any examples/know of any tutorials which开发者_如何学C would let me do side collision in flash actionscript 3 with objects? I have been searching and havent been able to find anything .. thanks for any help.
I believe what you're looking for are the "hitTest" functions that are available to all Display Objects. hitTestObject tells you whether two objects have collided, and hitTestPoint tells you whether an object has collided with a point. Given, say, a MovieClip var named "myDisplayObj":
if( myDisplayObj.hitTestObject(otherDisplayObj) ){ //do object collision code }
if( myDisplayObj.hitTestPoint(100,350) ){ //do point collision code }
Try this..
Implementation is that checkForCollision() will return a String to represent the side you've collided against. The object you want to check for a collision against needs to extend this class. Also, if you want to use angled tiles, set the angl property to be either tl, bl, tr, tl to represent the position of the sloped side. Hope this isn't too confusing.
public class Impassable extends MovieClip
{
// Vars
public var angl:String = "";
/**
* Checks if the specified point collides with this
* @param cx The x value of the point being checked
* @param cy The y value of the point being checked
* @param offset An offset from the edges of this that can be considered as part of the radius of this
* @return A String representing the side that a collision was detected on
*/
public function checkForCollision(cx:int, cy:int, offset:int=0):String
{
if(angl.length < 1)
{
// Horizontal
if(cy > y - 1 && cy < y + height + 1)
{
if(cx > x - offset && cx < x + width/2) return 'WEST';
if(cx < x + width + offset && cx > x + width/2) return 'EAST';
}
// Vertical
if(cx > x - 1 && cx < x + height + 1)
{
if(cy > y - offset && cy < y + height/2) return 'NORTH';
if(cy < y + height + offset && cy > y + height/2) return 'SOUTH';
}
}
else
{
// Gradient (1)
var xgr:Number = cx - x;
var ygr:Number = cy - y;
var ua:Boolean = false;
// Angled Tiles
if(angl == "tl")
{
// Top Left
if(cx > x - 1 && cy > y - 1) ua = true;
if(ua)
{
// Angle Collision
if(cy < y + height - xgr + offset || cx < x + width - ygr + offset) return 'SOUTH_EAST';
}
else
{
// Straight Collision
if(cy > y - 1 && cy < y + height + 1)
{
if(cx > x - offset && cx < x + width/2) return 'WEST';
}
if(cx > x - 1 && cx < x + height + 1)
{
if(cy > y - offset && cy < y + height/2) return 'NORTH';
}
}
}
if(angl == "tr")
{
// Top Right
if(cx < x + width + 1 && cy > y - 1) ua = true;
if(ua)
{
// Angle Collision
if(cy < y + height - (width - xgr) + offset || cx > x + ygr - offset) return 'SOUTH_WEST';
}
else
{
// Straight Collision
if(cy > y - 1 && cy < y + height + 1)
{
if(cx < x + width + offset && cx > x + width/2) return 'EAST';
}
if(cx > x - 1 && cx < x + height + 1)
{
if(cy > y - offset && cy < y + height/2) return 'NORTH';
}
}
}
if(angl == "br")
{
// Bottom Right
if(cx < x + width + 1 && cy < y + height + 1) ua = true;
if(ua)
{
// Angle Collision
if(cx > x + (height - ygr) - offset || cy > y + height - xgr - offset) return 'NORTH_WEST';
}
else
{
// Straight Collision
if(cy > y - 1 && cy < y + height + 1)
{
if(cx < x + width + offset && cx > x + width/2) return 'EAST'
}
if(cx > x - 1 && cx < x + height + 1)
{
if(cy < y + height + offset && cy > y + height/2) return 'SOUTH';
}
}
}
if(angl == "bl")
{
// Bottom Left
if(cx > x - 1 && cy < y + height + 1) ua = true;
if(ua)
{
// Angle Collision
if(cx < x + ygr + offset || cy > y + xgr - offset) return 'NORTH_EAST';
}
else
{
// Straight Collision
if(cy > y - 1 && cy < y + height + 1)
{
if(cx > x - offset && cx < x + width/2) return 'WEST';
}
if(cx > x - 1 && cx < x + height + 1)
{
if(cy < y + height + offset && cy > y + height/2) return 'SOUTH';
}
}
}
}
return "";
}
}
精彩评论