Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Перемещение картинки с помощью изменения ее координат (http://www.flasher.ru/forum/showthread.php?t=202793)

MikroAcse 12.08.2013 19:40

Я вот не понимаю, чем вам так нравится tweenlite/max. Код ужасен. Лицензия очень ограничивает.
Тем более actuate кросс-платформенный.

Котейка 12.08.2013 20:09

Цитата:

Как, используя TweenLite, переместить картинку из (10, 50) в (20, 100), а затем в (40, 200)?
Код AS3:

 
ani(myStar1, [{x:20,y:100},{x:40,y:200}], 1);
 
function ani(object:DisplayObject, coords:Array, speedt:int = 1):void
{
        if (coords.length)
        {
                var nextCoords:Object = coords.shift();
                TweenLite.to(object, speedt, { x:nextCoords.x, y:nextCoords.y, onComplete:ani, onCompleteParams:[object, coords, speedt] } );
        }
}

А вообще советую вам основательно подучить AS. Перемещение объекта это же самые азы.

UserSuperPupsik 12.08.2013 22:12

Я скачал файл greensock-v12-as3.zip вот отсюда http://www.greensock.com/tweenlite/.
Создал Проект Flash.Создал в папке проэкта ActionScript 3.0 файл.
Переместил папку com из архива greensock-v12-as3.zip в папку с проектом и удалил папки других Tween'ов.
Нарисовал фигуру, преобразовал ее в символ myStar ,создав класс MyStar.
Почитал http://www.greensock.com/tweenlite/ Вот что получилось:

Код AS3:

var myStar1:MyStar;//MyStar - название класса символа
myStar1=new MyStar();
myStar1.x=20;
myStar1.y=30;
addChild(myStar1);
 
import com.greensock.*;
 
TweenLite.from(myStar1, 3, {x:20, y:30});
TweenLite.to(myStar1, 3, {x:100, y:100});
 
TweenLite.from(myStar1, 3, {x:100, y:100});
TweenLite.to(myStar1, 3, {x:100, y:200});

Я хочу, чтобы картинка перемещалась из (20, 30) в (100, 100), а затем в (100, 200).Но она перемещается
только из (100, 100) в (100, 200).
Как используя TweenLite сделать это:
Цитата:

Я хочу, чтобы картинка перемещалась из (20, 30) в (100, 100), а затем в (100, 200).
Добавлено через 18 минут
Уважаемый, Котейка, уточню задачу:
Как, используя TweenLite, переместить картинку
сначала из (10, 20) в (20, 40),
затем из (20, 40) в (40, 80),
затем из (40, 80) в (80, 160),
затем из (80, 160) в (160 320),
и так далее (сколько угодно перемещений, можете сами продолжить ряд если хотите :) ).
Заранее спасибо!

Котейка 12.08.2013 22:50

UserSuperPupsik, ну я ж вам привел код который именно это и делает :)
повторюсь, добавив ваш код добавления на сцену
Код AS3:

var myStar1:MyStar;//MyStar - название класса символа
myStar1=new MyStar();
myStar1.x=20;
myStar1.y=30;
addChild(myStar1);
/* Запуск перемещения */
ani(myStar1, [{x:20,y:100},{x:40,y:200}, {x:160, y:320}], 1);
 
 
function ani(object:DisplayObject, coords:Array, speedt:int = 1):void
{
        if (coords.length)
        {
                var nextCoords:Object = coords.shift();
                TweenLite.to(object, speedt, { x:nextCoords.x, y:nextCoords.y, onComplete:ani, onCompleteParams:[object, coords, speedt] } );
        }
}

Поясню. функцию ani передаем в параметр onComplete (это коллбек - функция которая вызовется по завершении анимации). Т.е. делаем что-то похожее на рекурсию, работающую пока не кончится массив координат, которые должен посетить объект.

UserSuperPupsik 12.08.2013 23:42

Спасибо ,Вам, Котейка!
Я сам бы не догадался что вместо {x:20,y:100},{x:40,y:200}, можно добавить много
{x:20,y:100},{x:40,y:200},{x:35,y:100},{x:40,y:150}.
Код хороший!
Ну а если я захочу перемещать картинку в цикле с изменением координат x=x+45 y=y+15, то я не смогу
использовать эту функцию?

Котейка 12.08.2013 23:57

UserSuperPupsik, не совсем понял. Покажите на примере.
Если вы имеете ввиду массив координат в цикле задавать. То сможете, почему нет, ну например
Код AS3:

var array:Array = new Array();
for (var i:int = 0; i < 10; i++)
{
        array[i] = { x:i * 10, y:i * 20 };
}
ani(myStar1, array, 1);


UserSuperPupsik 13.08.2013 00:43

Ну хорошо,Котейка, здесь есть 2 проблемы:
1) А если я хочу подождать 4 секунды, а затем снова вызвать
ani(myStar1, [{x:20,y:100},{x:40,y:200}, {x:160, y:320}], 1);
Затем подождать 5 сек, и затем вызвать
ani(myStar1, [{x:160,y:320},{x:40,y:200}, {x:160, y:320}], 1);

2) Я бы хотел что-то типа
Код AS3:

var x1:int=0
var y1:int=0
for (var i:int = 0; i < 10; i++)
{
        ani(myStar1, {x:x1,y:y1}, 1);
            x1=x1+20
            y1=y1+10
 
 
}

Всё, что мне нужно, так это в любом моменте выполнения кода переместить картинку!!!Уже потратил много дней на решение этой проблемы!!!

Котейка 13.08.2013 01:23

Я вроде понял что вы хотите сделать. Чтобы при добавлении новых координат старые не сбивались, а новые добавлялись в конец списка, так? Для этого просто надо сделать массив координат глобальным. Ну а функцию ani модифицируем чуть чуть :)
Код AS3:

var coordinates:Array = new Array();
 
var myStar1:MyStar;//MyStar - название класса символа
myStar1=new MyStar();
myStar1.x=20;
myStar1.y=30;
addChild(myStar1);
/* Запуск перемещения */
ani(myStar1, [{x:20,y:100},{x:40,y:200}, {x:160, y:320}], 1);
/*Добавляем новые в любой момент*/
ani(myStar1, [{x:90,y:100},{x:10,y:200}, {x:140, y:360}], 1);
 
 
function ani(object:DisplayObject, coords:Array, speedt:int = 1):void
{
        if (coords)
        {
                coordinates = coordinates.concat(coords);
                if (coordinates.length > coords.length) return;
        }
        if (coordinates.length)
        {
                var nextCoords:Object = coordinates.shift();
                TweenLite.to(object, speedt, { x:nextCoords.x, y:nextCoords.y, onComplete:ani, onCompleteParams:[object, null, speedt] } );
        }
}


UserSuperPupsik 13.08.2013 02:07

Котейка, Вы поняли, что я хотел!
Вот что получилось:

Код AS3:

var myStar1:MyStar;//MyStar - название класса символа
myStar1=new MyStar();
myStar1.x=50;
myStar1.y=50;
addChild(myStar1);
 
import com.greensock.*;
var coordinates:Array = new Array();
 
 ani(myStar1, [{x:50,y:50},{x:120,y:70}], 1); // первое положение
 ani(myStar1, [{x:120,y:70},{x:160,y:135}],2); //второе положение
 ani(myStar1, [{x:160,y:135},{x:240,y:235}],100); // третье положение
 //конец предыдущего положения и начало следущего положения - одни и те же y, x
function ani(object:DisplayObject, coords:Array, speedt:int = 1):void
{
        if (coords)
        {
                coordinates = coordinates.concat(coords);
                if (coordinates.length > coords.length) return;
        }
        if (coordinates.length)
        {
                var nextCoords:Object = coordinates.shift();
                TweenLite.to(object, speedt, { x:nextCoords.x, y:nextCoords.y, onComplete:ani, onCompleteParams:[object, null, speedt] } );
        }
}

Добавлено через 7 минут
Было бы неплохо, если Вы, Котейка, добавили к функции ani() все параметры, в том числе и duration, ease,
scale, rotation, tint, alpha(Кстати,что такое alpha), как на примере ниже.
TweenLite.to(myStar1, 1, {x:65, y:117, scaleX:1, scaleY:1, rotation:0, alpha:1, tint:null, ease:Elastic.easeInOut});
Было бы совсем хорошо...:)

Котейка 13.08.2013 02:32

Ну это уж вы сами параметры нужные добавьте, там дело то нехитрое :) alpha это непрозрачность от 0 до 1


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

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