Форум 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 04.03.2013 18:29

Цитата:

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

Просто если бы код был бы в кадрах, я бы додумался, а в класса, а даже не имею представление как вторую рыбку сделать.....поэтому и написал что лучше мне писать в кадрах)

iflamberg 04.03.2013 18:45

Оукай. Вот вам код в кадре.
Код AS3:

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

 
                //внедрить картинку, когда пишите код в кадре не получится, поэтому будем считать, что у вас в библиотеке есть мувик(не битмап) Fish c включенным export to actionscript
                var _fish:MovieClip; //пока просто пустая ссылка
 
                var _targetX:Number; //переменные видно во всех функциях ролика
                var _targetY:Number;
 
                init ();//обрати внимание, функция будет вызвана один раз после старта
 
                function init():void
                {
                        _fish = new Fish(); //создаем экземпляр рыбки
                        //_fish.smoothing = true; //если рыбка мувик, а не битмап, то сглаживание и так будет
                        this.addChild(_fish); //кидаем рыбку на сцену
                        //_targetX, targetY - переменные которые хранят координаты, куда мы хотим направить рыбку. Рыбка кидается на сцену в координатах 0,0, изначально мы направляем ее в центр сцены
                        _targetX = stage.stageWidth / 2;
                        _targetY = stage.stageHeight / 2;
                        go(); //отсюда переходим в go
                }
 
                //до того, как отправить рыбку в плавание к точке, нужно развернуть ее в нужном направлении
                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();
                }
 
                //вызывается, когда рыбка уже повернута к точке носом, отправляем ее в плавание к точке
                function onDirect():void
                {
                        TweenLite.to(_fish, 1, { x: _targetX, y:_targetY, rotation:0, onComplete:onFloat } ); //по завершению твина будет вызвана ф-я onFloat
                }
 
                //рыбка закончила плавание к точке, выбираем ей новую точку для плавания
                function onFloat():void
                {
                        _targetX = Math.random() * stage.stageWidth;
                        _targetY = Math.random() * stage.stageHeight;
                        go();
                }

Почти ничего не изменилось, не правда ли?

Подсказки.
1) Если надо несколько рыбок, значит надо в цикле просто создать несколько мувиков с рыбками
2) Если рыбок несколько, то нужно как-то указать функциям, запускающим движение, для какой-конкретно рыбки запустить движение. Значит функция должна принимать параметр - ссылку на мувик рыбки и использовать его дальше в коде.
3) Когда твин завершается, то с помощью onComplete он запускает следующую функцию логики. Но теперь эти функции принимают параметр, как его передать? В для этого существует onCompleParams.

Tails 04.03.2013 18:54

iflamberg,
Всё же, наверное, нужно немного помягче :)

iflamberg 04.03.2013 18:57

Я был вежлив, как мать Тереза

Hauts 04.03.2013 19:50

Цитата:

Я был вежлив, как мать Тереза
Который раз хамство.

Сначала про зарплату сказать, а потом всё-таки и скинуть код. Не понимаю я этого.

iflamberg, если не хотите помогать — не делайте этого. А хамить не стоит тем, кто просит помочь.

iflamberg 04.03.2013 20:07

Да, соглашусь, я был слишком прямолинеен и груб. Просто был крайне раздражен нежеланием автора топика хотя бы чуть-чуть поработать самостоятельно, может быть, я такое поведение тоже считаю хамством, проявлением крайнего неуважения к участникам форума.
К сожелению, "написанное не вырубишь топором"(или сказанное, не помню, как было в поговорке), тем более, если оно процитированно следующим постом. Если я заслуживаю плюса или бана по мнению администрации - так тому и быть.

ArtS 04.03.2013 22:25

Цитата:

Сообщение от iflamberg (Сообщение 1123544)
Да, соглашусь, я был слишком прямолинеен и груб. Просто был крайне раздражен нежеланием автора топика хотя бы чуть-чуть поработать самостоятельно, может быть, я такое поведение тоже считаю хамством, проявлением крайнего неуважения к участникам форума.
К сожелению, "написанное не вырубишь топором"(или сказанное, не помню, как было в поговорке), тем более, если оно процитированно следующим постом. Если я заслуживаю плюса или бана по мнению администрации - так тому и быть.

Ну я же новичёк, осваиваю, учусь, пытаюсь что-то делать. Если я не понимаю что мне пишут, я переспрашу, попрошу сделать более удобнее для новичка)

Александр Мостовой 05.03.2013 08:44

ВОт так
http://ushan.org/ru/pages/portfolio/...les/fishes.swf


TweenLite здесь не подойдет. У рыбки должны быть виртуальные координаты направления к цели, скорость, ускорение. Если ее она проплыла мимо цели, то должна замедлится стремясь вернуться назад, пока не дойдет до нудной точки. ПРиблизительно как и человек на велосипеде :) Потом угол поворота направления тоже не может меняться мгновенно в реальной жизни, и у него тоже должна быть своя скорость и ускорение.
Вы говорите новичек, в принципе знания ООП здесь не обязательны, но если не было навыков раоты с кинематикой то вам будет сложновато, попробуйте для начала написать классичискую задачку с падающим на землю и отскакивающим от нее мячиком :) Или движением палочки по касательной к элипсу. :)

Добавлено через 5 минут
Или, даже лучше всего, алгоритм выпущенной стрелы.
Только без TweenLite на уровне задания скорости и ускорения свободного падения

Добавлено через 28 минут
Вот вам для начала основа для экспериментов:
http://wonderfl.net/c/adZE (на этом сервисе можете писать код и компилить прямо на сайте)


Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Test2 extends Sprite
        {
                private var sprite        :Sprite;
                private var speedX        :Number = 5;
                private var speedY        :Number = -3;
                private var grvity        :Number = 0.1;
 
                public function Test2()
                {
                        init();
                }
 
                private function init():void
                {
                        initSptrite();
                        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
 
                }
 
                private function initSptrite():void
                {
                        sprite = new Sprite();
                        addChild(sprite);
                        sprite.graphics.beginFill(0x0000ff);
                        sprite.graphics.drawEllipse(0, 0, 20, 3);
                        sprite.x = 20;
                        sprite.y = 100;
                }
 
                private function update():void
                {
                        sprite.x += speedX;
                        speedY += grvity;
                        sprite.y += speedY;
                        var rotationRad:Number = Math.atan2(speedY, speedX);
                        sprite.rotation = rotationRad  / Math.PI * 180;
                }
 
                private function enterFrameHandler(event:Event):void
                {
                        update();
                }
 
        }
}

Вам задание: сделайте так что бы стрела меняла направление скорости и летела в точку клика. (Подсказка: высчитывай скорость по Х и по Y умножив модуль скорости на cos и sin угла к цели соответственно)

RedLizard 05.03.2013 12:16

К вопросу о рыбах :) Недавно на досуге прототип игрушки начал писать http://pixorama.ru/demo/bigfish/ Тоже твинером движение сделал http://pixorama.ru/demo/bigfish/


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

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