Sprite (x, y) по умолчанию (0,0) в AS3 - PullRequest
0 голосов
/ 27 декабря 2011

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

    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?

1 Ответ

1 голос
/ 27 декабря 2011

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

Это связано с тем, где вы получаете свойство 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 );
    }

}

}
...