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

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

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

Регистрация: Mar 2015
Сообщений: 64
По умолчанию странное поведение e.currentTarget

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

Есть главный класс Main. В основном конструкторе класса вызывается функция размещающая кнопки на сцене.
Затем для каждой кнопки создается слушатель событий.В функции ссылающейся на слушатель кнопки buildVertical(далее речь пойдет о ней, т.к. для других кнопок я ещё ничего не сделал) создается экземпляр класса BuildVerticalClass. К этому экземпляру привязывается слушатель события.

Код AS3:
package cellAndRoadPG{
 
	import cellAndRoadPG.cellPG.*;
	import cellAndRoadPG.roadPG.*;
	import cellAndRoadPG.gameButtonsPG.*;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	public class Main extends MovieClip{
		//в главном конструкторе класса вызовем функции генерации карты.
		internal var main = this;//переменная для обращения к классу Main
		public function Main (){
		    fGenerationlocationCell();
			fPlaceButtons();
			stage.addEventListener(MouseEvent.MOUSE_DOWN, fAllowBuildRoad);
		}
 
//какой-то код
 
internal var build:Boolean = false;
 
	   //разместим кнопки на игровой панели и создадим для каждой из них обработчик событий.
        internal function fPlaceButtons(){
			var buildVertical:BuildVerticalClass = new BuildVerticalClass();
			main.addChild(buildVertical);
			buildVertical.addEventListener(MouseEvent.CLICK, fBuildVertical);
		    function fBuildVertical(e:MouseEvent){
			    var roadVertical:RoadVerticalClass = new RoadVerticalClass();
				roadVertical.x = mouseX;
				roadVertical.y = mouseY;
				main.addChild(roadVertical);
				roadVertical.startDrag();
				roadVertical.addEventListener(Event.ENTER_FRAME, fCheckHitWithCell);/*функция ищущая пересечение дороги и клетки, и размещающая
				дорогу в случае соблюдения условий описанных внутри функции*/
		    }
 
			var buildHorizontal:BuildHorizontalClass = new BuildHorizontalClass();
			main.addChild(buildHorizontal);
			buildHorizontal.addEventListener(MouseEvent.CLICK, fBuildHorizontal);
		    function fBuildHorizontal(e:MouseEvent){
			    var roadHorizontal:RoadHorizontalClass = new RoadHorizontalClass();
				roadHorizontal.x = mouseX;
				roadHorizontal.y = mouseY;
				main.addChild(roadHorizontal);
				roadHorizontal.startDrag();
		    }
 
			var buildRightUp:BuildRightUpClass = new BuildRightUpClass();
			main.addChild(buildRightUp);
			buildRightUp.addEventListener(MouseEvent.CLICK, fBuildRightUp);
		    function fBuildRightUp(e:MouseEvent){
			    var roadRightUp:RoadRightUpClass = new RoadRightUpClass();
				roadRightUp.x = mouseX;
				roadRightUp.y = mouseY;
				main.addChild(roadRightUp);
				roadRightUp.startDrag();
		    }
 
			var buildRightDown:BuildRightDownClass = new BuildRightDownClass();
			main.addChild(buildRightDown);
			buildRightDown.addEventListener(MouseEvent.CLICK, fBuildRightDown);
		    function fBuildRightDown(e:MouseEvent){
			    var roadRightDown:RoadRightDownClass = new RoadRightDownClass();
				roadRightDown.x = mouseX;
				roadRightDown.y = mouseY;
				main.addChild(roadRightDown);
				roadRightDown.startDrag();
		    }
 
			var buildLeftDown:BuildLeftDownClass = new BuildLeftDownClass();
			main.addChild(buildLeftDown);
			buildLeftDown.addEventListener(MouseEvent.CLICK, fBuildLeftDown);
		    function fBuildLeftDown(e:MouseEvent){
			    var roadLeftDown:RoadLeftDownClass = new RoadLeftDownClass();
				roadLeftDown.x = mouseX;
				roadLeftDown.y = mouseY;
				main.addChild(roadLeftDown);
				roadLeftDown.startDrag();
		    }
 
			var buildLeftUp:BuildLeftUpClass = new BuildLeftUpClass();
			main.addChild(buildLeftUp);
			buildLeftUp.addEventListener(MouseEvent.CLICK, fBuildLeftUp);
		    function fBuildLeftUp(e:MouseEvent){
			    var roadLeftUp:RoadLeftUpClass = new RoadLeftUpClass();
				roadLeftUp.x = mouseX;
				roadLeftUp.y = mouseY;
				main.addChild(roadLeftUp);
				roadLeftUp.startDrag();
		    }
	    }
 
	        function fCheckHitWithCell(e:Event){
		    var road_vertical = e.currentTarget;
		    if(build == true){
				 road_vertical.stopDrag();
				 build = false;
			}
		}
 
        //разрешить строить дорогу.
		private function fAllowBuildRoad(e:MouseEvent){
			build = true;
		}
проблема в следующем:
При первом нажатии на кнопку buildVertical создается экземпляр класса BuildVerticalClass и сразу-же срабатывает функция привязанная к этому экземпляру. Далее, почему-то срабатывают все кнопки, т.е.
выполняется функция прописанная для экземпляра класса BuildVerticalClass и ссылающаяся на этот экземпляр с помощью метода e.currentTarget и эта функция срабатывает для других экземпляров других классов.

Кто-нибудь может объяснить почему так происходит.


Последний раз редактировалось бакуард; 04.07.2015 в 17:29.
Старый 04.07.2015, 09:30
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Для начала вытащите все функции из конструктора в тело класса (как fAllowBuildRoad).
Черт ногу сломит.

Добавлено через 9 минут
Что именно срабатывает "для других экземпляров"? Остановка драга? А до этого они все за мышкой ползают чтоли? Или как Вы это увидели? Опишите своими словами, как это выглядит, потому что интерпретировать Вашу интерпретацию слегка затруднительно. Это как ответить на вопрос "я подписал кнопку на событие клика, жму а ничего не происходит! что делать???7?" Нужно еще что-то кроме описания заведомо невозможной ситуации. Что это за "другие экземпляры", если Вы пишете "после первого нажатия", то есть вроде как не должно быть других кусков дороги. Короче, опишите подробнее происходящее, не обязательно псевдонаучным языком.
__________________
Reality.getBounds(this);

Старый 04.07.2015, 17:29
бакуард вне форума Посмотреть профиль Отправить личное сообщение для бакуард Найти все сообщения от бакуард
  № 3  
Ответить с цитированием
бакуард

Регистрация: Mar 2015
Сообщений: 64
Извиняюсь, сразу ответить не мог.
Нажимаю на кнопку buildVertical и сразу появляется кусок дороги координаты которого равны координатам курсора мыши(здесь все нормально). Далее почему-то сразу же срабатывает функция fCheckHitWithCell(остановка драга),
хотя не должна (Она должна сработать после клика по сцене). Что касается остальных кнопок, то при нажатии на них появляется соответствующий кусок дороги и движется вместе с курсором(здесь все нормально), но если кликнуть по сцене то происходит остановка драга, хотя для тех кусков дороги,которые вызывают эти кнопки я ничего подобного не писал.

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

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

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

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

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


 


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


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