Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 09.09.2013, 14:13
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 1  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
По умолчанию Анимация драга canvas в пределах заданных размеров.

Не редкая задача - есть карта (уровней, территории) и нужно организовать её плавный драг с анимацией, но в пределах stage. То есть делаем swype влево - карта со всеми объектами поехала влево с инерцией замедления. Но чтобы canvas не вышел за пределы экрана. Вроде просто, но тему пока не изучал подробно - может есть у кого готовая заготовка?

Ниже просто не рабочий набросок для иллюстрации что примерно нужно.
Код AS3:
public static var canvas:Sprite = new Sprite();
addChild(canvas);
canvas.width = stage.stageWidth;
canvas.height = stage.stageHeight;
canvas.scaleX = canvas.scaleY = 1.5;
 
addEventListener(TouchEvent.TOUCH, onTouch);
 
private function onTouch(event:TouchEvent):void
{
	var touch:Touch = event.getTouch(stage);
 
	if (touch) {
		if(touch.phase == TouchPhase.MOVED ){
				var position:Point = touch.getLocation(stage);
				Starling.juggler.tween(canvas, 1, {transition: Transitions.EASE_IN_OUT, x: position.x, y:position.y});
		}
	}
}
__________________
In Code We Trust

Старый 09.09.2013, 14:30
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 2  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
В качестве примера можно посмотреть реализацию Scroller у Джошуа в Feathers. Там еще задается инерция и эластичность. Там конкретный вью порт скролится. Как раз заточен под "тач-скролл")

Кстати, возможно получится повесить на вашу карту этот готовый скроллер!

http://wiki.starling-framework.org/feathers/scroller
http://feathersui.com/documentation/.../Scroller.html

Старый 09.09.2013, 19:55
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 3  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
KumoKairo, спасибо. Я рассматривал вариант ScrollContainer, но думал, в целях экономии ресурсов, сделать все на своих TouchEvent. В общем сделал сейчас так и получается очень не плохо. Похоже на реализацию как в Plants vs zombies, Clash of clans и в сотнях других игр. Теперь при жесте pan наружу (пальцы расширяются) карта расширяется, скалируется на 1.6 и теперь её можно драгать. Обратная жест - щипок и карта анимированно возвращается в исходное состояние и никакого драга карты нет.

Единственное, нужно задавать размеры scene.viewPort. Если их увеличивать на размер скалирования (1.6), то получается значительно шире чем нужно и непонятно чем это вызвано. Методом научного тыка подобрана величина 1.38, но хотелось бы найти разумное решение задачи.

Код AS3:
public static var scene:ScrollContainer = new ScrollContainer();
private var sceneScaled:Boolean = false;
 
 
addChild(scene);
scene.width = stage.stageWidth;
scene.height = stage.stageHeight;
scene.viewPort.width = scene.width;
scene.viewPort.height = scene.height;
 
private function onTouch(event:TouchEvent):void
{
	var touches:Vector.<Touch> = event.getTouches(this, TouchPhase.MOVED);
	if (touches.length == 2)
	{
		var touchA:Touch = touches[0];
		var touchB:Touch = touches[1];
 
		var currentPosA:Point  = touchA.getLocation(parent);
		var previousPosA:Point = touchA.getPreviousLocation(parent);
		var currentPosB:Point  = touchB.getLocation(parent);
		var previousPosB:Point = touchB.getPreviousLocation(parent);
 
		var currentVector:Point  = currentPosA.subtract(currentPosB);
		var previousVector:Point = previousPosA.subtract(previousPosB);
 
		var sizeDiff:Number = currentVector.length / previousVector.length;
		if (!sceneScaled){
			if (sizeDiff > 1){
				Starling.juggler.tween(scene, 0.6, { transition: Transitions.EASE_OUT_ELASTIC, scaleX: 1.6, scaleY: 1.6});
				scene.viewPort.width = scene.width * 1.38;
				scene.viewPort.height = scene.height * 1.38;
				sceneScaled = true;
			}
		} else {
			if (sizeDiff < 1){
 
				Starling.juggler.tween(scene, 0.6, { transition: Transitions.EASE_OUT_ELASTIC, scaleX: 1, scaleY: 1});
                                scene.viewPort.width = scene.width;
				scene.viewPort.height = scene.height;
				sceneScaled = false;
 
					}
				}
			}
}
__________________
In Code We Trust

Старый 10.09.2013, 18:46
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 4  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Цитата:
Если их увеличивать на размер скалирования (1.6), то получается значительно шире чем нужно и непонятно чем это вызвано. Методом научного тыка подобрана величина 1.38, но хотелось бы найти разумное решение задачи.
А если попробуешь корень из 1.6 будет ещё ближе. )
__________________
Отряд Котовскага

Старый 10.09.2013, 20:51
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 5  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Неа, мало.
Так и не знаю отчего вьюпорт становится больше контейнера.
__________________
In Code We Trust

Создать новую тему Ответ Часовой пояс GMT +4, время: 16:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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