Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как можно исключить добавление объекта на другой объект? (http://www.flasher.ru/forum/showthread.php?t=205095)

Dip52 18.11.2013 15:05

Как можно исключить добавление объекта на другой объект?
 
Вложений: 1
Здравствуйте.

Я сделал проверку (предпроверку) на касания окружностей созданного только что объекта с другими, созданными уже раньше. Если касания не происходит, то объект добавляется, если происходит, то создаются новые координаты и т.д.

Класс "Creation":
Код AS3:

package classes
{
        import flash.utils.Timer;
        import flash.events.TimerEvent;
        import classes.fond.Fields;
        import flash.display.Sprite;
 
        public class Creation
        {
                private var timerCreation:Timer = new Timer(Settings.CREATION);
                private var tempCreatedCrovel:int = 0;
 
                public function Creation()
                {
                        timerCreation.addEventListener(TimerEvent.TIMER,creationCrovels);
                        timerCreation.start();
                }
                private function creationCrovels(event:TimerEvent):void
                {
                        trace("Создан Кровел");
                        tempCreatedCrovel += 1;
                        var crovel:Sprite = new Crovel(new Liquid());
 
                        var randomX:Number = Math.random() * Settings.SWEEP;
                        var randomY:Number = 50 + Math.random() * 500;
 
                        var randomCoordinates:Array = setRandomCoordinates(crovel);
                        randomX = randomCoordinates[0];
                        randomY = randomCoordinates[1];
 
                        crovel.x = randomX;
                        crovel.y = randomY;
 
                        Settings.crovels.push(crovel);
 
                        if(tempCreatedCrovel == Settings.NUMBERCROVEL)
                        {
                                timerCreation.removeEventListener(TimerEvent.TIMER,creationCrovels);
                                timerCreation.reset();
                        }
                }
                const LIMIT:int = 500;
                private function setRandomCoordinates(ONECROVEL:Object,l:int = 1):Array
                {
                        if(l >= LIMIT)
                        {
                                return [0,0];
                        }
                        var randomX:Number = Math.random() * Settings.SWEEP;
                        var randomY:Number = 50 + Math.random() * 500;
 
                        var areNewRandomCoordinates:Boolean = false;
                        const DATAONECROVEL:Object = new Object();
                        DATAONECROVEL.clip = ONECROVEL;
                        DATAONECROVEL.x = randomX;
                        DATAONECROVEL.y = randomY;
                        DATAONECROVEL.radius = (DATAONECROVEL.clip.width / 2) - Settings.REDUCTION;
 
                        for(var i:int = 0; i < Settings.crovels.length; i++)
                        {
                                const TWOCROVEL:Object = Settings.crovels[i];
                                const DATATWOCROVEL:Object = new Object();
                                DATATWOCROVEL.clip = TWOCROVEL;
                                DATATWOCROVEL.x = TWOCROVEL.x;
                                DATATWOCROVEL.y = TWOCROVEL.y;
                                DATATWOCROVEL.radius = (DATATWOCROVEL.clip.width / 2) - Settings.REDUCTION;
 
                                var are:Boolean = Collision.detectionCollision(DATAONECROVEL,DATATWOCROVEL);
                                if(are)
                                {
                                        randomX = Math.random() * Settings.SWEEP;
                                        randomY = 50 + Math.random() * 500;
                                        DATAONECROVEL.x = randomX;
                                        DATAONECROVEL.y = randomY;
                                }
                                else
                                {
                                        areNewRandomCoordinates = true;
                                        break;
                                }
                        }
                        if(!areNewRandomCoordinates)
                        {
                                return setRandomCoordinates(ONECROVEL,l+1);
                        }
                        return [randomX,randomY];
                }
        }
}

Статическая функция "detectionCollision":

Код AS3:

                public static function detectionCollision(crovelOne:Object,crovelTwo:Object):Boolean
                {
                        var xDiff:Number = crovelOne.x - crovelTwo.x;
                        var yDiff:Number = crovelOne.y - crovelTwo.y;
                        var distance = Math.sqrt(xDiff*xDiff+yDiff*yDiff);
                        if(distance <= crovelOne.radius + crovelTwo.radius)
                        {
                                return true;
                        }
                        return false;
                }

Но погрешность иногда всё равно есть:
crovels.swf   (120.0 Кб)


Часовой пояс GMT +4, время: 09:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.