Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как узнать координаты Shape, нарисованного вручную? (http://www.flasher.ru/forum/showthread.php?t=185940)

billion 25.10.2012 18:21

ну а там с привлечением байт кода или ЯВА?

типа сформировать свф и чем-то разобрать на запчасти? есть такие утилитки?

я уже придумал извращённый способ, но он всё таки требует ручную работу. хотелось бы максимально автоматизировать

GBee 25.10.2012 18:25

http://www.as3commons.org/as3-common...ode/index.html

billion 25.10.2012 19:23

Отлично! то что нужно!

парсит так:

Код:

[SWF]
  Header:
    Version: 17
    Compression: None
    FileLength: 202237
    FileLengthCompressed: 202237
    FrameSize: (278.95,259.4)
    FrameRate: 24
    FrameCount: 1
  Tags:
    [69:FileAttributes] AS3: true, HasMetadata: false, UseDirectBlit: false, UseGPU: false, UseNetwork: false
    [09:SetBackgroundColor] Color: #ffffff
    [86:DefineSceneAndFrameLabelData]
      Scenes:
        [0] Frame: 0, Name: Scene 1
    [32:DefineShape3] ID: 1, Bounds: (0,5579,0,5188)
      FillStyles:
        [1] [SWFFillStyle] Type: 00 (solid), Color: #ff9933(b1)
        [2] [SWFFillStyle] Type: 00 (solid), Color: #ff9933(33)
        [3] [SWFFillStyle] Type: 00 (solid), Color: #ff9933(66)
        [4] [SWFFillStyle] Type: 00 (solid), Color: #3399ff(33)
        [5] [SWFFillStyle] Type: 00 (solid), Color: #3399ff(b1)
      LineStyles:
        [1] [SWFLineStyle] Width: 1 Color: #666666(33)
        [2] [SWFLineStyle] Width: 1 Color: #666666(ff)
        [3] [SWFLineStyle] Width: 1 Color: #000000(33)
        [4] [SWFLineStyle] Width: 1 Color: #000000(ff)
      ShapeRecords:
        [0] [SWFShapeRecordStyleChange] MoveTo: 4283,2182, FillStyle0: 2, FillStyle1: 2, LineStyle: 1
        [1] [SWFShapeRecordStraightEdge] Vertical: 600
        [2] [SWFShapeRecordStraightEdge] General: -385,1119
        [3] [SWFShapeRecordStraightEdge] General: -1679,-578
        [4] [SWFShapeRecordStraightEdge] Vertical: -600
        [5] [SWFShapeRecordStyleChange] FillStyle1: 1, LineStyle: 2
        [6] [SWFShapeRecordStraightEdge] General: 385,-1119
        [7] [SWFShapeRecordStraightEdge] General: 1679,578
        [8] [SWFShapeRecordStraightEdge] General: -184,537
        [9] [SWFShapeRecordStyleChange] FillStyle1: 2, LineStyle: 1
        [10] [SWFShapeRecordStraightEdge] General: 184,63
        [11] [SWFShapeRecordStyleChange] MoveTo: 3898,3301
        [12] [SWFShapeRecordStraightEdge] Vertical: 600
        [13] [SWFShapeRecordStyleChange] MoveTo: 4099,2719, FillStyle1: 0, LineStyle: 2
        [14] [SWFShapeRecordStraightEdge] General: -201,582
        [15] [SWFShapeRecordStraightEdge] General: -1494,-514
        [16] [SWFShapeRecordStyleChange] FillStyle1: 2, LineStyle: 1
        [17] [SWFShapeRecordStraightEdge] General: -185,536
        [18] [SWFShapeRecordStyleChange] MoveTo: 5395,2100, FillStyle0: 1, FillStyle1: 1
        [19] [SWFShapeRecordStraightEdge] General: 184,63
        [20] [SWFShapeRecordStyleChange] FillStyle1: 0, LineStyle: 2
        [21] [SWFShapeRecordStraightEdge] Vertical: -600
        [22] [SWFShapeRecordStyleChange] FillStyle1: 2
        [23] [SWFShapeRecordStraightEdge] General: -184,537
        [24] [SWFShapeRecordStyleChange] FillStyle0: 2, LineStyle: 1
        [25] [SWFShapeRecordStraightEdge] General: -4354,-1500
        [26] [SWFShapeRecordStraightEdge] General: -856,2489
        [27] [SWFShapeRecordStyleChange] FillStyle1: 1, LineStyle: 2
        [28] [SWFShapeRecordStraightEdge] General: 4353,1499
        [29] [SWFShapeRecordStraightEdge] General: 857,-2488
        [30] [SWFShapeRecordStyleChange] MoveTo: 1041,0, FillStyle1: 2, LineStyle: 1
        [31] [SWFShapeRecordStraightEdge] Vertical: 600
        [32] [SWFShapeRecordStyleChange] MoveTo: 0,3625, FillStyle0: 1, FillStyle1: 1
        [33] [SWFShapeRecordStraightEdge] General: 185,-536
        [34] [SWFShapeRecordStyleChange] FillStyle1: 2, LineStyle: 2
        [35] [SWFShapeRecordStraightEdge] General: -185,-64
        [36] [SWFShapeRecordStyleChange] FillStyle1: 0
        [37] [SWFShapeRecordStraightEdge] Vertical: 600
        [38] [SWFShapeRecordStraightEdge] General: 4538,1563
        [39] [SWFShapeRecordStyleChange] FillStyle1: 1
        [40] [SWFShapeRecordStraightEdge] Vertical: -600
        [41] [SWFShapeRecordStyleChange] MoveTo: 2404,2787, FillStyle0: 2
        [42] [SWFShapeRecordStraightEdge] General: -185,-64
        [43] [SWFShapeRecordStyleChange] MoveTo: 2404,2787, FillStyle0: 1, FillStyle1: 0
        [44] [SWFShapeRecordStraightEdge] General: 200,-583
        [45] [SWFShapeRecordStyleChange] FillStyle1: 1
        [46] [SWFShapeRecordStraightEdge] Vertical: -600
        [47] [SWFShapeRecordStyleChange] MoveTo: 0,3025, FillStyle0: 0, FillStyle1: 2
        [48] [SWFShapeRecordStraightEdge] General: 1041,-3025
        [49] [SWFShapeRecordStraightEdge] General: 4538,1563
        [50] [SWFShapeRecordStyleChange] MoveTo: 2604,2204, FillStyle0: 1, FillStyle1: 0
        [51] [SWFShapeRecordStraightEdge] General: 1495,515
        [52] [SWFShapeRecordStyleChange] MoveTo: 5579,2163, FillStyle0: 0, FillStyle1: 1
        [53] [SWFShapeRecordStraightEdge] General: -1041,3025
        [54] [SWFShapeRecordEnd]
    [26:PlaceObject2] Depth: 1, CharacterID: 1, Matrix: (1,1,0,0,0,0)
    [82:DoABC] Lazy: true, Length: 201892
    [76:SymbolClass]
      Symbols:
        [0] TagID: 0, Name: Generator
    [01:ShowFrame]
    [00:End]
  Scenes:
    Name: Scene 1, Frame: 0
  Frames:
    [0] Start: 0, Length: 8
      Defined CharacterIDs: 1
      Depth: 1, CharacterId: 1, PlacedAt: 4, IsKeyframe


SpetZ_Naz 02.11.2012 18:11

Не могли бы Вы дать пояснения, что это за набор данных "Парсинга", как он получен и как его использовать?

Может подскажете, как рисовать на Шейпе мышкой и регистрировать события на нем?

billion 02.11.2012 18:17

подключайте вышеуказанную библиотеку и пользуйте так:

Код AS3:

package  {
 
        import flash.display.MovieClip;
        import com.codeazur.as3swf.SWF;
 
 
        public class Generator extends MovieClip {
 
 
                public function Generator() {
                        var swf:SWF = new SWF(root.loaderInfo.bytes);
                        var txt:String = swf.toString();
                        trace(txt);
                }
        }
 
}

мне необходим был только текст свф-ки. дальше я его распарсил во Флэш Билдере.

координаты странные, но понять можно. во первых каждая следующая прибавляется к предыдущей, во вторых каждое число надо разделить на 20.... почему так не знаю, но выяснил методом научного тыка :)

SpetZ_Naz 02.11.2012 18:54

Ну, мне в общем то не нужен текст свф'ки. Можно каким-то образом повесить события на Shape'овскую область? Как задать размер шейповской области?
Привожу код, правильно ли я на шейпе рисую и ищу нужный мне цвет? В принципе работает, но мне кажется, что я на сцене рисую...
Код AS3:

import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.MovieClip;
        import flash.display.Shape;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Point;
 
        public class PaintBall extends MovieClip
        {
                var child:Shape = new Shape();
                var bmd:BitmapData;
 
                public function PaintBall()
                {       
                        addChild(child);
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, onMD);
                        stage.addEventListener(MouseEvent.MOUSE_UP, onMU);       
                }
 
                public function onMD (e:MouseEvent):void{
                        var to_x = e.localX;
                        var to_y = e.localY;
                        child.graphics.lineStyle(2, 0x000000, 100, true, "normal", "none");
                        child.graphics.moveTo(to_x,to_y)
                        stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                }
 
                public function enterFrameHandler(event:Event):void {
                        var m_x:Number = stage.mouseX;
                        var m_y:Number = stage.mouseY;
                        if((m_x>5 && m_x<200) && (m_y>5 && m_y<200)){
                                child.graphics.lineTo(child.mouseX, child.mouseY);
                        }
                }
                public function onMU(event:MouseEvent):void {
                        stage.removeEventListener("enterFrame", enterFrameHandler);
 
                        bmd = new BitmapData (200, 200);
                        bmd.draw(child);
 
                        var coords:Point = null;
                        for (var i:uint = 0; i<bmd.width; i++){
                                for (var j:uint = 0; j<bmd.height; j++){                                       
                                        if (bmd.getPixel(i,j) == 0x000000){
                                                coords = new Point(i, j);
                                                trace('черный цвет найден по адресу:' + coords);
                                        }
                                }
                        }
                }
        }
}

Добавлено через 3 минуты
Дабы мою тему не загружать этим вопросом, попробую здесь разобраться :away:

Wolsh 02.11.2012 20:15

1. Не на сцене. "child.graphics.lineTo(child.mouseX, child.mouseY);". Вы собственный код не понимаете? Вы не выучите язык, нажимая "копировать" и "вставить".
2. Как задать размер шейповской области? Никак. Нет никакой области. Сколько нарисуете, столько и будет "область".
3. "Повесить на шейп события" нельзя. Шейп не наследует InteractiveObject, то есть не слушает мышь и клавиатуру. Используйте Sprite, что может быть проще?
4. Я, признаться, думал, что Вами движет просто любопытство. Потому что всерьез искать через битмапдату координаты, по которым САМ ЖЕ только что рисовал графиксом — такое даже во сне не приснится.

SpetZ_Naz 02.11.2012 21:14

Цитата:

Wolsh
Вы собственный код не понимаете? Вы не выучите язык, нажимая "копировать" и "вставить".
Я не все пока что понимаю, согласен.
Мне интересно с чего Вы начинали..

Я понимаю, что тут полно таких же как я, новичков, не дочитавших как следует теорию и рвущихся уже программировать, но не судите строго, я стараюсь практиковать не забывая читать теорию (Колин Мук). Надеюсь через Вас, старших товарищей по программированию, с подсказками и тумаками, выйти на уровень программирования, а не переписывания, хоть и лепить код с разных справок и источников - это уже не переписывание, кое что я всетаки понимаю.

Цитата:

Используйте Sprite, что может быть проще?
Sprite или MovieClip - есть разница? Что тяжелее для, так скажем, памяти? Разве рисование на Shape не легче системно переносится?

Цитата:

Я, признаться, думал, что Вами движет просто любопытство. Потому что всерьез искать через битмапдату координаты, по которым САМ ЖЕ только что рисовал графиксом — такое даже во сне не приснится.
Да я понимаю Ваше недоумевание. Возможно рисуя линии нужно было бы сразу записывать координаты в массив точек, чтобы их позже циклом отобразить. Надеюсь Вы подскажете как это таки сделать правильно на примерах или дав источники.

Да и вообще, спасибо за внимание, радует что есть люди, которые могут дать грамотные ответы на глупые вопросы.

billion 02.11.2012 23:17

самый грамотный само-ответ - будет прочитать любую книгу по АС3 или ФЛЭШ для того чтобы хотя бы базовые понятия знать. поищите в инете. их там много

Wolsh 02.11.2012 23:39

Цитата:

Sprite или MovieClip - есть разница?
Мувиклип имеет таймлайн ("кадры") и методы/свойства для работы с этим таймлайном. Создавать мувиклипы программно смысла нет, так как практически невозможно создать в нем новые кадры. Конечно, мувиклип "тяжелее" спрайта.
Цитата:

Разве рисование на Shape не легче системно переносится?
Рисование переносится точно так же — рисованием занимается не шейп и не спрайт, а класс Graphics. Естественно, как мувиклип тяжелее спрайта, так же и спрайт тяжелее шейпа. Но вопрос то был не о рисовании, а об интерактивности. Шейп ей не обладает, спрайт обладает. Вот и весь выбор, собственно.
Цитата:

Возможно рисуя линии нужно было бы сразу записывать координаты в массив точек
Точнее, в Vector, который затем можно легко использовать как data в GraphicsPath, но для начала можно и в массив. Если бы рисовались только прямые отрезки от нажатия до отпускания, достаточно было бы брать координаты мыши в обработчике нажатия, и затем координаты в обработчике отпускания. Если же записываем по ENTER_FRAME или по MOUSE_MOVE, то соответственно в обработчике этих событий так же записываем в массив координаты мыши. Однако одним массивом не отделаться, потому что само графическое действие с координатами будет иметь два типа — lineTo() и moveTo(), когда новую координату не надо соединять линией с предыдущей. Соответственно, для каждой пары координат у вас должен быть указатель действия. В классе GraphicsPath например содержатся два Вектора — данные (координаты) и команды (простые целые числа 0, 1 и т.д.). Вектор команд в два раза короче Вектора координат, одной паре координат соответствует одна команда. В вашем случае можно при нажатии мышки записывать в массив команд 1, а в массив координат — координаты мыши из события. А далее в обработчике ентерФрейм записываем в команды 2 и в координаты — текущее положение мыши.
Вот и попробуйте сами написать код. Это гораздо полезней, чем собирать свою Войну и мир из чужих строчек.


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

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