【发布时间】:2011-04-06 11:42:23
【问题描述】:
有没有人有任何示例/知道任何教程可以让我在 flash actionscript 3 中与对象进行侧面碰撞?我一直在寻找并没有找到任何东西..感谢您的帮助。
【问题讨论】:
-
不确定您所说的“侧面”碰撞是什么意思。请描述。
标签: flash actionscript-3 collision
有没有人有任何示例/知道任何教程可以让我在 flash actionscript 3 中与对象进行侧面碰撞?我一直在寻找并没有找到任何东西..感谢您的帮助。
【问题讨论】:
标签: flash actionscript-3 collision
我相信您正在寻找的是适用于所有显示对象的“hitTest”功能。 hitTestObject 告诉你两个对象是否发生碰撞,hitTestPoint 告诉你一个对象是否与一个点发生碰撞。例如,给定一个名为“myDisplayObj”的 MovieClip 变量:
if( myDisplayObj.hitTestObject(otherDisplayObj) ){ //do object collision code }
if( myDisplayObj.hitTestPoint(100,350) ){ //do point collision code }
【讨论】:
试试这个..
实现是 checkForCollision() 将返回一个字符串来表示您碰撞的一侧。您要检查碰撞的对象需要扩展此类。此外,如果您想使用有角度的瓷砖,请将 angl 属性设置为 tl, bl, tr, tl 以表示倾斜边的位置。希望这不会太混乱。
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 "";
}
}
【讨论】: