Координаты не меняются при перетаскивании масштабированной графики fxg

Я использую FlashDevelop, actionscript 3 и сборку графики fxg с помощью Illustrator (экспортируется как fxg 2.0).

Я импортирую сборку прямоугольника fxg с помощью Illustrator, затем я делаю его перетаскиваемым, когда вы щелкаете по нему, поэтому его координаты меняются. Это работает, если масштаб прямоугольника равен 1 (это означает отсутствие масштаба). Но если я изменю его масштаб (например, fxgRect.scaleX = fxgRect.scaleY = 0,5; ), вы можете перетащить его, но его координаты не изменятся!! И это сводит меня с ума, потому что спрайт меняет положение, но если вы спросите его координаты, они не изменятся!! И я установил fxgRect.mouseChildren = false;, поэтому я уверен, что переместил спрайт fxgRect, а не что-то внутри него. (Это всего лишь пример, моя цель — создать сложную графику с помощью Illustrator и использовать ее в FlashDevelop).

Заранее спасибо за помощь.

Это код, сделанный для проверки этой проблемы. Чтобы использовать этот пример, вы должны создать прямоугольник fxg (fxgrectangle.fxg) и поместить его в ту же папку класса SimpleDragFxg.as.

import flash.display.*;
import flash.events.*;
import fxgrectangle;

public class SimpleDragFxg extends Sprite
{
    public var fxgRect:Sprite = new fxgrectangle(); // make an istance of fxgRect

    public function SimpleDragFxg()
    {
        //----------------------------------------------------------
        addChild(fxgRect);
        fxgRect.name = "FXGrect";
        fxgRect.x = fxgRect.y = 50;
        fxgRect.mouseChildren = false;
        fxgRect.scaleX = fxgRect.scaleY = 0.5; //<<< this makes the problem
        trace ("I'm ", this.name, "and I contain ", this.fxgRect.name, "which contains ", fxgRect.getChildAt(0).name);
        fxgRect.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
        //--------------------------------------------------------------
    }
    private function onMouseDown (e:MouseEvent):void
    {
        trace ("e.target: ", e.target.name);
        if (DisplayObject(e.target).name == "FXGrect")
        {
            trace ("FXGrect position BEFORE drag: ", fxgRect.x, fxgRect.y);
            Sprite(e.target).startDrag();
            stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
        }
    }
    private function onMouseUp (e:MouseEvent):void
    {
        fxgRect.stopDrag();
        stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
        if (DisplayObject(e.target).name == "FXGrect")
        {
            trace ("FXGrect position AFTER drag: ", fxgRect.x, fxgRect.y);
        } 
    }
}

person AntonioG    schedule 24.02.2013    source источник
comment
Можно ли НЕ масштабировать перетаскиваемый предмет? Я имею в виду, что не применяйте преобразование к перетаскиваемому элементу, вместо этого используйте контейнер, который будет перетаскиваться, и содержимое, к которому будет применено преобразование. Более того, вы можете trace(e.target); в onMouseDown и onMouseUp? Может ты тащишь не то, что думаешь таскать:):):)   -  person Lukasz 'Severiaan' Grela    schedule 25.02.2013
comment
Да, возможно, я мог бы использовать не масштабируемые элементы, но когда я нахожу проблему, я пытаюсь ее решить. Спасибо, что прокомментировали мой вопрос.   -  person AntonioG    schedule 28.02.2013


Ответы (1)


Пытаться

public var fxgRect:Sprite = new Sprite();
fxgRect.addChild(new fxgrectangle());
person Smolniy    schedule 25.02.2013
comment
Да, это работает!!! Здорово! Было бы интересно узнать, почему это работает именно так. Кажется, он очень похож на мой. В любом случае, большое спасибо. - person AntonioG; 28.02.2013
comment
Я бы проголосовал за ваш ответ, но моя репутация слишком низкая, и я не могу... :) - person AntonioG; 28.02.2013
comment
'Здорово! Было бы интересно узнать, почему это работает таким образом. Это очень старый обходной путь для инкапсуляции проблемного блока в мувиклип, я использую его и аналогичные квитанции, начиная с Flash 4 :) - person Smolniy; 28.02.2013
comment
Вам нужно делать такие трюки, чтобы работать с объектом, у которого нет хороших сеттеров и геттеров по ширине, высоте и масштабу. Основная проблема в том, что эти функции не влияют на матрицу преобразования объекта. Иногда это хорошо (когда вы хотите увеличить текстовое поле, вы устанавливаете большую ширину, и у вас нет проблем с изменением масштаба), но иногда нет (как в вашем случае). Решение состоит в том, чтобы добавить объекты этого типа в качестве дочерних объектов другого (и преобразовать родителя) или использовать модификации трансформации.matrix (затем не забудьте повторно применить матрицу после модификаций!). - person Konrad; 19.04.2013