Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как изменить точку регистрации муви клипа (http://www.flasher.ru/forum/showthread.php?t=133487)

Carnage 07.12.2009 00:27

как изменить точку регистрации муви клипа
 
Интересует такой вопрос:
как програмно менять точку регистрации объекта... То-есть мне нужно покрутить объект вокруг его центра, а потом вокруг например его левого края... вот так:
http://http://cs4551.vkontakte.ru/u3...x_9239dd43.jpg

Dimax4d 07.12.2009 00:31

С помощью размещения вашего объекта внутри контейнера. Устанавливаете позицию объекта внутри контейнера, а затем вращаете сам контейнер. Второй вариант - класс Matrix

Вот пример написал - клавишей пробел объект вращается, щелчек мышью по объекту меняет точку регистрации. Реализовал с помощью Matrix

Код AS3:

package
{
        import flash.display.Shape;
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.events.KeyboardEvent;
        import flash.events.MouseEvent;
        import flash.geom.Matrix;
        import flash.geom.Point;
        import flash.ui.Keyboard;
 
        public class Main extends Sprite
        {
 
                public function Main()
                {
                        super();
 
                        stage.align = StageAlign.TOP_LEFT;
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, this.keyBoardHandler);
 
                        this.obj.graphics.beginFill(0);
                        this.obj.graphics.drawRect(0, 0, 100, 150);
                        this.obj.transform.matrix = new Matrix();
                        this.obj.addEventListener(MouseEvent.CLICK, this.mouseClickHandler);                       
                        super.addChild(this.obj);
 
                        this.pivot.graphics.beginFill(0xFFFF00);
                        this.pivot.graphics.drawCircle(0, 0, 3);
                        this.obj.addChild(this.pivot);
                }
 
                private function mouseClickHandler(event:MouseEvent):void {
                        this.pivot.x = this.point.x = event.localX;
                        this.pivot.y = this.point.y = event.localY;
 
                }
 
                private function keyBoardHandler(event:KeyboardEvent):void {
                        var m:Matrix = new Matrix();
                        m.translate(-this.point.x, -this.point.y);
                        m.rotate(0.1);
                        m.translate(this.point.x, this.point.y);                       
                        m.concat(this.obj.transform.matrix);
                        switch (event.keyCode) {
                                case Keyboard.SPACE:
                                        this.obj.transform.matrix = m;
                                break;
                        }
                }
 
                private var obj:Sprite = new Sprite();
                private var point:Point = new Point();
                private var pivot:Shape = new Shape();
 
        }
 
}


Carnage 07.12.2009 01:50

Класс, получилось то что я просил, но мне не подходит. В моём случае матрицу применять нельзя. Можно-ли сделать подобное без матрицы?
Обьект поместил в контейнер нужно только сместить центр контейнера, но как?
И спасибо за оперативную помощь

Dimax4d 07.12.2009 02:03

А почему матрицу нельзя? С контейнерами математику надо применять, сейчас подумаю

Долго думал, а оказалось все очень просто

Код AS3:

package
{
        import flash.display.Shape;
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.events.KeyboardEvent;
        import flash.events.MouseEvent;
        import flash.ui.Keyboard;
 
        public class Main extends Sprite
        {
 
                public function Main()
                {
                        super();
 
                        stage.align = StageAlign.TOP_LEFT;
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, this.keyBoardHandler);
 
                        this.obj.graphics.beginFill(0);
                        this.obj.graphics.drawRect(0, 0, 100, 150);
                        this.obj.addEventListener(MouseEvent.CLICK, this.mouseClickHandler);                       
                        this.container.addChild(this.obj);
                        super.addChild(this.container);
 
                        this.pivot.graphics.beginFill(0xFFFF00);
                        this.pivot.graphics.drawCircle(0, 0, 3);
                        this.container.addChild(this.pivot);
                }
 
                private function mouseClickHandler(event:MouseEvent):void {
                        this.container.x = event.stageX;
                        this.container.y = event.stageY;                       
 
                        this.obj.x = -event.localX;
                        this.obj.y = -event.localY;
                }
 
                private function keyBoardHandler(event:KeyboardEvent):void {
                        switch (event.keyCode) {
                                case Keyboard.SPACE:
                                        this.container.rotation += 5;
                                break;
                        }
                }
 
                private var obj:Sprite = new Sprite();
                private var container:Sprite = new Sprite();
                private var pivot:Shape = new Shape();
 
        }
 
}


Carnage 07.12.2009 23:07

Спасибо огромнейшее!!! Во век не забуду...
Странный у тебя стиль написания кода, зачем писать this везде?
И вот это super() это что обращение к суперклассу но к какому не пойму?
Просто интересно ))) всё работает и без этого!!! А так всё класс выручил

Dimax4d 08.12.2009 00:08

Работает и без этого, согласен. Но мне так приятнее писать, говорят хороший стиль программирования:) + явное однозначное указание, к чему именно обращаемся. this ставлю не везде, а только там, где идет обращение к свойствам данного класса. Когда переменная объявлена в функции локально либо передана ей как параметр, this не ставится. Тогда можно использовать следующие конструкции:

Код AS3:

public function f(num:int) {
    this.num = num;
}

this.num - свойство класса, num - аргумент. В общем я следую рекомендациям местных гуру и пишу везде this, да и с автокомплитом так работать немного проще.

А в super() идет обращение к Sprite, ведь наш Main является его наследником

Ну и опять же, если свойство определено в суперклассе, то уж совсем правильно будет писать не this, а super :)

Vit025 08.12.2009 13:38

Добрый день! Сталкнулся с такой же проблемой но наоборот. Не могу использовать контейнеры но могу матрицу. И тут нарвался на странное поведение объекта. При многократном масштабировании или вращении через матрицу объект смещается.

Тут мой пост с примером


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

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