AS3: установка регистрационной точки DisplayObject с actionscript?

Вы можете заменить две внутренние петли на что-то вроде этого:

for(int j = i + 1;; j++)
{
    j %= myObjects_ptr.size();
    if (j == i)
    {
        break;
    }
    // Do stuff
}
10
задан Ronn 16 March 2009 в 14:07
поделиться

4 ответа

API Flash Player этого не раскрывает. Я полагаю, что это происходит потому, что Flash создает в точке регистрации данные формы при создании SWF. Таким образом, нет фактической точки регистрации, которую нужно переместить (вместо этого вы бы переместили данные формы ... если бы Flash Player позволял вам редактировать данные формы!).

Я всегда решаю эту проблему, просто помещая свой спрайт / форму в родительский элемент к другой DisplayObject. Итак, если у меня есть spriteA и я хочу установить его точку регистрации на (15, 35), я бы сделал это:


var spriteB:Sprite = new Sprite();
spriteB.addChild(spriteA);
spriteA.x = 15;
spriteA.y = 35;

И затем с тех пор ссылаюсь на spriteB везде, где я ранее ссылался на spriteA.

12
ответ дан 3 December 2019 в 19:35
поделиться

В зависимости от того, почему Вам нужен он, это могло бы быть решено при помощи DisplayObject.transform.matrix, который возвращает Матричный объект.

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

0
ответ дан 3 December 2019 в 19:35
поделиться

Вам означают индекс?

Развитие комментарии, можно сделать быструю реализацию как ниже. Это не точно, что Вы хотите, поскольку Вы не можете установить различное выравнивание для каждого ребенка. Я просто не хотел делать его слишком сложным, это больше похоже на 'рабочий псевдо код' для давания Вам общее представление...

package  
{
    import flash.display.DisplayObject;
    import flash.display.Sprite;    


    public class SpriteWithRegistration extends Sprite 
    {

        private var _regV:String = "T";
        private var _regH:String = "L";

        private var _width:Number = 0;
        private var _height:Number = 0;


        public function SpriteWithRegistration(width:Number, height:Number, registrationPoint:String = "TL")
        {
            this.width  = height;
            this.height = width;
            this.registrationPoint = registrationPoint;
        }

        public function set registrationPoint(p:String):void
        {
            if(p.length != 2) return;

            var regV:String = p.toUpperCase().substr(0, 1);
            var regH:String = p.toUpperCase().substr(1, 1);

            _regV = (regV == "T" || regV == "C" || regV == "B" ) ? regV : _regV;
            _regH = (regH == "L" || regH == "C" || regH == "R" ) ? regH : _regH;

            alignChildren();
        }

        override public function addChild(child:DisplayObject):DisplayObject
        {
            alignChild(child);
            super.addChild(child);
            return child;
        }

        override public function set width(value:Number):void
        {
            _width = value;
            alignChildren();
        }

        override public function get width():Number
        {
            return _width;
        }

        override public function set height(value:Number):void
        {
            _height = value;
            alignChildren();
        }

        override public function get height():Number
        {
            return _height;
        }

        private function alignChildren():void
        {
            for(var index:int = 0;index < numChildren; index++ )
                alignChild(getChildAt(index));
        }

        private function alignChild(disp:*):void
        {
            switch(_regH)
            {
                case "L":   disp.x = 0;                             break;
                case "C":   disp.x = _width*.5 - disp.width * .5;   break;
                case "R":   disp.x = _width - disp.width;           break;
            }

            switch(_regV)
            {
                case "T":   disp.y = 0;                             break;
                case "C":   disp.y = _height*.5 - disp.height * .5; break;
                case "B":   disp.y = _height - disp.height;         break;
            }
        }
    }
}
2
ответ дан 3 December 2019 в 19:35
поделиться

Использование матрицы преобразования возможно. Хорошая реализация этого найдена на этом сайте.

public function setRegistrationPoint(s:Sprite, regx:Number, regy:Number, showRegistration:Boolean )
{
    //translate movieclip 
    s.transform.matrix = new Matrix(1, 0, 0, 1, -regx, -regy);

    //registration point.
    if (showRegistration)
    {
        var mark:Sprite = new Sprite();
        mark.graphics.lineStyle(1, 0x000000);
        mark.graphics.moveTo(-5, -5);
        mark.graphics.lineTo(5, 5);
        mark.graphics.moveTo(-5, 5);
        mark.graphics.lineTo(5, -5);
        s.parent.addChild(mark);
    }
}
5
ответ дан 3 December 2019 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: