PDA

Просмотр полной версии : Изменения свойств нажатого объекта


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);;
}

Wolsh
06.04.2013, 15:35
Это не изменяет цвет, а задает цвет для будущего рисования.

Добавлено через 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
Спасибо за все ответы, но не зацикливайтесь на изменении цвета. Я про цвет спросил, чтобы понять как вообще обратиться к объекту на который нажали и совершать с ним какие-то действия.

Котяра
06.04.2013, 16:22
(e.currentTarget as ВашКласс).конкретныйМетод()

caseyryan
06.04.2013, 16:39
Не знаю стоит ли их перерисовывать - проще применить colorTransform
Это шутка? Перерисовать как раз гораздо проще

Wolsh
06.04.2013, 16:47
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);
}

и теперь я не могу понять как его заставить работать, потому что так ничего не работает

Wolsh
06.04.2013, 17:14
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 и потом рисуются заново?

Wolsh
06.04.2013, 20:15
Да.
У Вас просто вся карта удалялась. Я удаляю все ячейки, просто потому, что мне лично лень писать за Вас весь код. По-уму, естественно, надо удалять только те, которых больше нет в xml, и добавлять только те, которых нет на карте. Это уж сами.

olejan1991
11.04.2013, 22:50
Добавляются итак только те, которых нет на карте, а вот как убирать только те, которые убираются из XML не могу понять.

Wolsh
12.04.2013, 00:53
Добавляются итак только те, которых нет на картеУ Вас вся карта удалялась. Вся. Естественно, когда Вы затем создавали новую, на ней НИЧЕГО не было.
В принципе, дело житейское. Это не игра, а редактор, и суперскорости здесь не надо. Надо только запоминать такие вещи, как выделенный в настоящий момент блок, например.
А лучше вообще всю архитектуру сделать человеческой)) И генерить XML только когда надо сохранить результат, а в процессе обходиться простым и понятным массивом (или вектором).

olejan1991
12.04.2013, 09:47
А лучше вообще всю архитектуру сделать человеческой)) И генерить XML только когда надо сохранить результат, а в процессе обходиться простым и понятным массивом (или вектором).

спасибо. узнать бы что еще должно быть в моем так называемом приложении по человечески). Буду переделывать под массивы.

1. Но ведь функция отображения из Xml все равно получается должна быть, на случай если я захочу подгрузить карту из существующего XML или скорее функция считывания данных из XML в массив?

2. Сохранять XML нужно будет с помощью php?

3. Как удалить с экрана элементы, которые удаляются из массива?

Babylon
12.04.2013, 10:24
XML - самая человеческая структура ибо предназначена для агрегатирования данных и запросов.
Пример : uzels//*/Uzel. Просто же чем писать кучу однотипных циклов.