![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2013
Сообщений: 19
|
Спасибо большое, не додумался)
Добавлено через 34 минуты Теперь осталось решить этот вопрос: |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
А у рыбы есть лево-право? Или, точнее, брюхо и спина?
Как она у вас будет разворачиваться в обратную сторону? Скейлом?
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Mar 2013
Сообщений: 19
|
Есть лево-право, и спина и брюхо.
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
1. Вычисляете новую рандомную точку
2. Проверяете, находится ли эта точка левее или правее текущих координат рыбки 3. Скейлите рыбку в 1 или -1, или переходите на анимацию разворачивания рыбки 4. Определяете угол, на который должна быть повернута рыбка (тригонометрия) 5. Поворачиваете рыбку (с учетом скейла). Можно этот поворот так же включить в твин движения к точке, наверное даже будет естественней. 6. Поехали
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Mar 2013
Сообщений: 19
|
Цитата:
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
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(); } } }
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Mar 2013
Сообщений: 19
|
Цитата:
Добавлено через 1 минуту А то не очень разобрался..... |
|
|||||
|
Регистрация: Jan 2009
Сообщений: 1,651
|
Тут код в классе намного комфортней использовать, чем код в кадре, так что лучше разберитесь. Вот вам коментариев в помощь.
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(); } } }
__________________
мой пустой блог |
|
|||||
|
Регистрация: Mar 2013
Сообщений: 19
|
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 07:55. |
|
|
« Предыдущая тема | Следующая тема » |
|
|