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

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

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

Регистрация: Jun 2012
Сообщений: 142
По умолчанию Как опросить обьект в обьекте?

Есть 2е картинки, мап и спрайт, нужно чтобы при нажатии на мап, двигалась сама картинка и все повешенные на нее обьекты, при этом нужно, чтобы была возможность перетаскивать эти сами обьекты.
Подскажите как.
Код AS3:
			[Embed(source = "../lib/map.jpg")] var mapjpg:Class;
			[Embed(source = "../lib/sprit1.png")] var spr1:Class;
 
			var map: DisplayObject = new mapjpg();
			var spr: DisplayObject = new spr1();
 
			var sprite:Sprite = new Sprite();
			addChild(sprite);
			sprite.addChild (map);
 
			spr.x = 1000;
			spr.y = 0;
			sprite.addChild(spr);
 
 
			sprite.addEventListener(MouseEvent.MOUSE_DOWN, on_MD);
			sprite.addEventListener(MouseEvent.MOUSE_UP, on_MU);
 
			spr.addEventListener(MouseEvent.MOUSE_DOWN, aa1);
 
                   	function aa1(e:MouseEvent):void {e.currentTarget.startDrag();}
			function on_MD(e:MouseEvent):void {e.currentTarget.startDrag();}
			function on_MU(e:MouseEvent):void {e.currentTarget.stopDrag();}

Старый 25.09.2012, 20:43
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Код AS3:
package 
{
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	public class Main extends Sprite 
	{
		[Embed(source = "../lib/map.jpg")] private const mapClass:Class;
		[Embed(source = "../lib/sprit1.png")] private const objClass:Class;
 
		public function Main():void 
		{
			var container:Sprite = new Sprite();
			this.addChild(container);
			var mapImage:Bitmap = new mapClass();
			container.addChild(mapImage);
			var mapObject:Sprite = new Sprite();
			mapObject.addChild(new objClass());
			container.addChild(mapObject);
 
			container.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
			container.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
		}
 
		private function mouseUpHandler(event:MouseEvent):void 
		{
			event.target.stopDrag();
		}
 
		private function mouseDownHandler(event:MouseEvent):void 
		{
			event.target.startDrag();
		}
	}
}
Добавлено через 5 минут
(Битмап не генерит мышиные события. Он не наследует InteractiveObject)
__________________
Reality.getBounds(this);

Старый 25.09.2012, 21:01
fduch вне форума Посмотреть профиль Отправить личное сообщение для fduch Найти все сообщения от fduch
  № 3  
Ответить с цитированием
fduch

Регистрация: Jun 2012
Сообщений: 142
спс.
Если не сложно объясните смысловую нагрузку этих строк
Код AS3:
		mapObject.addChild(new objClass());
			container.addChild(mapObject);
зачем в принципе первая строчка?

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Объясняю: (Битмап не генерит мышиные события. Он не наследует InteractiveObject)
Поэтому битмап ( new objClass() ) добавляем в интерактивный контейнер — спрайт mapObject, чтобы он мог "ловить" нажатие мыши.
В вашем коде spr.addEventListener(MouseEvent.MOUSE_DOWN, aa1); не имеет смысла, потому что битмап spr никогда не пошлет событие MouseEvent.MOUSE_DOWN, соответственно обработчик аа1 никогда не будет вызван.
__________________
Reality.getBounds(this);

Старый 25.09.2012, 21:22
fduch вне форума Посмотреть профиль Отправить личное сообщение для fduch Найти все сообщения от fduch
  № 5  
Ответить с цитированием
fduch

Регистрация: Jun 2012
Сообщений: 142
Примерно понял, спс.
Еще вопрос тогда, как в вашем случае обратиться к mapObject?
Хотябы посмотреть координаты.
Код AS3:
			container.addEventListener(MouseEvent.MOUSE_MOVE, mouseMOVE);
	function mouseMOVE (event:MouseEvent):void {
				trace(mapObject.x);
				trace(container.mapObject.x);
		}
Добавлено через 16 минут
функция незнает о таком обьекте... получается можно обратиться только к текущему?
А если надо например сравнить координаты нескольких обьектов на карте?

Добавлено через 27 минут
Если работать только с текущим обьектом, то получается примерно так
Код AS3:
		function mouseMOVE (event:MouseEvent):void {
			if (event.target.x <  0) {event.target.x = 0;}
			if (event.target.y <  0) {event.target.y = 0;}
Но остается вопрос как сверять другие координаты,
например, чтобы обьект нельзя было вытащить за пределы контейнера. МАПа точнее


Последний раз редактировалось fduch; 25.09.2012 в 21:51.
Старый 25.09.2012, 22:02
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
"Функция не знает" потому что переменная mapObject объявлена в другой функции — в конструкторе.
Если объявить mapObject как член класса (private var mapObject:Sprite) а не как локальную переменную конструктора, она будет видна для всех других членов класса, включая методы-обработчики. Если объектов много, можно нашпиговать ими массив и сделать его членом класса.
__________________
Reality.getBounds(this);

Старый 25.09.2012, 22:04
fduch вне форума Посмотреть профиль Отправить личное сообщение для fduch Найти все сообщения от fduch
  № 7  
Ответить с цитированием
fduch

Регистрация: Jun 2012
Сообщений: 142
глобальную переменную то я сделал, я думал, есть какойто более грамотный способ спс.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Метод startDrag вообще-то принимает параметры, в том числе прямоугольник, в котором разрешено таскать объект
Другое дело, что прямоугольник надо будет пересчитывать для объектов разного размера, чтобы отделить лимитные поля справа и снизу (иначе объект будет уходить своей нижней границей ниже границы карты — прямоугольник определяет область, в которой может находиться точка (0, 0) таскаемого объекта).
__________________
Reality.getBounds(this);

Старый 25.09.2012, 22:40
fduch вне форума Посмотреть профиль Отправить личное сообщение для fduch Найти все сообщения от fduch
  № 9  
Ответить с цитированием
fduch

Регистрация: Jun 2012
Сообщений: 142
да, я в курсе.
Тока вот тут проблема возникла, если обьявить обе переменные глобальные, то mapImage.x и y всегда равны 0, даже когда обьект двигаешь, а вот координаты mapObject имеют нормальное значение(в пределах mapImage)
как мне узнать координаты mapImage?

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
mapImage находится в контейнере, и относительно него никуда не смещается. Мы двигаем контейнер, в котором лежит mapImage и объекты. Координаты этого контейнера Вас и должны интересовать, а не картинки))

Добавлено через 6 минут
Цитата:
я думал, есть какойто более грамотный способ
Конечно есть — писать код в классах, а не в кадрах. Для объектов карты конечно же надо создать специальный класс MapItem extends Sprite. Создавать его экземпляры, передавая в конструктор картинку объекта (битмап) и какой-то идентификатор, чтобы всегда можно было узнать, что это за объект собственно, какую сущность он представляет. А далее можно еще создавать отдельные подклассы MapItem, например class Home extends MapItem, добавляя им уникальные только для них методы и свойства.
__________________
Reality.getBounds(this);

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

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

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


 


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


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