Форум 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=211749)

бакуард 29.10.2015 18:24

ограничение скроллинга карты
 
Доброго времени суток.

Реализую скроллинг карты (которая представляет собой Sprite куда добавляется графические элементы, из которых она состоит) посредством захвата мышью. Фактическое её перемещение таким способом я реализовал, но затем захотел сделать ограничение для перемещения, чтобы нельзя было отвести карту в сторону показав пустую сцену. После добавления нескольких условных операторов её вообще не получается сдвинуть. Ошибок в условиях не нашел. Вот проблемный участок кода:

Код AS3:

//три функции отвечающие за скроллинг карты
                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;
                }

Если этого недостаточно, то вот код всего класса:

Код AS3:

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;
                }
        }
}


neonoviiwolf 29.10.2015 18:44

создай пару переменных, в которых будет значение отклонения от центра карты по х/у, дойдёт значение до максимума, запрети скролить дальше

ну ход мыслей верный, но чего так мудрить

попробуй проще
есть карта (не сцена) 1000/1000
игрок допустим, самое простое, начинает из центра скролить по оси y, ну так вот, считаем пиксели, дойдёт до 1000(если начинать считать с левого нижнего) по оси Y, запрещаем скролить

ну разумеется если из центра, то значение y = 500;
если начало допустим из угла, то при старте считаем его координаты относительно карты (не сцены)


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

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