Показать сообщение отдельно
Старый 04.03.2013, 18:45
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 22  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Оукай. Вот вам код в кадре.
Код 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.
__________________
мой пустой блог