|
|
|||||
Регистрация: Jan 2011
Сообщений: 30
|
подскажите формулу
фообщем есть картинка, надр чтобы когда её зумишь она оставалсь на месте, а не съезжала
подскажите формулу кто умный х) я вот написал такую, но она не работает |
|
|||||
strange mood
|
Вот написанный когда-то мной класс, который обеспечивает плавный зум и скролл карты. Карта должна лежать внутри с именем map. Сам мувик-контейнер лежит на сцене в точке с нулевыми координатами, за размеры считаются размеры сцены - для моей задачи этого было вполне достаточно.
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
__________________
тонкий тролль, осеянный благодатью |
|
|||||
Не проверял:
- пытаемся увеличить относительно точки innerP - в координатах map в экранных она будет (карта не должна съезжать, значит надо на ней выбрать точку, которая съезжать не будет) p = p01 + innerP * scale1 (координата начала отсчета координат в экранных координатах) после изменения масштаба p = p02 + innerP * scale2 Итого: p02 = p01 + innerP * scale1 - innerP * scale2 т.е. из scale1 в scale2 прыгаем так: 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; |
|
|||||
Регистрация: Jan 2011
Сообщений: 30
|
GAIKER крутой код, тока он в cs5 нефига не работает , каким ты редактором пользуешься ? х)
expl во точа типа того ты прав такая формула будет правильнее х) |
|
|||||
[+1 09.03.11]
Регистрация: Mar 2010
Сообщений: 128
|
Попробуйте так
__________________
for(;;); |
|
|||||
Регистрация: Jan 2011
Сообщений: 30
|
так ребята хрен что получается х)
а умная мысль с центром координат экрана, как узнать координаты центра экрана? |
|
|||||
1) Первый пункт правил.
2) Очевидно, разделить ширину и высоту экрана пополам. 3) Чем вам не понравилась идея от samana? |
|
|||||
Регистрация: Jan 2011
Сообщений: 30
|
вот туплю блин жесть конеша с координатами х)
а от самана не понравилось тем что я не знаю что такое контейнер х) контейнер это чтоли получается сама рабочая область т.е. stage ? |
|
|||||
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. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|