Флэш-сценарий бокового столкновения Actionscript-3? - PullRequest
0 голосов
/ 06 апреля 2011

есть ли у кого-нибудь примеры / сведения о каких-либо уроках, которые позволили бы мне выполнить боковое столкновение во flash actioncript 3 с объектами?Я искал и не смог ничего найти .. спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2011

Попробуйте это ..

Реализация состоит в том, что 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 "";
    }
}
0 голосов
/ 06 апреля 2011

Я считаю, что вам нужны функции "hitTest", которые доступны для всех экранных объектов. hitTestObject сообщает вам, столкнулись ли два объекта, а hitTestPoint сообщает вам, столкнулся ли объект с точкой. Скажем, скажем, переменная MovieClip с именем «myDisplayObj»:

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