![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2015
Сообщений: 64
|
Доброго времени суток.
Реализую скроллинг карты (которая представляет собой Sprite куда добавляется графические элементы, из которых она состоит) посредством захвата мышью. Фактическое её перемещение таким способом я реализовал, но затем захотел сделать ограничение для перемещения, чтобы нельзя было отвести карту в сторону показав пустую сцену. После добавления нескольких условных операторов её вообще не получается сдвинуть. Ошибок в условиях не нашел. Вот проблемный участок кода: //три функции отвечающие за скроллинг карты private function startScroll(e:MouseEvent):void{ lastPozMouseX = mouseX; lastPozMouseY = mouseY; timer.start(); } private function stopScroll(e:MouseEvent):void{ timer.stop(); } private var moveX:int; private var moveY:int; private function scrollMap(e:TimerEvent):void{ moveX = mouseX - lastPozMouseX;//на сколько изменилось положение курсора мыши относительно предыдущего по оси Х moveY = mouseY - lastPozMouseY;//на сколько изменилось положение курсора мыши относительно предыдущего по оси Y if(moveX > lastPozMouseX){ if(this.x + moveX < this.width/2){ this.x += moveX; } }else{ if(this.x + moveX > -this.width/2 + stageWidth){ this.x += moveX; } } if(moveY > lastPozMouseY){ if(this.y + moveY < this.height/2){ this.y += moveY; } }else{ if(this.y + moveY > -this.height/2 + stageHeight){ this.y += moveY; } } lastPozMouseX = mouseX; lastPozMouseY = mouseY; } package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.utils.Timer; import flash.events.TimerEvent; internal class Map extends Sprite{ private var arraySquare:Array = new Array(); private var timer:Timer;//с помощью этого таймера реализуем скроллинг карты private var stageWidth:int; private var stageHeight:int; //переменные связанные с скроллингом карты private var lastPozMouseX:int = 0;//предыдущее положение мыши по оси Х private var lastPozMouseY:int = 0;//предыдущее положение мыши по оси Y public function Map(stageWidth_:int, stageHeight_:int, sizeCell:int){ stageWidth = stageWidth_; stageHeight = stageHeight_; var xPoz:int = -sizeCell/2; var yPoz:int = -sizeCell/2; var width_:int= stageWidth_ / sizeCell;; var height_:int = stageHeight_ / sizeCell;; for(var i:int = 1; i <= height_; i++){ yPoz += sizeCell; xPoz = -sizeCell/2;//заполнять каждую новую линию нужно с левого края сцены for(var j:int = 1; j <= width_; j++){ xPoz += sizeCell; addSquare(xPoz, yPoz); } } /*регистрация приемников отвечающих за скроллинг карты, а также создадим объект класса Timer с помощью которого будем двигать карту.*/ timer = new Timer(50); timer.addEventListener(TimerEvent.TIMER, scrollMap); this.addEventListener(MouseEvent.MOUSE_DOWN, startScroll); this.addEventListener(MouseEvent.MOUSE_UP, stopScroll); } private function addSquare(xPoz, yPoz):void{ switch(Math.floor(Math.random() * 11 / 5)){ case 0: arraySquare[arraySquare.length] = new Square1; arraySquare[arraySquare.length - 1].x = xPoz; arraySquare[arraySquare.length - 1].y = yPoz; this.addChild(arraySquare[arraySquare.length - 1]); break; case 1: arraySquare[arraySquare.length] = new Square2; arraySquare[arraySquare.length - 1].x = xPoz; arraySquare[arraySquare.length - 1].y = yPoz; this.addChild(arraySquare[arraySquare.length - 1]); break; case 2: arraySquare[arraySquare.length] = new Square3; arraySquare[arraySquare.length - 1].x = xPoz; arraySquare[arraySquare.length - 1].y = yPoz; this.addChild(arraySquare[arraySquare.length - 1]); break; } } //три функции отвечающие за скроллинг карты private function startScroll(e:MouseEvent):void{ lastPozMouseX = mouseX; lastPozMouseY = mouseY; timer.start(); } private function stopScroll(e:MouseEvent):void{ timer.stop(); } private var moveX:int; private var moveY:int; private function scrollMap(e:TimerEvent):void{ moveX = mouseX - lastPozMouseX;/*на сколько изменилось положение курсора мыши относительно предыдущего по оси Х*/ moveY = mouseY - lastPozMouseY;/*на сколько изменилось положение курсора мыши относительно предыдущего по оси Y*/ if(moveX > lastPozMouseX){ if(this.x + moveX < this.width/2){ this.x += moveX; } }else{ if(this.x + moveX > -this.width/2 + stageWidth){ this.x += moveX; } } if(moveY > lastPozMouseY){ if(this.y + moveY < this.height/2){ this.y += moveY; } }else{ if(this.y + moveY > -this.height/2 + stageHeight){ this.y += moveY; } } lastPozMouseX = mouseX; lastPozMouseY = mouseY; } } } |
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
создай пару переменных, в которых будет значение отклонения от центра карты по х/у, дойдёт значение до максимума, запрети скролить дальше
ну ход мыслей верный, но чего так мудрить попробуй проще есть карта (не сцена) 1000/1000 игрок допустим, самое простое, начинает из центра скролить по оси y, ну так вот, считаем пиксели, дойдёт до 1000(если начинать считать с левого нижнего) по оси Y, запрещаем скролить ну разумеется если из центра, то значение y = 500; если начало допустим из угла, то при старте считаем его координаты относительно карты (не сцены) Последний раз редактировалось neonoviiwolf; 29.10.2015 в 18:56. |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:02. |
|
|
« Предыдущая тема | Следующая тема » |
|
|