PDA

Просмотр полной версии : Глючная анимация.


MadEx
28.10.2011, 20:54
Здравствуйте!

Разрабатываю флешку для сайта. Посмотреть можно тут http://94.229.12.216/ Так вот, соты должны увеличиваться при наведении (плавно, анимированно, красиво) и уменьшаться в обратном направлении так же плавно и красиво, когда мышку убираешь. Я сделал анимацию с помощью твинов, но вот незадача: если активно поёрзать мышкой по сотам, то они начинают сдвигаться с места. Причем чем дольше ставишь duration для tween'а, тем больше вероятность что сота уползет в сторону.

Вот код класса соты:

package main{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.*;
import flash.filters.*;
//import fl.motion.Animator;
//import flash.display.Sprite;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
import flash.text.TextField;
import flash.geom.Point;

dynamic public class sota extends MovieClip{
var Tweens = new Array();
var Picture = new MovieClip();
public var Title:String = "";
public var Desc:String = "";
public var Link:String = "";


public function sota() {
// constructor code
buttonMode = true;
useHandCursor = true;
addEventListener(MouseEvent.ROLL_OVER, SotaEnter);
addEventListener(MouseEvent.ROLL_OUT, SotaLeave);
addEventListener(MouseEvent.CLICK, gotourl);

}
public function getPicture(pic:MovieClip):void {
Picture = pic;
}
public function setTitle(titl:String):void {
Title = titl;
}
public function setDesc(titl:String):void {
Desc = titl;
}
public function setLink(titl:String):void {
Link = titl;
}
public function SotaEnter(e:MouseEvent):void {
// Поднимаем соту выше остальных
this.parent.addChildAt(this, parent.numChildren-1);

(parent.parent as MovieClip).desc.text = Desc;
title.text = Title;
Tweens[8] = new Tween(plashka, "alpha", Strong.easeOut, 0, 1, 1, true);

addChildAt(title, numChildren-1);
if(Picture.name != Picture.parent.getChildAt(Picture.parent.numChildren-1).name) {
Picture.parent.addChildAt(Picture, Picture.parent.numChildren-1);
var myTween:Tween = new Tween(Picture, "alpha", Strong.easeOut, 0, 1, 1, true);
}

// Запишем анимацию увеличения соты

Tweens[0] = new Tween(contur, "scaleX", Back.easeOut, 1, 1.2, 10, false);
Tweens[1] = new Tween(contur, "x", Back.easeOut, contur.x, contur.x-0.1*contur.width, 10, false);
Tweens[2] = new Tween(contur, "scaleY", Back.easeOut, 1, 1.2, 10, false);
Tweens[3] = new Tween(contur, "y", Back.easeOut, contur.y, contur.y-0.1*contur.height, 10, false);
Tweens[4] = new Tween(maska, "scaleX", Back.easeOut, 1, 1.2, 10, false);
Tweens[5] = new Tween(maska, "x", Back.easeOut, maska.x, maska.x-0.1*maska.width, 10, false);
Tweens[6] = new Tween(maska, "scaleY", Back.easeOut, 1, 1.2, 10, false);
Tweens[7] = new Tween(maska, "y", Back.easeOut, maska.y, maska.y-0.1*maska.height, 10, false);


// Добавляем фильтр свечения
// Параметры свечения
var color:Number = 0x33CCFF;
var alpha:Number = 0.8;
var blurX:Number = 8;
var blurY:Number = 8;
var strength:Number = 2;
var inner:Boolean = false;
var knockout:Boolean = false;
var quality:Number = BitmapFilterQuality.HIGH;

// Сам фильтр
var filterG = new GlowFilter(color,
alpha,
blurX,
blurY,
strength,
quality,
inner,
knockout);

// Добавляем фильтр в список фильтров
filters = [filterG];
trace("up");

}
public function SotaLeave(e:MouseEvent):void {

for each (var myTween in Tweens) {
myTween.yoyo();
}

// Очищаем значение фильтра
filters = [];
title.text = '';
trace("down");
}
public function gotourl(e:MouseEvent) {
var my_request:URLRequest = new URLRequest(Link);
navigateToURL(my_request, "_self");
}
}

}


Сами соты представляю собой картинки с масками в виде соты и контуром соты:
http://cl.ly/3p262n2d1j3Q171D3x3s


У кого-нибудь есть идеи по поводу данного глюка?

goodguy
28.10.2011, 21:24
Потому что пока твин не завершен, у свойств объекта одни значения, когда завершен, уже другие, а если твин запустить пока он еще не завершился, то новые значения добавляются не к исходным, а к тем, что есть на данный момент.
+ Стандартные твины сами по себе, мягко говоря, не очень. Лучше использовать greensock tweenlitte или tweenmax, или caurina tweener

dsQuadro
28.10.2011, 21:25
если сделать начало координат в центре соты и не двигать ее при анимации, а только масштабировать эта проблема должна пропасть, но со временем они и масштабироваться начинают криво...

MadEx
01.11.2011, 13:54
если сделать начало координат в центре соты и не двигать ее при анимации, а только масштабировать эта проблема должна пропасть, но со временем они и масштабироваться начинают криво...

А как мне перенести начало координат в центр соты? На сколько я понял - твин всё равно от левого вернхнего угла будет масшабироваться - поэтому двигать его обязательно.

Vektor
01.11.2011, 14:20
Жестко, установите, начальные координаты, для клипов, и в конце анимации, устанавливайте клип на место.

MadEx
01.11.2011, 14:25
Жестко, установите, начальные координаты, для клипов, и в конце анимации, устанавливайте клип на место.

Я пробовал сделать так:
При добавлении соты взять начальные координаты контура и маски и записать в глобальную переменную.
В событие SotaLeave после выполнения анимации вернуть соту на место. Т.е. видимо надо попробвать эту операцию выполнить в событии Motion.STOP ?

Добавлено через 5 часов 27 минут
Разобрался с пененосом центра координат и соты убегать перестали