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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

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

Регистрация: Jan 2011
Сообщений: 30
По умолчанию подскажите формулу

фообщем есть картинка, надр чтобы когда её зумишь она оставалсь на месте, а не съезжала
подскажите формулу кто умный х)
я вот написал такую, но она не работает
Код AS3:
  map.scaleY = map.scaleX -=  0.25;
  map.x=map.x+ 0.25*map.width;
  map.y=map.y+ 0.25*map.height;

Старый 04.02.2011, 00:58
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 2  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Вот написанный когда-то мной класс, который обеспечивает плавный зум и скролл карты. Карта должна лежать внутри с именем map. Сам мувик-контейнер лежит на сцене в точке с нулевыми координатами, за размеры считаются размеры сцены - для моей задачи этого было вполне достаточно.
Код AS3:
package {
 
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
 
	/**
	 * @author Gaen
	 */
	public class MapViewer extends Sprite{
 
		//=====================================================================
		//
		//	Public props
		//
		//=====================================================================
 
		public var map				:MovieClip;
 
		//=====================================================================
		//
		//	Private props
		//
		//=====================================================================
 
		private var scrollTimer		:Timer;
 
		private var oldMouseX		:Number;
		private var oldMouseY		:Number;
 
		private var oldMapX			:Number;
		private var oldMapY			:Number;
 
		private var mapTargetX		:Number;
		private var mapTargetY		:Number;
 
		private var mapTargetScale	:Number;
 
		//=====================================================================
		//
		//	Public methods
		//
		//=====================================================================
 
		//------------------------------------
		//
		//	Constructor
		//
		//------------------------------------
 
		public function MapViewer(){
 
			super();
 
		}//MapViewer
 
		/**
		 * Инициализация
		 * @param	data
		 */
		public function init():void{
 
			if(!this.stage) return;
 
			var sw		:Number	=	this.stage.stageWidth;
			var sh		:Number	=	this.stage.stageHeight;
 
			if(!this.map){
 
				trace('No fukken map');
 
				return;
 
			}//if
 
			this.map.x			=	(sw - this.map.width)  / 2;
			this.map.y			=	(sh - this.map.height) / 2;
 
			this.initScrollAndZoom();
 
		}//init
 
		//=====================================================================
		//
		//	Private methods
		//
		//=====================================================================
 
		/**
		 * Инициализация скроллинга и зума карты
		 */
		private function initScrollAndZoom():void{
 
			this.map.height		=	this.stage.stageHeight;
			this.map.scaleX		=	this.map.scaleY;
			this.mapTargetScale	=	this.map.scaleY;
 
			//this.map.x			=	(this.stage.stageWidth  - this.map.width)  / 2;
			//this.map.y			=	(this.stage.stageHeight - this.map.height) / 2;
 
			this.mapTargetX		=	(this.stage.stageWidth  - this.map.width)  / 2;
			this.mapTargetY		=	(this.stage.stageHeight - this.map.height) / 2;
 
			this.stage.addEventListener(MouseEvent.MOUSE_DOWN, this.downHandler);
			this.stage.addEventListener(MouseEvent.MOUSE_UP,   this.upHandler);
 
			this.scrollTimer	=	new Timer(20);
 
			this.scrollTimer.addEventListener(TimerEvent.TIMER, this.scrollTickHandler);
 
			this.scrollTimer.start();
 
			this.stage.addEventListener(MouseEvent.MOUSE_WHEEL, this.wheelHandler);
 
		}//initScrollAndZoom
 
 
		//------------------------------------
		//
		//	Scrolling and zooming
		//
		//------------------------------------
 
		private function downHandler(e:Event):void{
 
			this.oldMouseX		=	this.mouseX;
			this.oldMouseY		=	this.mouseY;
 
			this.oldMapX		=	this.map.x;
			this.oldMapY		=	this.map.y;
 
			if(!this.stage) return;
 
			this.stage.addEventListener(MouseEvent.MOUSE_MOVE, this.moveHandler);
 
		}//downHandler
 
		private function upHandler(e:Event):void{
 
			if(!this.stage) return;
 
			if(this.stage.hasEventListener(MouseEvent.MOUSE_MOVE)){
 
				this.stage.removeEventListener(MouseEvent.MOUSE_MOVE, this.moveHandler);
 
			}//if
 
		}//upHandler
 
		private function moveHandler(e:Event):void{
 
			if(!this.stage) return;
 
			var stageWidth	:Number	=	this.stage.stageWidth;
			var stageHeight	:Number	=	this.stage.stageHeight;
 
			var mapWidth	:Number	=	this.map.width;
			var mapHeight	:Number	=	this.map.height;
 
			var mapTargetX	:Number	=	this.oldMapX + this.mouseX - this.oldMouseX;
			var mapTargetY	:Number	=	this.oldMapY + this.mouseY - this.oldMouseY;
 
			//Не даем утащить карту за границу экрана
 
			var tailX		:Number	=	mapWidth  * .5;
			var tailY		:Number	=	mapHeight * .5;
 
			if(mapTargetX < tailX - mapWidth){
 
				mapTargetX	=	tailX - mapWidth;
 
			}else if(mapTargetX > stageWidth - tailX){
 
				mapTargetX = stageWidth - tailX;
 
			}//if
 
			if(mapTargetY < tailY - mapHeight){
 
				mapTargetY	=	tailY - mapHeight;
 
			}else if(mapTargetY > stageHeight - tailY){
 
				mapTargetY = stageHeight - tailY;
 
			}//if
 
			this.mapTargetX			=	mapTargetX;
			this.mapTargetY			=	mapTargetY;
 
		}//moveHandler
 
		private function scrollTickHandler(e:Event):void{
 
			this.map.x		+=	(this.mapTargetX - this.map.x) / 5;
			this.map.y		+=	(this.mapTargetY - this.map.y) / 5;
 
			this.map.scaleX	+=	(this.mapTargetScale - this.map.scaleX) / 5;
			this.map.scaleY	+=	(this.mapTargetScale - this.map.scaleY) / 5;
 
		}//scrollTickHandler
 
		private function wheelHandler(e:MouseEvent):void{
 
			if(!this.stage) return;
 
			var zoomMax		:Number	=	1.2;
			var zoomMin		:Number	=	.4;
 
			var zoomStep	:Number	=	.2 * (e.delta>0?1:-1);
 
			var currentZoom	:Number	=	this.map.scaleX;
			var newZoom		:Number	=	currentZoom + zoomStep;
 
			if(newZoom > zoomMax){
 
				newZoom	=	zoomMax;
 
			}else if(newZoom < zoomMin){
 
				newZoom	=	zoomMin;
 
			}//if
 
			this.setZoom(newZoom);
 
		}//wheelHandler
 
		private function setZoom(newZoom:Number):void{
 
			var dx			:Number	=	(this.mouseX - this.map.x) / this.map.scaleX;
			var dy			:Number	=	(this.mouseY - this.map.y) / this.map.scaleY;
 
			this.mapTargetScale		=	newZoom;
 
			this.mapTargetX			=	this.mouseX - dx * this.mapTargetScale;
			this.mapTargetY			=	this.mouseY - dy * this.mapTargetScale;
 
		}//setZoom
 
	}//class
 
}//package
__________________
тонкий тролль, осеянный благодатью

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

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Положите центр картинки в нулевые координаты её контейнера, если он есть. И изменяйте масштаб его.

Старый 04.02.2011, 01:06
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 4  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Не проверял:
- пытаемся увеличить относительно точки innerP - в координатах map
в экранных она будет
(карта не должна съезжать, значит надо на ней выбрать точку, которая съезжать не будет)
p = p01 + innerP * scale1 (координата начала отсчета координат в экранных координатах)

после изменения масштаба
p = p02 + innerP * scale2

Итого:
p02 = p01 + innerP * scale1 - innerP * scale2

т.е. из scale1 в scale2 прыгаем так:

Код AS3:
var innerMapX = map.mouseX;// В самом простом случае скейлим относительно курсора мыши
var innerMapY = map.mouseY;// Можно от центра экрана скейлить, но тогда придется перевести
                                        // координаты центра экрана во внутренние координаты map
 
var oldMapX = map.x;
var oldMapY = map.y;
var oldScale = map.scaleX;
 
var newScale = oldScale - .25;
map.scaleX = map.scaleY = newScale;
map.x = oldMapX + innerMapX * oldScale - innerMapX * newScale;
map.y = oldMapY + innerMapY * oldScale - innerMapY * newScale;
Как-то так.

Старый 04.02.2011, 11:54
ggg вне форума Посмотреть профиль Отправить личное сообщение для ggg Найти все сообщения от ggg
  № 5  
Ответить с цитированием
ggg

Регистрация: Jan 2011
Сообщений: 30
GAIKER крутой код, тока он в cs5 нефига не работает , каким ты редактором пользуешься ? х)
expl во точа типа того ты прав такая формула будет правильнее х)

Старый 04.02.2011, 12:14
medvedya2 вне форума Посмотреть профиль Отправить личное сообщение для medvedya2 Найти все сообщения от medvedya2
  № 6  
Ответить с цитированием
medvedya2
[+1 09.03.11]

Регистрация: Mar 2010
Сообщений: 128
Попробуйте так
Код AS3:
 map.scaleY = map.scaleX -=  0.25;
  map.x=map.x+ 0.25/2*map.width;
  map.y=map.y+ 0.25/2*map.height;
__________________
for(;;);

Старый 04.02.2011, 13:23
ggg вне форума Посмотреть профиль Отправить личное сообщение для ggg Найти все сообщения от ggg
  № 7  
Ответить с цитированием
ggg

Регистрация: Jan 2011
Сообщений: 30
так ребята хрен что получается х)
а умная мысль с центром координат экрана, как узнать координаты центра экрана?

Старый 04.02.2011, 13:31
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 8  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
1) Первый пункт правил.
2) Очевидно, разделить ширину и высоту экрана пополам.
Код AS3:
stage.stageWidth / 2;
stage.stageHeight / 2;
3) Чем вам не понравилась идея от samana?

Старый 04.02.2011, 13:38
ggg вне форума Посмотреть профиль Отправить личное сообщение для ggg Найти все сообщения от ggg
  № 9  
Ответить с цитированием
ggg

Регистрация: Jan 2011
Сообщений: 30
вот туплю блин жесть конеша с координатами х)
а от самана не понравилось тем что я не знаю что такое контейнер х)
контейнер это чтоли получается сама рабочая область т.е. stage ?

Старый 04.02.2011, 13:49
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 10  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Код AS3:
package 
{
    import flash.display.Bitmap;
    import flash.display.Sprite;
    import flash.events.Event;
 
    public class Main extends Sprite 
    {
        // Встраиваем картинку
        [Embed(source = '01.jpg')]
        private var image:Class;
 
        private var angle:Number = 0;
 
        public function Main()
        {
            // Ждем, когда станет доступен stage
            if (stage) addedToStageListener();
            else addEventListener(Event.ADDED_TO_STAGE, addedToStageListener);
        }
 
        // Дождались
        private function addedToStageListener(event:Event = null):void
        {
            // Создаем контейнер
            var container:Sprite = new Sprite();
            // Позиционируем его
            container.x = stage.stageWidth / 2;
            container.y = stage.stageHeight / 2;
            // Добавляем в список отображения ребенком Main'а
            addChild(container);
 
            // Создаем картинку
            var bitmap:Bitmap = new image();
            // Позиционируем ее
            bitmap.x = bitmap.width / -2;
            bitmap.y = bitmap.height / -2;
            // Добавляем в список отображения ребенком container'а
            container.addChild(bitmap);
 
            // Каждый кадр выполняем функцию enterFrameHandler
            container.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }
 
        private function enterFrameHandler(event:Event):void
        {
            angle += 0.1;
            (event.target as Sprite).scaleX = (event.target as Sprite).scaleY = Math.cos(angle);
        }
    }
}

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

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

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


 


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


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