PDA

Просмотр полной версии : Привязка координат вложенного клипа к _root


Plery
16.02.2011, 14:42
Здравствуй Всем! На форуме я новый, так что не бейте сильно если что-то не так напишу.
На AS2 делаю игрушку, т.к. пока что я больше дизайнер чем программист - столкнулся с неразрешимой для меня задачей: есть клип MAIN_mc, который содержит еще 2 клипа ball и arrow_mc. Выглядят они соответственно как стрелка и шар. На таймлайне MAIN_mc размещен код:

this.onPress = function(){
startDrag(this, false, 30, 30, 570, 320);
}

this.onRelease = this.onReleaseOutside = function(){
stopDrag();
}

onEnterFrame = function(){
arrow_mc._x=_xmouse
arrow_mc._y=_ymouse
var dx:Number = arrow_mc._x - ball._x;
var dy:Number = arrow_mc._y - ball._y;
var radians:Number = Math.atan2(dy, dx);
var angle:Number = radians * 180 / Math.PI;
arrow_mc._rotation = angle;
}

Задача этого кода отслеживать положение двух вложенных клипов относительно друг друга (т.е. стрелка постоянно указывает на шар, т.к. так надо). Стрелка соответственно "зацеплена" к мышке, а сам клип MAIN_mc можно таскать по сцене. Так вот я размещаю на _root множество экземпляров клипа MAIN_mc и рядом с курсором оживает пучок стрелок, каждая из которых указывает на свой экземпляр. Так вот СМЫСЛ В ТОМ, чтобы клип со стрелкой-указателем не таскался за курсором, как в моем примере, а располагался в нужной мне точке сцены, например по центру. Либо, что еще лучше, принимал координаты другого клипа, расположенного на _root, и при перетаскивании экземпляров клипа MAIN_mc никуда не смещался! Нужно каким-то образом переписать этот участок кода: arrow_mc._x=_xmouse
arrow_mc._y=_ymouse Причем так, чтобы если я вдруг клип MAIN_mc всуну еще в один клип (а так скорее всего случится), скрипт продолжал работать! Задавал вопросы на других форумах, но не получил даже вразумительного ответа возможно ли такое в принципе. Здесь по форуму смотрел подобные темы - ответа либо нет, либо не нашел. Сам догадываюсь, что методы getBounds и localToGlobal наверное существуют как раз для подобных целей, пытался даже принять координаты _root и пересчитать смещение MAIN_mc относительно его, но выходит криво, т.к. опыта программирования у меня маловато. Помогите кто чем может! (прошу извинить за "крик души" если тут так не принято, но мой проект ГОРИТ, чтоб его) Исходник и swf приложил.

samana
16.02.2011, 15:16
Что-то не пойму, вам нужно не перетаскивать стрелки за мышкой ? Так не перетаскивайте. Удалите строки из enterFrame
arrow_mc._x=_xmouse
arrow_mc._y=_ymouse
и отдельно напишите где нибудь
arrow_mc._x= 275;
arrow_mc._y= 200;
и будут ваши стрелки всегда по центру.

Plery
16.02.2011, 15:24
Если я так напишу, то эти координаты будут действовать внутри клипа MAIN_mc, при перемещении его по сцене стрелка будет так же двигаться. Мне надо чтобы стрелка жестко привязывалась к одному месту на сцене. Т.е. разместил 6 экземпляров MAIN_mc на _root в разных местах - получил 6 шаров в разных местах, и 6 стрелок в центре экрана, указывающих каждый на свой шар... Объяснить иначе уже не хватает слов )))

Tails
16.02.2011, 15:41
А зачем опрос ?
Узнать кординаты относительно _root, для клипа clip2 вложенного в clip1:
xPosition = _root.clip1._x+_root.clip1.clip2._x;

Plery
16.02.2011, 16:08
Что-то не пойму, вам нужно не перетаскивать стрелки за мышкой ? Так не перетаскивайте. Удалите строки из enterFrame
arrow_mc._x=_xmouse
arrow_mc._y=_ymouse
и отдельно напишите где нибудь
arrow_mc._x= 275;
arrow_mc._y= 200;
и будут ваши стрелки всегда по центру.
Вообщем нужно зафиксировать на сцене координаты клипа arrow_mc вложенного в клип MAIN_mc, экземпляры которого рассыпаны по сцене. При смещении MAIN_mc двигаться вместе с ним должно все, кроме arrow_mc. Как это сделать?!

Добавлено через 28 минут
А зачем опрос ?
Узнать кординаты относительно _root, для клипа clip2 вложенного в clip1:
xPosition = _root.clip1._x+_root.clip1.clip2._x;

Можете растолковать как с помощью такого подхода решить именно мою задачу?

mooncar
16.02.2011, 17:31
Собственно,
Попробуйте все таки разобраться в методах localToGlobal, globalToLocal, это как раз задача для них. Они берут на себя все вычисления, очень удобно ими пользоваться для таких задач.
Откройте примеры по ним и попробуйте разобраться. Главное, поймите их смысл.

Plery
16.02.2011, 17:52
mooncar за совет спасибо! Конечно буду разбирать их возможности самостоятельно. А подумал сгоряча что есть быстрый способ это сделать. Выходит и впрямь без шишек на лбу не добавить мозгам извилин! =))

Tails
16.02.2011, 19:01
mooncar
Да класная фича. А я веть когдато это вручную высчитывал, учитывая всякие ротаций ещё .. совсем свихнулся тогда :wacko:

Plery
16.02.2011, 22:21
Всем спасибо! Приемлемое для себя решение нашел сам, оно оказалось довольно простым. Если кому интересно - поделюсь. Добавил пустой клип "centerPoint", кинул его на _root в нужном месте, а код переписал так:

this.onPress = function() {
startDrag(this, false, 30, 30, 570, 320);
};

this.onRelease = this.onReleaseOutside=function () {
stopDrag();
};



onEnterFrame = function () {

arrow_mc._x = this._parent.centerPoint._x-this._x;
arrow_mc._y = this._parent.centerPoint._y-this._y;

var dx:Number = arrow_mc._x+ball._x;
var dy:Number = arrow_mc._y+ball._y;
var radians:Number = Math.atan2(dy, dx);
var angle:Number = radians*180/Math.PI;
arrow_mc._rotation = angle;
};

Теперь можно добавлять сколько угодно экземпляров "MAIN_mc" - стрелки будут расположены по глобальным координатам "centerPoint". Сам клип "centerPoint" тоже можно размещать в любой нужной точке, либо вообще убрать его и вписывать в код просто числовые значения. При резком протаскивании MAIN_mc cтрелки двигаются немного рывками, но это уже проблема ерундовая.