【问题标题】:side collision flash actionscript-3?侧面碰撞闪光actionscript-3?
【发布时间】:2011-04-06 11:42:23
【问题描述】:

有没有人有任何示例/知道任何教程可以让我在 flash actionscript 3 中与对象进行侧面碰撞?我一直在寻找并没有找到任何东西..感谢您的帮助。

【问题讨论】:

  • 不确定您所说的“侧面”碰撞是什么意思。请描述。

标签: flash actionscript-3 collision


【解决方案1】:

我相信您正在寻找的是适用于所有显示对象的“hitTest”功能。 hitTestObject 告诉你两个对象是否发生碰撞,hitTestPoint 告诉你一个对象是否与一个点发生碰撞。例如,给定一个名为“myDisplayObj”的 MovieClip 变量:

if( myDisplayObj.hitTestObject(otherDisplayObj) ){ //do object collision code }
if( myDisplayObj.hitTestPoint(100,350) ){ //do point collision code }

【讨论】:

  • 谢谢,但是我如何检测我是否与特定的一侧发生碰撞?例如左边。?
  • 一般情况下,你会在“//do object collision code”中调用一个函数,比较两个对象的x和y以确定它们的相对位置。实际实现可能会根据您要建模的行为而有所不同(仅第一次碰撞计数,还是持续的碰撞链继续计数?),但通常 x 和 y 比较基本上会得到您想要的。
【解决方案2】:

试试这个..

实现是 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 "";
    }
}

【讨论】:

    猜你喜欢
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多