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

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

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

Регистрация: Jun 2011
Сообщений: 13
Attention Массив объектов и события.

Привет, AS я начал изучать буквально сегодня, более-менее разбираюсь, пытаюсь писать тестовые флешки для понимания языка.

Собственно написал код, который создаёт массив объектов myrow, где myrow - это квадратный movieclip, пытался повесить события на каждый объект так, чтобы при клике он выделялся красным вокруг (через GlowFilter).

Код AS3:
import flash.filters.GlowFilter;
import flash.events.Event;
 
var len:int = 100;
var mas:Array = new Array(len);
var gf1:GlowFilter = new GlowFilter(0xff0000, 0, 0, 0, 0, 0);
var gf2:GlowFilter = new GlowFilter(0xff0000, 2, 2, 2, 2, 2);
 
function generateWorld(len:int):void {
	var i:int;
	var j:int;
	for(i = 0; i < len; i++) {
		mas[i] = new Array(len);
		for (j = 0; j < len; j++) {
			var row:myrow = new myrow();
			row.x = i * row.width;
			row.y = j * row.width;
			mas[i][j] = row;
			addChild(mas[i][j]);
		}
	}
}
 
function oncll (e:MouseEvent) {
	this.filters = [gf3];
}
 
 
generateWorld(len);
var i:int;
var j:int;
for (i = 0; i < len; i++) {
	for (j = 0; j < len; j++) {
		mas[i][j].addEventListener(MouseEvent.CLICK, oncll);
	}
}
первое, что пришло в голову, использование this, но в итоге при клике на один из объектов массива, выделяются все объекты массива, а не только тот, на который кликнули.

Подскажите пожалуйста, как правильно реализовать выделение только одного объекта массива, на который был совершен клик мышкой?

Пробовал прослушивать событие Event.ENTER_FRAME и внутри функции проверять положение мыши относительно каждого объекта массива циклом, но уже при массиве 50х50 ощущаются тормоза, счел это плохим кодом удалил, вот теперь пытаюсь сделать все цивильно, надеюсь поможете советом.

Заранее спасибо.

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

Регистрация: May 2010
Сообщений: 543
Вместо this используйте e.target

Цитата:
счел это плохим кодом удалил, вот теперь пытаюсь сделать все цивильно, надеюсь поможете советом.
Не пишите код в кадрах - первый закон программирование в AS
__________________
Вы грабите бедных людей. Парень со свирелью накажет вас. Хонгильдон (с)


Последний раз редактировалось carrotoff; 16.06.2011 в 12:34.
Старый 16.06.2011, 13:00
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 3  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
Вместо this используйте e.target
Лучше уж currentTarget - мало ли, что там вложено будет в мувике...
__________________
...вселенская грусть

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

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
Можно было написать проще:
Вместо последних строк написать так:
Код AS3:
...
mas[i][j] = row;
mas[i][j].addEventListener(MouseEvent.CLICK, oncll);
addChild(mas[i][j]);
...
Можно не регистрировать слушателя события для каждого мувиклипа. Создайте один мувиклип-контейнер и поместите в него все мувиклипы-квадраты. Затем зарегистрируйте слушателя события для контейнера.

Код AS3:
import flash.filters.GlowFilter;
import flash.events.Event;
import flash.display.MovieClip;
import flash.events.MouseEvent;
 
var len:int = 100;
var mas:Array = new Array(len);
var gf1:GlowFilter = new GlowFilter(0xff0000, 0, 0, 0, 0, 0);
var gf3:GlowFilter = new GlowFilter(0xff0000, 2, 2, 2, 2, 2);
var container:MovieClip = new MovieClip();
addChild(container);
function generateWorld(len:int):void {
	...
}
 
container.addEventListener(MouseEvent.CLICK, oncll);
function oncll (e:MouseEvent) {
	e.target.filters = [gf3];
}
 
generateWorld(len);
P.S. Объявляйте переменную-счетчик (т.е. i или j) сразу в операторе for. Так код будет компактнее.


Последний раз редактировалось TWETTI; 16.06.2011 в 13:07.
Старый 16.06.2011, 13:12
marsh вне форума Посмотреть профиль Отправить личное сообщение для marsh Найти все сообщения от marsh
  № 5  
Ответить с цитированием
marsh

Регистрация: Jun 2011
Сообщений: 13
Спасибо.
А что значит "не пишите код в кадре", где его писать тогда и смогу ли я создавать объекты типов из библиотеки сцены?

Старый 16.06.2011, 13:23
marsh вне форума Посмотреть профиль Отправить личное сообщение для marsh Найти все сообщения от marsh
  № 6  
Ответить с цитированием
marsh

Регистрация: Jun 2011
Сообщений: 13
И еще, попробовал и e.target и e.currentTarget, ошибка одна:
TypeError: Error #1010: Термин не определен и не имеет свойств.
at Untitled_fla::MainTimeline/oncll()

(ошибка происходит при попытке клика на объекте).

Старый 16.06.2011, 14:23
TWETTI вне форума Посмотреть профиль Отправить личное сообщение для TWETTI Найти все сообщения от TWETTI
  № 7  
Ответить с цитированием
TWETTI
 
Аватар для TWETTI

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
Цитата:
Сообщение от marsh Посмотреть сообщение
Спасибо.
А что значит "не пишите код в кадре", где его писать тогда и смогу ли я создавать объекты типов из библиотеки сцены?
Код нужно писать в классах.

Цитата:
Сообщение от marsh Посмотреть сообщение
...смогу ли я создавать объекты типов из библиотеки сцены?
Сможете.


Цитата:
Сообщение от marsh Посмотреть сообщение
И еще, попробовал и e.target и e.currentTarget, ошибка одна:
TypeError: Error #1010: Термин не определен и не имеет свойств.
at Untitled_fla::MainTimeline/oncll()

(ошибка происходит при попытке клика на объекте).
Попробуйте так:
Код AS3:
(e.target as MovieClip).filters = [gf3];

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

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Код AS3:
package 
{
    import flash.display.DisplayObject;
    import flash.filters.GlowFilter;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent;
 
    /*
     * Сохраните этот файл как TestProject.as, положите рядом с флешкой
     * и пропишите TestProject как Document Class вашей флешки.
     * В библиотеке у клипа myrow должна быть поставлена галочка
     * Export for ActionScript и имя класса должно быть соответственно
     * myrow.
     */
    public class TestProject extends MovieClip 
    {
        private const GF_2:GlowFilter = new GlowFilter(0xff0000, 2, 2, 2, 2, 2);
 
        private var len:int = 100;
        private var mas:Array = [];
 
        public function TestProject() {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(event:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
 
            for(var i:int = 0; i < len; i++) {
                mas[i] = []; // new Array(len);
                for (var j:int = 0; j < len; j++) {
                    var row:myrow = new myrow();
                    row.x = i * row.width;
                    row.y = j * row.width;
                    mas[i][j] = row;
                    addChild(row); // addChild(mas[i][j]);
                    // Вешаем прослушку кликов на объект myrow.
                    row.addEventListener(MouseEvent.CLICK, oncll);
                }
            }
        }
 
        private function oncll (event:MouseEvent) {
            // Берем ссылку на объект инициировавший событие
            var myrow:DisplayObject = event.target as DisplayObject;
            // Берем его массив фильтров
            var fil:Array = myrow.filters;
            // Добавляем в него свой фильтр
            fil.push(GF_2);
            myrow.filters = fil;
            // Чтобы убрать фильтры делаем так:
            // myrow.filters = [];
        }
    }
}


Последний раз редактировалось bav; 16.06.2011 в 14:33.
Старый 16.06.2011, 15:28
marsh вне форума Посмотреть профиль Отправить личное сообщение для marsh Найти все сообщения от marsh
  № 9  
Ответить с цитированием
marsh

Регистрация: Jun 2011
Сообщений: 13
спасибо большое всем, разобрался

Старый 16.06.2011, 21:42
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 10  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от TWETTI Посмотреть сообщение
Попробуйте так:
Код AS3:
(e.target as MovieClip).filters = [gf3];
Лучше так
Код AS3:
(e.target as DisplayObject).filters
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

Теги
массив объектов , события
Опции темы
Опции просмотра

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

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


 


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


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