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

Dr_Bra 08.09.2010 13:38

программная анимация, поведение рыбок в аквариуме
 
Вложений: 1
Всем привет!
Мы сделали аквариум и в него запустили рыбку, заставили ее плавать. НО она сейчас немного "психованая" :wacko: потому что я не могу заставить ее правильно делать разворот и, наверное, отступ от стен аквариума.

Помогите, пожалуйста, придумать, как бы заставить нашу рыбку совершать подходящий разворот, что бы она не "залипала" у стенки аквариума.

Превьюшка в аттача.

А вот код:
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class FishScript extends Sprite
        {
                private var speed:Number;
                private var clipRotation:Number;
                private var angle:Number;
                private var xMove:Number;
                private var yMove:Number;
                private var radius:Number;
                private var fish:Sprite;
 
                public function FishScript():void
                {
                        trace ("FishScript loaded");
 
                        fish = aquarium_mc.fish_mc;
                        fish.addEventListener(Event.ENTER_FRAME, moveMyFish);
 
                        randomValue();
                        fish.rotation = clipRotation;
                }
 
                private function randomValue():void
                {
                        clipRotation = Math.floor(Math.random() * 360);
                        speed = Math.floor(Math.random() * 5 + 1);
                        angle = clipRotation * Math.PI / 180;
                        xMove = speed * Math.cos(angle);
                        yMove = speed * Math.sin(angle);
                }
 
                private function moveMyFish(evt:Event):void
                {
                        radius = 190 - evt.target.width/2; // "190" – это радиус аквариума, а "evt.target.width/2" – радиус рыбки
 
                        if((evt.target.x * evt.target.x) + (evt.target.y * evt.target.y) > radius * radius)
                        {
                                randomValue();
                                evt.target.rotation = clipRotation;
                        }
 
                        evt.target.x += xMove;
                        evt.target.y += yMove;
                }
        }
}


Jewelz 08.09.2010 14:40

думаю тут проблема в том, что условие
Код AS3:

if((evt.target.x * evt.target.x) + (evt.target.y * evt.target.y) > radius * radius)

выполняется несколько раз подряд

вобще наверное немного неверный подход использован,

во первых, рыбка не плавает вот так:
http://www.flasher.ru/forum/attachme...1&d=1283936913

но это скорее всего обычная недоработка, суть в алгоритме:

рыбка не плавает от края к краю, значит нам нужно просто узнать следующее положение рыбки и двигать ее туда:

мы имеем круглый аквариум, и знаем текущее положение рыбки, довольно просто вычислить следующее положение - например так: нужно взять случайный угол между 0 и 360 град. и от центра аквариума взять случайное расстояние по этому направлению, но не меньше какого-то значения.. скажем r/4, и не больше r (r-радиус аквариума)

http://www.flasher.ru/forum/attachme...1&d=1283938341

далее я бы просто использовал бы Tweener и двигал рыбку с неким easeInOutSine до этой точки, после достижения ее, выбираем следущую точку, да и еще нужно исключить точки выше зеленой линии, так как там воды нет

http://www.flasher.ru/forum/attachme...1&d=1283938544

p.s. вобще надо посмотреть видео реальных аквариумов, как там плавают рыбки, то есть врятли у них все время одинаковая скорость, + угол подъема наверно не больше 30-40 градусов (в нормальных условиях), + они имеют свойство просто "стоять" на месте, вобщем алгоритм на самом деле не такой простой если нужно добиться хоть какого-то реализма

Dr_Bra 13.09.2010 18:28

а есть событие, которое отслеживает завершился данный Tweener или нет?
Чтобы по этому событию генерировать новую точку внутри аквариума.

Jewelz 13.09.2010 18:31

там в параметрах есть аргумент onComplete:someFunc, someFunc - ф-я, которая вызовется после завершения анимации

http://hosted.zeh.com.br/tweener/docs/en-us/

chabapok 19.09.2010 17:13

если в матмоделе соударения двух шариков рандомно пробежаться и позаменять знаки + на -, и рандомно к некоторым углам добавить 90 градусов, то получается типичное поведение рыбок. красиво смотрится когда их много -- часть иногда плавает парами, часть друг за другом гоняется, некоторые иногда встречая стенку плывут вдоль нее, а встречая вблизи друг друга они подплывают близко и потом начинают один за другим гоняться.

где именно менять знаки не скажу -- там творческий процесс. %)

f.g.programmer 19.09.2010 18:10

Если нужно по проще, то после условия выхода за пределы аквариума нужно возвращать рыбку обратно в аквариум.

Например так:
Код AS3:

var p:Point = new Point(evt.target.x, evt.target.y);
p.normalize(radius-1);
evt.target.x = p.x;
evt.target.y = p.y;

И желательно вычислять направление не совсем рандомное, а направленное во внутрь аквариума.


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

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