Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Tween и scaleX, scaleY (http://www.flasher.ru/forum/showthread.php?t=118945)

ptirA 08.12.2008 14:57

Tween и scaleX, scaleY
 
Привет!

Корректно написано? Есть, подозрения что нет ...
Код:

function mapScaleIn()
{
        var myTween_scaleX = new Tween(main_mc, "scaleX", Regular.easeIn, mainScaleX, mainScaleX + 0.5, 1, true);
        var myTween_scaleY = new Tween(main_mc, "scaleY", Regular.easeIn, mainScaleY, mainScaleY + 0.5, 1, true);
}

function mapScaleOut()
{
        var myTween_scaleX1 = new Tween(main_mc, "scaleX", Regular.easeIn, mainScaleX + 0.5, mainScaleX, 1, true);
        var myTween_scaleY2 = new Tween(main_mc, "scaleY", Regular.easeIn, mainScaleY + 0.5, mainScaleY, 1, true);
}


DarkLight 08.12.2008 15:32

1. Как минимум, обьявленные локальными переменными твины могут умереть до своего окончания.
2. Тип переменных желательно указывать
3. Нет завершения предыдущей функции: если одну вызвать до завершения другой, будет дергаться.

А корректно или нет, зависит от неизменности значения mainScale.

ptirA 08.12.2008 15:47

Спасибо огромное! Именно все как написал так и есть... те же проблемы(
если можно пункт 3 по подробнее.

P.S. программной анимацией пользуюсь впервые (

kackbip 08.12.2008 18:17

В третьем пункте говорится о том, что сразу два твина работают над одним свойством одного объекта. Из-за этого получается непонятная анимация. Вы представляете то суммарное движение которое получается в результате сложения двух твинов? Я тоже не представляю :) Потому нужно предыдущий останавливать.

ptirA 09.12.2008 15:55

Я хорошо представляю что происходит при сложении 2х твинов) борюсь с этим не первый день)

Давайте уточним правильно ли я понял. Имеется ввиду что когда выполняется mapScaleIn, mapScaleOut не должна быть доступна? И сделать это можно если ловить конечное значение mapScaleIn (начальное mapScaleOut) с помощью условия. Верно?

Fernando Costa 09.12.2008 16:01

рекомендую: http://blog.greensock.com/tweenmaxas3/

ptirA 09.12.2008 16:36

Спасибо. здорово)
мне всетаки кажется что с моим кодом проще разобраться и быстрее чем TweenMAX)

просто скажите плиз я в правильном направлении двигаюсь?

ситуация очень проста, по нажатию на карту она зумится, по 2у нажатию едет обратно, мне нужно чтоб в тот момент когда она зумится нельзя было вызвать mapScaleOut

+ вообще не люблю пользоваться чужими фреймворками, даже если они получены легальным путем, намного приятнее когда хорошо работает то, что написал сам.

DarkLight 09.12.2008 23:12

Цитата:

+ вообще не люблю пользоваться чужими фреймворками, даже если они получены легальным путем, намного приятнее когда хорошо работает то, что написал сам.
Со временем это проходит:) Тратить кучу времени на изобретение велосепида тоже не всегда хорошо.

AL.exe 10.12.2008 04:23

http://www.gskinner.com/libraries/gtween/ - вот этот класс, на мой взгляд, намного удобнее и нагляднее.

DarkLight 10.12.2008 12:19

Да, gTween и мой любимый тоже. Либо есть Tweener, в котором чуть больше фич. Вобщем на любителя.

ptirA 10.12.2008 16:26

за gTween спасбо! действительно неплохая и относительно простая в понимании штука, да вот только не решает она мой проблемы. Если кто нить понимает, подскажите плиз. Напоминаю.

по нажатию на карту она зумится, по 2у нажатию едет обратно, мне нужно чтоб в тот момент когда она зумится нельзя было вызвать mapScaleOut

как мне это отловить? если нужно могу выложить примерный код, весь не могу, там его дико много(

DarkLight 10.12.2008 16:55

Делаем флаг zoomAvailable, при старте твинов ставим его в false, подписываемся на окончание твинов (для gTween это Event.COMPLETE), и по окончании ставим его в true. В начале mapScaleOut и mapScaleIn поставить проверку:
Код AS3:

if(!zoomAvailable){
    return;
}


ptirA 10.12.2008 20:05

Я безбожно туп, с такими знаниями как у меня противопоказано пользоваться чужим кодом (gTween), что бы пользоваться чужими классами надо дойти до состояния, когда любая задача прозрачна, вот тогда в целях экономии времени можно и gTween использовать. Я делаю вот так:

Код AS3:

var zoomAvailable:Boolean;
 
var myTween_scaleX:Tween;
var myTween_scaleY:Tween;
var myTween_scaleX2:Tween;
var myTween_scaleY2:Tween;
 
 
myTween_scaleX.addEventListener(Event.COMPLETE, mapScaleIn);
myTween_scaleX2.addEventListener(Event.COMPLETE, mapScalOut);
 
function mapScaleIn()
{
        zoomAvailable = false;
        if (!zoomAvailable)
        {
          return;
        }
 
        myTween_scaleX = new Tween(main_mc, "scaleX", Regular.easeIn, mainScaleX, mainScaleXin, 1, true);
        myTween_scaleY = new Tween(main_mc, "scaleY", Regular.easeIn, mainScaleY, mainScaleYin, 1, true);
}
 
function mapScaleOut()
{
        zoomAvailable = true;
          if (!zoomAvailable)
        {
          return;
        }
        myTween_scaleX2 = new Tween(main_mc, "scaleX", Regular.easeIn, mainScaleXin, mainScaleX, 1, true);
        myTween_scaleY2 = new Tween(main_mc, "scaleY", Regular.easeIn, mainScaleYin, mainScaleY, 1, true);
}

и естественно что ничего не работает, подскажите пожалуйста безбожному тупице убившему на простую вещь много, много времени.

P.S. я понимаю что то, что я написал полный бред, хотябы из соображений логики.

DarkLight 10.12.2008 20:11

1. Фрагмент с if и присовением false флагу нужно ставить и в начале mapScaleOut. Кроме того, if должен быть до установки значения флага, а не после
2. у Tween, в отличие от gTween, событие окончания называется TweenEvent.MOTION_FINISH
3. Когда вы присваиваете переменный новый экземпляр твина, тогда и надо подписываться на момент окончания, т е строчки с подписью на окончание надо поставить внутри функций mapScaleIn/Out после создания твинов
4. По окончании твинов они должны вызывать функцию:
Код AS3:

function unlockTween(event:TweenEvent):void{
    zoomAvailable = true;
}


ptirA 10.12.2008 20:37

Код AS3:

var zoomAvailable:Boolean;
 
var myTween_scaleX:Tween;
var myTween_scaleY:Tween;
var myTween_scaleX2:Tween;
var myTween_scaleY2:Tween;
 
function unlockTween(event:TweenEvent):void
{
        zoomAvailable = true;
}
 
function mapScaleIn()
{
        if (!zoomAvailable)
        {
            return;
        }
 
        myTween_scaleX.addEventListener(TweenEvent.MOTION_FINISH, unlockTween);
        myTween_scaleX2.addEventListener(TweenEvent.MOTION_FINISH, unlockTween);
 
        myTween_scaleX = new Tween(main_mc, "scaleX", Regular.easeIn, mainScaleX, mainScaleXin, 1, true);
        myTween_scaleY = new Tween(main_mc, "scaleY", Regular.easeIn, mainScaleY, mainScaleYin, 1, true);
}
 
function mapScaleOut()
{
        if (!zoomAvailable)
        {
                  return;
        }
 
        myTween_scaleX.addEventListener(TweenEvent.MOTION_FINISH, unlockTween);
        myTween_scaleX2.addEventListener(TweenEvent.MOTION_FINISH, unlockTween);
 
        myTween_scaleX2 = new Tween(main_mc, "scaleX", Regular.easeIn, mainScaleXin, mainScaleX, 1, true);
        myTween_scaleY2 = new Tween(main_mc, "scaleY", Regular.easeIn, mainScaleYin, mainScaleY, 1, true);
}

Ругается на TweenEvent в unlockTween
1046: Type was not found or was not a compile-time constant: TweenEvent.

DarkLight 10.12.2008 20:40

Код AS3:

import fl.events.TweenEvent

пропишите
...и
Код AS3:

zoomAvailable = false

- куда делось? Просто после if поставить, а не удалить насовсем

Код AS3:

if (!zoomAvailable){
  return;
}
zoomAvailable = false

Подпись на события должна быть в самом конце функции, и только для пересозданных твинах - т е addEventListener для myTween_scaleX2 не нужен в mapScaleIn, а для myTween_scaleX - не нужен в mapScaleOut:)

ptirA 10.12.2008 20:52

Вы уверены что именно так? У меня он даже в хелпе такого не находит.
У меня прописано
Код AS3:

import fl.transitions.Tween;

ОПЛЯ! прописал fl.transitions.TweenEvent; ошибка ушла, но попрежнему не работает, т.е. все работает да вот только по старому (работает mapScaleOut до окончания mapScaleIn)

Добавлено через 37 минут
Окей) Вот

Код AS3:

import fl.transitions.TweenEvent;
 
var zoomAvailable:Boolean;
 
var myTween_scaleX:Tween;
var myTween_scaleY:Tween;
var myTween_scaleX2:Tween;
var myTween_scaleY2:Tween;
 
 
function unlockTween(event:TweenEvent):void
{
        zoomAvailable = true;
}
 
function mapScaleIn()
{
        if (!zoomAvailable)
        {
            return;
        }
        zoomAvailable = false;
        myTween_scaleX.addEventListener(TweenEvent.MOTION_FINISH, unlockTween);
        myTween_scaleY.addEventListener(TweenEvent.MOTION_FINISH, unlockTween);
 
        myTween_scaleX = new Tween(main_mc, "scaleX", Regular.easeIn, mainScaleX, mainScaleXin, 1, true);
        myTween_scaleY = new Tween(main_mc, "scaleY", Regular.easeIn, mainScaleY, mainScaleYin, 1, true);
}
 
function mapScaleOut()
{
        if (!zoomAvailable)
        {
                  return;
        }
        zoomAvailable = false;
        myTween_scaleX2.addEventListener(TweenEvent.MOTION_FINISH, unlockTween);
        myTween_scaleY2.addEventListener(TweenEvent.MOTION_FINISH, unlockTween);
 
        myTween_scaleX2 = new Tween(main_mc, "scaleX", Regular.easeIn, mainScaleXin, mainScaleX, 1, true);
        myTween_scaleY2 = new Tween(main_mc, "scaleY", Regular.easeIn, mainScaleYin, mainScaleY, 1, true);
}

Что происходит. Теперь не зумится вообще. Если во время работы mapScaleIn вызвать mapScaleOut, main_mc прыгает в конечную точку и начинает возвращаться назад. А если по русски, то когда жмешь на кнопку, происходит движение карты в заданные координаты (другая функция, не суть), но !без зума! Есл нажать на кнопку еще раз (вызвать mapScaleOut) карта прыгает на конечные координаты и пытается ехать обратно, если продолжать паралитично жать на кнопку она дергается на конечных координатах. (((

DarkLight 10.12.2008 21:31

Код AS3:

var zoomAvailable:Boolean = true;
var myTween_scaleX:Tween;
var myTween_scaleY:Tween;
var myTween_scaleX2:Tween;
var myTween_scaleY2:Tween;
 
 
function unlockTween(event:TweenEvent):void
{
        zoomAvailable = true;
}
 
function mapScaleIn()
{
        if (!zoomAvailable)
        {
            return;
        }
        zoomAvailable = false;
        myTween_scaleX = new Tween(main_mc, "scaleX", Regular.easeIn, mainScaleX, mainScaleXin, 1, true);
        myTween_scaleY = new Tween(main_mc, "scaleY", Regular.easeIn, mainScaleY, mainScaleYin, 1, true);
        myTween_scaleX.addEventListener(TweenEvent.MOTION_FINISH, unlockTween);
}
 
function mapScaleOut()
{
        if (!zoomAvailable)
        {
                  return;
        }
        zoomAvailable = false;
        myTween_scaleX2 = new Tween(main_mc, "scaleX", Regular.easeIn, mainScaleXin, mainScaleX, 1, true);
        myTween_scaleY2 = new Tween(main_mc, "scaleY", Regular.easeIn, mainScaleYin, mainScaleY, 1, true);
        myTween_scaleX2.addEventListener(TweenEvent.MOTION_FINISH, unlockTween);
}

У Вас так?

ptirA 10.12.2008 21:44

Теперь так) Зумится) но все равно когда одна из функций выполняется, вторая вызывается паралитическими кликами и карта по прежнему скачет в конечных координатах.

DarkLight 10.12.2008 21:47

Потрейсите zoomAvailable в начале функций, если переменная нигде больше не меняется, так не может быть, т к оно false всегда, когда Tween-ы выполняются

ptirA 10.12.2008 21:50

Спасибо Вам огромное! Я по ковыряюсь седня ночкой, если результатов не будет, завтра выложу сюда мини исходник. Еще раз ОГРОМНОЕ спасибо!

ptirA 11.12.2008 14:46

миниИсходник
 
Вложений: 2
Промарочился ночку( толку нет( выкладываю миниИсходник(

P.S. двумя арихивами( в 1 не влазиет(


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

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