Просмотр полной версии : Изменения свойств нажатого объекта
olejan1991
06.04.2013, 15:25
Создаются объекты cell. При клике на один из них хочу, чтобы менялся его цвет. В коде ниже видны мои попытки, но они неудачны. Как сделать?
public function displayCell(dataFromXML:XML):void
{
for(var i:int = 0; i < 5; i++)
{
var sizeCell:uint = 100;
var cell:Sprite = new Sprite();
cell.graphics.beginFill(0xCCCCCC, 1.0);
cell.graphics.lineStyle(1, 0x000000);
cell.graphics.drawRect(i * sizeCell, 30, sizeCell, sizeCell);
cell.buttonMode = true;
addChild(cell);
cell.addEventListener(MouseEvent.CLICK, cellActions);
}
}
//Метод запускаемый по клику
public function cellActions(e:MouseEvent):void
{
//Здесь, по идее, должно происходить изменение цвета
//e.currentTarget.graphics.beginFill(0xFFFFFF, 1.0);
e.target.graphics.beginFill(0xFFFFFF, 1.0);;
}
Это не изменяет цвет, а задает цвет для будущего рисования.
Добавлено через 7 минут
Даже если Вы не согласны с советами сделать Cell отдельным классом, то хотя бы сделайте вразумительно сами спрайты-клетки. Зачем Вы рисуете в них в разных координатах? Рисуйте в (0, 0), и расставляйте спрайты в нужные координаты прямо в этом же цикле.
Добавлено через 14 минут
var cellSize:uint = 100;
public function displayCell(dataFromXML:XML):void
{
for(var i:int = 0; i < 5; i++)
{
var cell:Sprite = new Sprite();
cell.graphics.beginFill(0xCCCCCC, 1.0);
cell.graphics.lineStyle(1, 0x000000);
cell.graphics.drawRect(0, 0, cellSize, cellSize);
cell.buttonMode = true;
addChild(cell);
cell.x = i * cellSize;
cell.y = 30;
cell.addEventListener(MouseEvent.CLICK, onCellClick);
}
}
//Метод запускаемый по клику
public function onCellClick(e:MouseEvent):void
{
//Здесь, по идее, должно происходить изменение цвета
var cell:Sprite = e.target as Sprite;
cell.graphics.clear();
cell.graphics.beginFill(0xFFFFFF, 1.0);
cell.graphics.lineStyle(1, 0x000000);
cell.graphics.drawRect(0, 0, cellSize, cellSize);
}
olejan1991
06.04.2013, 15:52
так у меня cell в отдельном классе и фрагмент кода из него, а координаты у меня на самом деле не такие. Вопрос ведь по цвету, и координаты стоят не те, что в коде. Прикрепил полностью проект. Wolsh, прошу Вас его глянуть и оценить в плане правильности.
Александр Мостовой
06.04.2013, 16:05
Не знаю стоит ли их перерисовывать - проще применить colorTransform
private function mouseEventHandler(event:MouseEvent):void
{
var obj:DisplayObject = event.target as DisplayObject;
setTint(obj, color, percent);
}
private function setTint(object:DisplayObject, rgb:uint, percent:uint):void
{
var t:Transform = new Transform(object);
var ct:ColorTransform = t.colorTransform;
var ratio : Number = percent / 100;
ct.redOffset = (rgb >> 16)*ratio;
ct.greenOffset = ((rgb >> 8) & 0xFF)*ratio;
ct.blueOffset = (rgb & 0xFF)*ratio;
ct.redMultiplier = ct.greenMultiplier = ct.blueMultiplier = 1 - percent/100;
t.colorTransform = ct;
}
Правда с точки зрения архитектуры не очень хорошая правктика менять свойства прямов в событии. Лучше устанавливать виртуальное свойство, а уже ячейки из него пусть берут текущий цвет
Добавлено через 6 минут
Для некоторых случаев когда элемент уже раскрашен определенным образом неплохо смотрится наложение поверх плашки в режиме BlendMode.OVERLAY (или другом).
Тогда сохраняются некоторые оттенки основной графики и элемент обретает некоторый общий стиль в определенном тоне, а не происходит полное перекрашивание
Добавлено через 7 минут
А вообще посмотрите на устройство компонента DataGrid в стандартном наборе флеш компонентов или же его же и используйте
olejan1991
06.04.2013, 16:14
Спасибо за все ответы, но не зацикливайтесь на изменении цвета. Я про цвет спросил, чтобы понять как вообще обратиться к объекту на который нажали и совершать с ним какие-то действия.
(e.currentTarget as ВашКласс).конкретныйМетод()
caseyryan
06.04.2013, 16:39
Не знаю стоит ли их перерисовывать - проще применить colorTransform
Это шутка? Перерисовать как раз гораздо проще
OK, зацикливаться на цвете реально не приходится. В Вашем коде при любом действии все объекты до единого заново пересоздаются. Я уже не говорю про эффективность использования памяти; объясните мне, как Вы собираетесь управлять системой, каждая часть которой удаляется и создается новая при любом действии?
Зачем Вам создавать новый редактор XML при каждом клике по "добавить/отнять колонку/строку"? Зачем удалять всю карту при этом и создавать с нуля новую? У Вас же в классе есть метод, обновляющий текущую карту (собственно о нем и ставился вопрос). И редактор в единственном числе прекрасно справляется. Такое ощущение, что код писали два человека, забыв договориться.
Александр Мостовой
06.04.2013, 16:51
Это шутка? Перерисовать как раз гораздо проще
СТранное у вас понятие о шутках...
Нет смысла это обсуждать в отрыве от конкретной задачи и условий.
Для случая с использованием аппаратной поддержки, например, так перезагрузка данных тормознутее на пару порядков без вариантов.
Ди и без аппаратной поддержки перерисовка занимает все же больше ресурсов чем перекраска.
olejan1991
06.04.2013, 17:10
В Вашем коде при любом действии все объекты до единого заново пересоздаются. Я уже не говорю про эффективность использования памяти; объясните мне, как Вы собираетесь управлять системой, каждая часть которой удаляется и создается новая при любом действии?
Зачем Вам создавать новый редактор XML при каждом клике по "добавить/отнять колонку/строку"? Зачем удалять всю карту при этом и создавать с нуля новую? У Вас же в классе есть метод, обновляющий текущую карту (собственно о нем и ставился вопрос). И редактор в единственном числе прекрасно справляется. Такое ощущение, что код писали два человека, забыв договориться.
private var editor:XMLEditor;
public function completeLoad(e:Event):void
{
// Присваиваем данные XML переменной
dataMap = new XML(urlLoader.data);
// Добавляем тулбар
toolbar();
// Добавляем карту
cellMap();
editor = new XMLEditor(dataMap); // теперь создаем только один редактор
}
public function buttonActions(e:MouseEvent):void
{
//удаление всех объектов убираем
//removeChild(cell);
//cell = null;
if(e.target.name == "ADD_LINE")
{
editor.addLine();
}
else if (e.target.name == "DEL_LINE")
{
//removeChild(cell);
//cell = null;
editor.delLine();
}
else if (e.target.name == "ADD_COLUMN")
{
editor.addColumn();
}
else if (e.target.name == "DEL_COLUMN")
{
//removeChild(cell);
//cell = null;
editor.delColumn();
}
cell = new Map();
// обновляем отображение
cell.displayCell(dataMap);
addChild(cell);
}
и теперь я не могу понять как его заставить работать, потому что так ничего не работает
package
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import map.Map;
import map.Toolbar;
import map.XMLEditor;
public class VirtualMap2 extends Sprite
{
// Переменная, в которой будут храниться загруженные XML-данные
private var dataMap:XML;
// Объект, используемый для загрузки XML-данных
private var urlLoader:URLLoader;
private var editor:XMLEditor;
private var cell:Map;
public function VirtualMap2()
{
// Указываем местоположения внешнего источника XML-данных
var urlRequest:URLRequest = new URLRequest("XML/map0.xml");
// Создаем объект, который умеет загружать внешние текстовые данные
urlLoader = new URLLoader();
// Регистрируем обработчик, чтобы событие об окончании загрузки XML-данных
urlLoader.addEventListener(Event.COMPLETE, completeLoad);
// Загружаем XML-данные
urlLoader.load(urlRequest);
}
public function completeLoad(e:Event):void
{
// Присваиваем данные XML переменной
dataMap = new XML(urlLoader.data);
// Добавляем тулбар
toolbar();
// Добавляем карту
editor = new XMLEditor(dataMap);
cellMap();
}
// Добавляем тулбар
public function toolbar():void
{
var toolbar:Toolbar = new Toolbar();
toolbar.addButton(5, 3, 25, 25, "ADD_LINE");
toolbar.addButton(40, 3, 25, 25, "DEL_LINE");
toolbar.addButton(75, 3, 25, 25, "ADD_COLUMN");
toolbar.addButton(110, 3, 25, 25, "DEL_COLUMN");
addChild(toolbar);
toolbar.addEventListener(MouseEvent.CLICK, buttonActions);
}
// Добавляем карту
public function cellMap():void
{
cell = new Map();
cell.displayCell(dataMap);
addChild(cell);
}
public function buttonActions(e:MouseEvent):void
{
switch(e.target.name)
{
case "ADD_LINE" : editor.addLine();
break;
case "DEL_LINE" : editor.delLine();
break;
case "ADD_COLUMN" : editor.addColumn();
break;
case "DEL_COLUMN" : editor.delColumn();
break;
}
cell.displayCell(dataMap);
}
}
}
package map
{
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Map extends Sprite
{
private var sizeCell:uint;
public function Map()
{
super();
}
public function displayCell(dataFromXML:XML):void
{
this.removeChildren();
var numberCell:uint = dataFromXML..@x.length();
sizeCell = dataFromXML.@SIZE;
for(var i:int = 0; i < numberCell; i++)
{
var cell:Sprite = new Sprite();
cell.graphics.lineStyle(1, 0x000000);
cell.graphics.beginFill(0xCCCCCC, 1.0);
cell.graphics.drawRect(0, 0, sizeCell, sizeCell);
cell.x = dataFromXML..@x[i];
cell.y = dataFromXML..@y[i];
cell.buttonMode = true;
addChild(cell);
cell.addEventListener(MouseEvent.CLICK, cellActions);
cell.name = "x" + cell.x + "y" + cell.y;
}
}
public function cellActions(e:MouseEvent):void
{
var cell:Sprite = e.currentTarget as Sprite;
cell.graphics.clear();
cell.graphics.lineStyle(1, 0x000000);
cell.graphics.beginFill(0xFF0000, 1.0);
cell.graphics.drawRect(0, 0, sizeCell, sizeCell);
trace(e.currentTarget.name);
}
}
}
olejan1991
06.04.2013, 17:24
спасибо
Добавлено через 51 минуту
Не могу понять какая разница между removeChildren и removeChild?
Александр Мостовой
06.04.2013, 18:21
Не могу понять какая разница между removeChildren и removeChild?
removeChildren - все дочерние элементы
removeChild - только один
На всякий случай: в английском Children - множественное число от Child(исключение) :)
olejan1991
06.04.2013, 18:29
Т. е. в коде
public function displayCell(dataFromXML:XML):void
{
///////////////////////////////////////////////////////////////////
this.removeChildren(); // вот в этом месте
//////////////////////////////////////////////////////////////////
var numberCell:uint = dataFromXML..@x.length();
sizeCell = dataFromXML.@SIZE;
for(var i:int = 0; i < numberCell; i++)
{
var cell:Sprite = new Sprite();
cell.graphics.lineStyle(1, 0x000000);
cell.graphics.beginFill(0xCCCCCC, 1.0);
cell.graphics.drawRect(0, 0, sizeCell, sizeCell);
cell.x = dataFromXML..@x[i];
cell.y = dataFromXML..@y[i];
cell.buttonMode = true;
addChild(cell);
cell.addEventListener(MouseEvent.CLICK, cellActions);
cell.name = "x" + cell.x + "y" + cell.y;
}
}
удаляются все элементы cell и потом рисуются заново?
Да.
У Вас просто вся карта удалялась. Я удаляю все ячейки, просто потому, что мне лично лень писать за Вас весь код. По-уму, естественно, надо удалять только те, которых больше нет в xml, и добавлять только те, которых нет на карте. Это уж сами.
olejan1991
11.04.2013, 22:50
Добавляются итак только те, которых нет на карте, а вот как убирать только те, которые убираются из XML не могу понять.
Добавляются итак только те, которых нет на картеУ Вас вся карта удалялась. Вся. Естественно, когда Вы затем создавали новую, на ней НИЧЕГО не было.
В принципе, дело житейское. Это не игра, а редактор, и суперскорости здесь не надо. Надо только запоминать такие вещи, как выделенный в настоящий момент блок, например.
А лучше вообще всю архитектуру сделать человеческой)) И генерить XML только когда надо сохранить результат, а в процессе обходиться простым и понятным массивом (или вектором).
olejan1991
12.04.2013, 09:47
А лучше вообще всю архитектуру сделать человеческой)) И генерить XML только когда надо сохранить результат, а в процессе обходиться простым и понятным массивом (или вектором).
спасибо. узнать бы что еще должно быть в моем так называемом приложении по человечески). Буду переделывать под массивы.
1. Но ведь функция отображения из Xml все равно получается должна быть, на случай если я захочу подгрузить карту из существующего XML или скорее функция считывания данных из XML в массив?
2. Сохранять XML нужно будет с помощью php?
3. Как удалить с экрана элементы, которые удаляются из массива?
XML - самая человеческая структура ибо предназначена для агрегатирования данных и запросов.
Пример : uzels//*/Uzel. Просто же чем писать кучу однотипных циклов.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.