Спрайт (x, y) по умолчанию равен (0,0) в AS3

При выполнении кода:

    var cont:Sprite = new Sprite();
var a:Vector.<int >  = Vector.<int > ([1,2]);
var b:Vector.<Number >  = Vector.<Number > ([0,0,40,40]);
cont.graphics.lineStyle(5, 0x442299);
cont.graphics.drawPath(a, b);
addChild( cont );
cont.x = 100;
cont.y = 100;
trace("X coordinate of purple line: ", cont.x);

Я получаю вывод «Координата X фиолетовой линии: 100»

Однако, когда я тестирую этот код и рисую линию от (100, 100) до (140, 140) с помощью мыши:

var line:Sprite = new Sprite();

stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandler);

var startX:int = -1;
var startY:int = -1;

function mouseDownHandler(event:MouseEvent):void
{
    startX = mouseX;
    startY = mouseY;
}

function mouseUpHandler(event:MouseEvent):void
{
    swype(Vector.<int> ([1,2]), Vector.<Number> ([startX,startY,mouseX,mouseY]));
}

function swype(commands:Vector.<int>, coords:Vector.<Number>):void
{
    var container:Sprite = new Sprite();
    container.graphics.lineStyle(5, 0x0066CC);
    container.graphics.drawPath(commands, coords);
    addChild( container );
    container.x = 100;
    container.y = 100;
    trace("X coordinate of blue line: ", container.x);
}

Я получаю вывод: «Координата X синей линии: 0»

Почему, когда я получаю координаты из положения мыши на экране и добавляю их к вектору, координаты x и y контейнера Sprite по умолчанию равны 0,0?


person Raddfood    schedule 27.12.2011    source источник


Ответы (1)


Не уверен, что вы хотите сделать, но вам может понадобиться использовать методы localToGlobal, если вы продолжаете перемещать этот _container;)

Это связано с контекстом, в котором вы получаете свойство mouseX и mouseY. Вы должны больше думать о стеке отображения и о том, как он соотносится с тем, что вам дадут свойства mouseX и Y.

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

package
{

import flash.display.Sprite;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.MouseEvent;

public class Testing extends Sprite
{
    private var startX:Number;
    private var startY:Number;
    private var _container:Sprite = new Sprite ();

    public function Testing ()
    {
        stage.quality = StageQuality.BEST;
        stage.align = "TL";
        stage.scaleMode = StageScaleMode.NO_SCALE;

//        if you comment this it will stuff up the first swype
        _container.x = _container.y = 100;

        var cont:Sprite = new Sprite ();
        var a:Vector.<int> = Vector.<int> ( [1, 2] );
        var b:Vector.<Number> = Vector.<Number> ( [0, 0, 40, 40] );
        cont.graphics.lineStyle ( 5 , 0x442299 );
        cont.graphics.drawPath ( a , b );
        addChild ( cont );
        cont.x = 100;
        cont.y = 100;

        trace ( "X coordinate of purple line: " , cont.x );
        var line:Sprite = new Sprite ();

        addChild ( _container );
        stage.addEventListener ( MouseEvent.MOUSE_DOWN , mouseDownHandler );

        stage.addEventListener ( MouseEvent.MOUSE_UP , mouseUpHandler );
        var startX:int = - 1;

        var startY:int = - 1;
    }

    function mouseDownHandler ( event:MouseEvent ):void
    {
        startX = _container.mouseX;
        startY = _container.mouseY;
    }

    function mouseUpHandler ( event:MouseEvent ):void
    {
        swype ( Vector.<int> ( [1, 2] ) , Vector.<Number> ( [startX, startY, _container.mouseX, _container.mouseY] ) );
    }


    function swype ( commands:Vector.<int> , coords:Vector.<Number> ):void
    {

        _container.graphics.lineStyle ( 5 , 0x0066CC );
        _container.graphics.drawPath ( commands , coords );
        //this moves it after the property was collected for the initial swype which you don't want
        _container.x = 100;
        _container.y = 100;

        trace ( "X coordinate of blue line: " , _container.x );
    }

}

}
person imp    schedule 27.12.2011