Вход

Просмотр полной версии : Некорректная работа Tween


Волгоградец
10.12.2007, 12:34
Привет. Вот код перемещения клипа при клике мышкой на рабочем поле в точку клика. Проблема в следующем: при столкновении с объектом клип иногда ведет себе как должен - т.е. останавливается - а иногда как будто отскакивает - т.е. резко появляется в случайном месте экрана далеко от препятствия.
_root.onMouseDown = function (){
c = this._xmouse;
d = this._ymouse;
import mx.transitions.Tween;
var a:Tween = new Tween(ball, "_x", mx.transitions.easing.None.easeNone, ball._x, c, 1, true);
var b:Tween = new Tween(ball, "_y", mx.transitions.easing.None.easeNone, ball._y, d, 1, true);
ball.onEnterFrame = function (){
if (this.hitTest(square)){
q = this._x;
w = this._y;
//trace (this._x);
//trace (this._y);
a.stop ();
b.stop ();
delete this.onEnterFrame;
if (this._x <= 300){
this._x = q - 2;
this._y = w - 2;
}
if (this._x >= 300){
this._x = q + 2;
this._y = w + 2;
}
}
}
}

В чем проблема? Или это кривые руки?
P.S.: может кто-то подскажет другой вариант поведения клипа при столкновении.

Вот исходник:

wvxvw
10.12.2007, 12:42
Лучше не в onEnterFrame проверять а в onMotionChanged того твина, который работает с клипом, который нужно хиттестить. Да и объекты лучше одним твином двигать, а не двумя...

CrazyFlasher
10.12.2007, 12:45
по мне так лучше вообще этот твин не использовать!:rtfm:

Волгоградец
10.12.2007, 13:47
wvxvw, научи пжлста, как в один твин запихнуть изменение по _x и _y...
СумашедшийФлэшер, почему его лучше не использовать? На форуме ему (Твину) дифирамбы поют...

etc
10.12.2007, 13:58
Поищите TweenExtended.

Волгоградец
10.12.2007, 14:41
__etc, поискал. Нашел. А как теперь использовать? Я с ООП как-то не очень... Как вообще добавлять сторонние классы? Import'ом? Или в специальную папку нужно положить? Сори за ламерский вопрос...

Добавлено: файл .mxp.

etc
10.12.2007, 14:48
В каком виде? В mxp?

Волгоградец
10.12.2007, 16:05
Файл в .mxp.

etc
10.12.2007, 16:10
Ну тогда надо просто запустить его (если не запускается, то установить через Extension Manager). Документация по классу появится потом в панели хелпа.

wvxvw
10.12.2007, 16:14
Да ну, нормально он работает (Твин в смысле)...
import mx.transitions.Tween;
import mx.transitions.easing.*;
//
var tw:Tween = new Tween(mc,"_x",Regular.easeInOut,0,300,3,true);
tw.onMotionChanged = function():Void {
trace(this.time); // Время, сколько проигрывается анимация
trace(this.position); // 1..0, значение изменения параметра, который анимируется (0-изначальное положение, 1-конечное).
trace(this.obj); // Ссылка на объект, который анимируется.
this.obj._y = this.obj._x;
}
а класс Tween ничем особенным от других кем угодно написаных классов не отличается. Можно и самому его аналог написать, и пользоваться другими, вот, еще есть MCTween - я спокойно живу с тем, что пришло вместе с Флешем и мне хватает %)

CrazyFlasher
10.12.2007, 17:08
Можно и самому его аналог написать
я как раз таки так и делаю и другим советую...твин в топку (это касается и стандартных компонентов) :) Для простых вещей может он и удобен, но испольщзовать в больших проектах лучше не стоит...ломает структуру кода и диктует свои правила :)

Волгоградец
10.12.2007, 17:10
__etc, спасибо.
wvxvw, как же в твоем примере изменение по _y происходит? Там же начальные и конечные координаты по _y должны отличаться от _x? И что означает строчка import mx.transitions.easing.*? Почему она у тебя отдельно?

wvxvw
10.12.2007, 19:04
import mx.transitions.easing.* - импорт всего пакета (набора классов) easing.
В нем содержатся ф-ции рассчитывающие изменение в еденицу времени.
А что мешает привязаться к своийству position и на его основе рассчитывать _y?
import mx.transitions.Tween;
import mx.transitions.easing.*;
//
var __xFrom:Number = 0;
var __xTo:Number = 300;
var __yFrom:Number = 50;
var __yTo:Number = 200;
var tw:Tween = new Tween(mc,"_x",Regular.easeInOut,__xFrom,__xTo,3,true);
tw.onMotionChanged = function():Void {
this.obj._y = __yFrom+__yTo*(this.position/__xTo);
trace(this.obj._y);
}
//====================================
function onMotionChanged(t:Tween, pos:Number){
trace(t+" : is at "+pos+" right now");
}
tw["addListener"](this);Мало того, можно подписаться на те же твиновские события в духе броадкастер-листенер, и подисать на них, соответсвенно, все что угодно, в какоум угодно количестве =)

alekslitvinenk
10.12.2007, 19:13
А класс Fuse использовать для того чтобы двигать объекты не вариант ?
Конечно он не лишен некоторых глюков (например для меня стало настоящей неожиданностью что конструктор класса можно объявлять только в том методе где он непосредственно используется иначе зело глючит), но вцелом вещь достаточно удобная и можно менять сколько угодно параметров (_x, _y, _alpha...)

Волгоградец
10.12.2007, 20:51
Мало того, можно подписаться на те же твиновские события в духе броадкастер-листенер, и подисать на них, соответсвенно, все что угодно, в какоум угодно количестве =)
Почти ничего не понял - рано мне еще, мало знаний ). Все остальное понятно. Спасибо тебе большое!

alekslitvinenk, про Fuse ничего не знаю. Почитаю. Спасибо.