Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Граф и event (http://www.flasher.ru/forum/showthread.php?t=169400)

savva 04.10.2011 18:11

Граф и event
 
Здравствуйте,два дня маюсь над задачкой,решение всё не приходит на ум.

Есть граф(вообще дерево с произвольным количеством детей)
члены данные
-указатель на голову типа Vertex
-указатель текущий вершины(для работы с графом).

class Vertex
- class Image
- список Vertex

class Image имеет следующие члены данные:
- src image
- Vector<Pointer>

Pointer -это стрелки которые должны быть созданы поверх изображения.
члены данные
- координаты
- src изображения стрелки (возможно)

i- ая стрелка в списке стрелок соответствует i- ой вершине в списке вершин. (для текущий вершины).

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

Собственно как разобраться со стрелочками?Как определить какая стрелочка сработала? какой-то признак дополнительный создавать? Или делать какой-то класс интерфейс?

Ответ можно псевдокодом или на словах,конкретную реализацию я уже сделаю самостоятельно.

flax4Noob 04.10.2011 19:58

Если стрелка-потомок Спрайта, то почему не повесить слушателя для его "onclick"? Если стрелка-потомок Битмапа, и вы все рисуете на "битмап", то вперед поиском по координатам клика в битмап. Координаты стрелки у вас есть, размер стрелки тоже имеется.

savva 04.10.2011 20:09

Пока что класс стрелки не чей потомок,поскольку не знаю что именно с ним делать,поэтому обратился сюда с вопросом.

ну у меня имеется класс для добавления изображения
Код AS3:

[Event(name="complete", type="flash.events.Event")]
public class ImgLoader extends EventDispatcher
{
private var loader:Loader = new Loader();
private var bitmap: BitmapData;
private var bmp:Bitmap;
private var sprBmp:Sprite = new Sprite();
 
public function ImgLoader(s:String)
{
//Начинаем загрузку
loader.load(new URLRequest(s));
// подписываем обработчики события
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,displayImage);
}
 
private function displayImage(evt:Event):void {
bitmap = new BitmapData(loader.width, loader.height, false, 0xFFFFFFFF);
bitmap.draw(loader.content);
bmp = new Bitmap(bitmap, "auto", true);
sprBmp.addChild(bmp);
dispatchEvent(new Event(Event.COMPLETE));
}       
public function getSprite():Sprite
{
return sprBmp;
}
}

Использую его для добавления на сцену изображений,но могу и для стрелок.
На сцену я отправляю уже готовый спрайт с изображением,хотя наверное это не правильно,лучше отправлять bitmap и уже этот bitmap добавлять на sprite в сцене

И так вот что у меня получилось
я отнаследовал стрелку от спрайта
Код AS3:

public class Pointer extends Sprite
// добавил метод добавения
        public function loadPointer():Pointer
                {
                        var x:ImgLoader = new ImgLoader(srcpoint);
                        x.getSprite().x = coord.x;
                        x.getSprite().y = coord.y;
                        addChild(x.getSprite());
                        return this;
                }

ImgLoader работает исправно.

далее мне нужно определить какая стрелка была нажата на sprite, сначала покажу как добавляю стрелки на сцену и привязываю event. Сделан отдельный спрайт на который добавляются изображение и стрелки.

Код AS3:

public function Scene(_gr:Graph) 
                {
                //Начинаем загрузку
                        gr = _gr;
                        spim = new Sprite();
                        SetImg(gr.getCurrent());
                        addChild(spim);
                }
                private function SetImg(s:Vertex):void
                {
                        load = new ImgLoader(s.getImg().getSrc());
                        spim.addChild(load.getSprite());
                        for (var i:Number = 0; i < s.getImg().getPointers().length; i++)
                        {
                                s.getImg().getPointers()[i].loadPointer().addEventListener(MouseEvent.CLICK, onMouseClickSpim);
                                spim.addChild(s.getImg().getPointers()[i].loadPointer());
                        }
                        addChild(spim);
                        //spim.addEventListener(MouseEvent.CLICK, onMouseClickSpim);
                }
                private function onMouseClickSpim(e:MouseEvent):void
                {
                        _parent = gr.getCurrent();
                        var l:Number = 1;
                        for (var i:Number=0; i < gr.getCurrent().getImg().getPointers().length; i++)
                                {
                                        trace("for");
                                        if (gr.getCurrent().getImg().getPointers()[i] == e.target as Pointer)
                                        {
// Сюда не заходит алгоритм,проверку не производит. Как проверить на какую стрелку нажал пользователь?
 
                                                trace(i);
                                                l = l+i;
                                                break;
                                        }
                                }
                        gr.setCurrent(gr.getCurrent().getList().getElembyInde(l) as Vertex);
                        SetImg(gr.getCurrent());
                }
        }

Проверка происходит но трейс показал следующее
Код AS3:

gr.getCurrent().getImg().getPointers()[i]= pointer
e.target as Pointer = null
e.target = Sprite

Вопрос решил путём сравнения координат.


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

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