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

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

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

Регистрация: Mar 2015
Сообщений: 64
По умолчанию ограничение скроллинга карты

Доброго времени суток.

Реализую скроллинг карты (которая представляет собой 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;
		}
	}
}

Старый 29.10.2015, 18:44
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 2  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
создай пару переменных, в которых будет значение отклонения от центра карты по х/у, дойдёт значение до максимума, запрети скролить дальше

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

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

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


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

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

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


 


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


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