Форум 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=195191)

ArtS 03.03.2013 23:13

Цитата:

Сообщение от Tails (Сообщение 1123397)
Функцию то вызовите:
Код AS3:

start();


Спасибо большое, не додумался)

Добавлено через 34 минуты
Теперь осталось решить этот вопрос:

Цитата:

Сообщение от Wolsh (Сообщение 1123311)
неплохо бы ее еще разворачивать мордой к цели, чтобы.. жабры не засорялись.


Wolsh 04.03.2013 00:12

А у рыбы есть лево-право? Или, точнее, брюхо и спина?
Как она у вас будет разворачиваться в обратную сторону? Скейлом?

ArtS 04.03.2013 15:38

Цитата:

Сообщение от Wolsh (Сообщение 1123409)
А у рыбы есть лево-право? Или, точнее, брюхо и спина?
Как она у вас будет разворачиваться в обратную сторону? Скейлом?

Есть лево-право, и спина и брюхо.

Wolsh 04.03.2013 16:06

1. Вычисляете новую рандомную точку
2. Проверяете, находится ли эта точка левее или правее текущих координат рыбки
3. Скейлите рыбку в 1 или -1, или переходите на анимацию разворачивания рыбки
4. Определяете угол, на который должна быть повернута рыбка (тригонометрия)
5. Поворачиваете рыбку (с учетом скейла). Можно этот поворот так же включить в твин движения к точке, наверное даже будет естественней.
6. Поехали

ArtS 04.03.2013 16:18

Цитата:

Сообщение от Wolsh (Сообщение 1123485)
1. Вычисляете новую рандомную точку
2. Проверяете, находится ли эта точка левее или правее текущих координат рыбки
3. Скейлите рыбку в 1 или -1, или переходите на анимацию разворачивания рыбки
4. Определяете угол, на который должна быть повернута рыбка (тригонометрия)
5. Поворачиваете рыбку (с учетом скейла). Можно этот поворот так же включить в твин движения к точке, наверное даже будет естественней.
6. Поехали

А кодом не поможете)?

Wolsh 04.03.2013 17:05

Вложений: 1
Код AS3:

package 
{
        import com.greensock.TweenLite;
        import flash.display.Bitmap;
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author wolsh
        */

        public class Main extends Sprite
        {
                [Embed(source = "../lib/post-529562-12628386921211212.jpg")] private const Fish:Class;
                private var _fish:Bitmap;
                private var _targetX:Number;
                private var _targetY:Number;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        _fish = new Fish();
                        _fish.smoothing = true;
                        this.addChild(_fish);
 
                        _targetX = stage.stageWidth / 2;
                        _targetY = stage.stageHeight / 2;
                        go();
                }
 
                private function go():void
                {
                        var angle:Number = 180 / Math.PI * Math.atan2(_targetY - _fish.y, _targetX - _fish.x);
 
                        if (_targetX < _fish.x) TweenLite.to(_fish, 0.5, { scaleX: -1, rotation:180+angle, onComplete:onDirect } );
                        else if (_targetX > _fish.x) TweenLite.to(_fish, 0.5, { scaleX: 1, rotation:angle, onComplete:onDirect } );
                        else onDirect();
                }
 
                private function onDirect():void
                {
                        TweenLite.to(_fish, 1, { x: _targetX, y:_targetY, rotation:0, onComplete:onFloat } );
                }
 
                private function onFloat():void
                {
                        _targetX = Math.random() * stage.stageWidth;
                        _targetY = Math.random() * stage.stageHeight;
                        go();
                }
        }
}

FishAnimation.swf   (26.9 Кб)

ArtS 04.03.2013 17:50

Цитата:

Сообщение от Wolsh (Сообщение 1123496)
Код AS3:

package 
{
        import com.greensock.TweenLite;
        import flash.display.Bitmap;
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author wolsh
        */

        public class Main extends Sprite
        {
                [Embed(source = "../lib/post-529562-12628386921211212.jpg")] private const Fish:Class;
                private var _fish:Bitmap;
                private var _targetX:Number;
                private var _targetY:Number;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        _fish = new Fish();
                        _fish.smoothing = true;
                        this.addChild(_fish);
 
                        _targetX = stage.stageWidth / 2;
                        _targetY = stage.stageHeight / 2;
                        go();
                }
 
                private function go():void
                {
                        var angle:Number = 180 / Math.PI * Math.atan2(_targetY - _fish.y, _targetX - _fish.x);
 
                        if (_targetX < _fish.x) TweenLite.to(_fish, 0.5, { scaleX: -1, rotation:180+angle, onComplete:onDirect } );
                        else if (_targetX > _fish.x) TweenLite.to(_fish, 0.5, { scaleX: 1, rotation:angle, onComplete:onDirect } );
                        else onDirect();
                }
 
                private function onDirect():void
                {
                        TweenLite.to(_fish, 1, { x: _targetX, y:_targetY, rotation:0, onComplete:onFloat } );
                }
 
                private function onFloat():void
                {
                        _targetX = Math.random() * stage.stageWidth;
                        _targetY = Math.random() * stage.stageHeight;
                        go();
                }
        }
}

FishAnimation.swf   (26.9 Кб)

Буду очень Вам благодарен, если скините fla. исходник, и код в кадрах будет)))

Добавлено через 1 минуту
А то не очень разобрался.....

iflamberg 04.03.2013 18:16

Тут код в классе намного комфортней использовать, чем код в кадре, так что лучше разберитесь. Вот вам коментариев в помощь.
Код AS3:

package 
{
        import com.greensock.TweenLite;
        import flash.display.Bitmap;
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author wolsh
        */

//достаточно запихнуть этот код в файл Main.as, кинуть файл в ту же папку, что и компилируемый ролик, связать ролик с классом Main
        public class Main extends Sprite
        {
                //внедряем картинку рыбки в ролик
                [Embed(source = "../lib/post-529562-12628386921211212.jpg")] private const Fish:Class;
                private var _fish:Bitmap; // это класс, куда внедрили картинку
                private var _targetX:Number;
                private var _targetY:Number;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void //входная точка, этот код выполнится один раз после старта
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        _fish = new Fish(); //создаем экземпляр рыбки
                        _fish.smoothing = true;
                        this.addChild(_fish); //кидаем рыбку на сцену
                        //_targetX, targetY - переменные класса(их видно во всех других функциях класса), которые хранят координаты, куда мы хотим направить рыбку. Рыбка кидается на сцену в координатах 0,0, изначально мы направляем ее в центр сцены
                        _targetX = stage.stageWidth / 2;
                        _targetY = stage.stageHeight / 2;
                        go(); //отсюда переходим в go
                }
 
                //до того, как отправить рыбку в плавание к точке, нужно развернуть ее в нужном направлении
                private function go():void
                {
                        var angle:Number = 180 / Math.PI * Math.atan2(_targetY - _fish.y, _targetX - _fish.x); //эту формулу надо знать, как "отче наш", формула определяет угол на который надо повернуть рыбу, чтобы она из своих текущих координат, смотрела на _targetX, targetY, 180 / Math.PI - перевод из радиан в градусы, потому что свойство .rotation спрайта принимает градусы, а результат Math.atan2 в радианах
                        //используется так же scaleX=-1 или scaleX=-1. Это масштабирование по оси x. scaleX=-1 равносильно flip horizontal
                        if (_targetX < _fish.x) TweenLite.to(_fish, 0.5, { scaleX: -1, rotation:180+angle, onComplete:onDirect } )//используется onComplete. После завершения твина, рыбка повернута к искомой точке носом, будет вызвана функция onDirect
                        else if (_targetX > _fish.x) TweenLite.to(_fish, 0.5, { scaleX: 1, rotation:angle, onComplete:onDirect } );
                        else onDirect();
                }
 
                //вызывается, когда рыбка уже повернута к точке носом, отправляем ее в плавание к точке
                private function onDirect():void
                {
                        TweenLite.to(_fish, 1, { x: _targetX, y:_targetY, rotation:0, onComplete:onFloat } ); //по завершению твина будет вызвана ф-я onFloat
                }
 
                //рыбка закончила плавание к точке, выбираем ей новую точку для плавания
                private function onFloat():void
                {
                        _targetX = Math.random() * stage.stageWidth;
                        _targetY = Math.random() * stage.stageHeight;
                        go();
                }
        }
}


ArtS 04.03.2013 18:21

Цитата:

Сообщение от iflamberg (Сообщение 1123516)
Тут код в классе намного комфортней использовать, чем код в кадре, так что лучше разберитесь. Вот вам коментариев в помощь.
Код AS3:

package 
{
        import com.greensock.TweenLite;
        import flash.display.Bitmap;
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author wolsh
        */

//достаточно запихнуть этот код в файл Main.as, кинуть файл в ту же папку, что и компилируемый ролик, связать ролик с классом Main
        public class Main extends Sprite
        {
                //внедряем картинку рыбки в ролик
                [Embed(source = "../lib/post-529562-12628386921211212.jpg")] private const Fish:Class;
                private var _fish:Bitmap; // это класс, куда внедрили картинку
                private var _targetX:Number;
                private var _targetY:Number;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void //входная точка, этот код выполнится один раз после старта
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        _fish = new Fish(); //создаем экземпляр рыбки
                        _fish.smoothing = true;
                        this.addChild(_fish); //кидаем рыбку на сцену
                        //_targetX, targetY - переменные класса(их видно во всех других функциях класса), которые хранят координаты, куда мы хотим направить рыбку. Рыбка кидается на сцену в координатах 0,0, изначально мы направляем ее в центр сцены
                        _targetX = stage.stageWidth / 2;
                        _targetY = stage.stageHeight / 2;
                        go(); //отсюда переходим в go
                }
 
                //до того, как отправить рыбку в плавание к точке, нужно развернуть ее в нужном направлении
                private function go():void
                {
                        var angle:Number = 180 / Math.PI * Math.atan2(_targetY - _fish.y, _targetX - _fish.x); //эту формулу надо знать, как "отче наш", формула определяет угол на который надо повернуть рыбу, чтобы она из своих текущих координат, смотрела на _targetX, targetY, 180 / Math.PI - перевод из радиан в градусы, потому что свойство .rotation спрайта принимает градусы, а результат Math.atan2 в радианах
                        //используется так же scaleX=-1 или scaleX=-1. Это масштабирование по оси x. scaleX=-1 равносильно flip horizontal
                        if (_targetX < _fish.x) TweenLite.to(_fish, 0.5, { scaleX: -1, rotation:180+angle, onComplete:onDirect } )//используется onComplete. После завершения твина, рыбка повернута к искомой точке носом, будет вызвана функция onDirect
                        else if (_targetX > _fish.x) TweenLite.to(_fish, 0.5, { scaleX: 1, rotation:angle, onComplete:onDirect } );
                        else onDirect();
                }
 
                //вызывается, когда рыбка уже повернута к точке носом, отправляем ее в плавание к точке
                private function onDirect():void
                {
                        TweenLite.to(_fish, 1, { x: _targetX, y:_targetY, rotation:0, onComplete:onFloat } ); //по завершению твина будет вызвана ф-я onFloat
                }
 
                //рыбка закончила плавание к точке, выбираем ей новую точку для плавания
                private function onFloat():void
                {
                        _targetX = Math.random() * stage.stageWidth;
                        _targetY = Math.random() * stage.stageHeight;
                        go();
                }
        }
}


А если несколько рыбок, то как?

iflamberg 04.03.2013 18:26

Вам две страницы разжевывают до состояния кашицы. Вы сами попробовать включить мозг не хотите? Может зарплату тоже за вас получить?


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

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