![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 23
|
Интересует такой вопрос:
как програмно менять точку регистрации объекта... То-есть мне нужно покрутить объект вокруг его центра, а потом вокруг например его левого края... вот так: ![]() |
|
|||||
|
Регистрация: Jul 2009
Адрес: Москва
Сообщений: 99
|
С помощью размещения вашего объекта внутри контейнера. Устанавливаете позицию объекта внутри контейнера, а затем вращаете сам контейнер. Второй вариант - класс Matrix
Вот пример написал - клавишей пробел объект вращается, щелчек мышью по объекту меняет точку регистрации. Реализовал с помощью Matrix 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(); } } Последний раз редактировалось Dimax4d; 07.12.2009 в 01:24. |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 23
|
Класс, получилось то что я просил, но мне не подходит. В моём случае матрицу применять нельзя. Можно-ли сделать подобное без матрицы?
Обьект поместил в контейнер нужно только сместить центр контейнера, но как? И спасибо за оперативную помощь |
|
|||||
|
Регистрация: Jul 2009
Адрес: Москва
Сообщений: 99
|
А почему матрицу нельзя? С контейнерами математику надо применять, сейчас подумаю
Долго думал, а оказалось все очень просто 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(); } } Последний раз редактировалось Dimax4d; 07.12.2009 в 02:44. |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 23
|
Спасибо огромнейшее!!! Во век не забуду...
Странный у тебя стиль написания кода, зачем писать this везде? И вот это super() это что обращение к суперклассу но к какому не пойму? Просто интересно ))) всё работает и без этого!!! А так всё класс выручил |
|
|||||
|
Регистрация: Jul 2009
Адрес: Москва
Сообщений: 99
|
Работает и без этого, согласен. Но мне так приятнее писать, говорят хороший стиль программирования
+ явное однозначное указание, к чему именно обращаемся. this ставлю не везде, а только там, где идет обращение к свойствам данного класса. Когда переменная объявлена в функции локально либо передана ей как параметр, this не ставится. Тогда можно использовать следующие конструкции:this.num - свойство класса, num - аргумент. В общем я следую рекомендациям местных гуру и пишу везде this, да и с автокомплитом так работать немного проще. А в super() идет обращение к Sprite, ведь наш Main является его наследником Ну и опять же, если свойство определено в суперклассе, то уж совсем правильно будет писать не this, а super ![]() Последний раз редактировалось Dimax4d; 08.12.2009 в 00:11. |
|
|||||
|
Регистрация: May 2004
Сообщений: 56
|
Добрый день! Сталкнулся с такой же проблемой но наоборот. Не могу использовать контейнеры но могу матрицу. И тут нарвался на странное поведение объекта. При многократном масштабировании или вращении через матрицу объект смещается.
Тут мой пост с примером Последний раз редактировалось Vit025; 08.12.2009 в 13:55. |
![]() |
![]() |
Часовой пояс GMT +4, время: 04:58. |
|
|
« Предыдущая тема | Следующая тема » |
|
|