PDA

Просмотр полной версии : как изменить точку регистрации муви клипа


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

Dimax4d
07.12.2009, 00:31
С помощью размещения вашего объекта внутри контейнера. Устанавливаете позицию объекта внутри контейнера, а затем вращаете сам контейнер. Второй вариант - класс 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();

}

}

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

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

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


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 не ставится. Тогда можно использовать следующие конструкции:


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


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

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

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

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

Тут мой пост с примером (http://www.flasher.ru/forum/showthread.php?t=133523)