PDA

Просмотр полной версии : Преследование одного мувиклипа другим


КорДум
24.01.2008, 22:12
Здравствуйте, передо мной стоит вот такая задача: имеется 3 клипа, вложенные друг в друга и еще один клип, управляемый клавишами, мне необходимо сделать так, чтобы один клип постоянно преследовал другой, поворачиваясь за ним
примерный
clip1.clip2.clip3.onEnterFrame = function(){
var RAD_DEG:Number = 180/Math.PI;
var angle:Number = Math.atan2 (/*здесь необходима формула*/);
this._rotation = angle*RAD_DEG;
}

MrPoma
25.01.2008, 00:47
var dx:Number = clip1._x - clip2._x;
var dy:Number = clip1._y - clip2._y;
var angle:Number = Math.atan2(dy, dx)/(Math.PI/180);

КорДум
25.01.2008, 14:28
var dx:Number = clip1._x - clip2._x;
var dy:Number = clip1._y - clip2._y;
var angle:Number = Math.atan2(dy, dx)/(Math.PI/180);


это не совсем то, что я спрашивал, у меня дан _root.clip1.clip2.clip3 и _root.clip4, мне нужно, чтоб _root.clip1.clip2.clip3 преследовал _root.clip4...

Волгоградец
25.01.2008, 14:49
clip4.onEnterFrame = function() {
dx = clip1.clip2.clip3._x - this._x;
dy = clip1.clip2.clip3._y - this._y;
angle = Math.atan2(dy, dx);
this._rotation = angle * 180/Math.PI;
this.xmov = mc4_speed*Math.cos(angle);
this.ymov = mc4_speed*Math.sin(angle);
if (Math.sqrt(dx*dx + dy*dy) > 30){
this._x += this.xmov;
this._y += this.ymov;
}
}

КорДум
25.01.2008, 15:26
маленькая оговорочка - мне нужно отталкиваться от clip1.clip2.clip3
разве не надо к координатам clip1.clip2.clip3 прибавлять координаты clip1 и clip1.clip2?

например:
var RAD_DEG = 180/Math.PI;
var angle = Math.atan2(_root.clip1._y + _root.clip1.clip2._y + clip1.clip2.clip3._y-_root.clip4._y,
_root.clip1._x + _root.clip1.clip2._x + clip1.clip2.clip3._x-_root.clip4._x);
this._rotation = angle*RAD_DEG;
this._x -= Math.cos(clip1.clip2.clip3._rotation/RAD_DEG)*2;
this._y -= Math.sin(clip1.clip2.clip3._rotation/RAD_DEG)*2;


немного сложновато в понимании
враг упорно отворачивается и убегает или проходит мимо, будто он не при делах...

Волгоградец
25.01.2008, 15:42
Нужно заюзать метод localToGlobal () по отношению к clip3. Тогда его координаты будут не относительно родительского мувика, а _root.

КорДум
25.01.2008, 16:07
я никогда не работал с методом localToGlobal (), Вы можете мне написать примерый синтаксис и обращение к уже переведенным координатам на данном примере?
Посмотрел в справочной литературе, нашел, но применить не могу...

Волгоградец
25.01.2008, 16:28
var obj:Object = {x: clip1.clip2.clip3._x, y: clip1.clip2.clip3._y};
clip1.localToGlobal (obj);
Первая строчка: нужно создать объект, в котором будут храниться координаты клипа clip3.
Вторая срочка: переводим координаты клипа clip1 из локальных в _root.

КорДум
25.01.2008, 16:41
хм, а ведь все равно не получилось, проверяю координаты clip3, они как были -400, так и после переведения в _root-систему остались -400...
может быть во второй строчке кода необходимо указывать в имени клипа не clip1, а полный путь к clip3?

Волгоградец
26.01.2008, 11:41
КорДум, попробуй так. Сам не могу проверить - нету флэша под рукой...
clip4.onEnterFrame = function() {
var obj1:Object = {x: clip1.clip2.clip3._x, y: clip1.clip2.clip3._y};
clip1.clip2.localToGlobal (obj1);
var obj2:Object = {x: obj1.x, y: obj1.y};
clip1.localToGlobal (obj2);
dx = obj2.x - this._x;
dy = obj2.y - this._y;
angle = Math.atan2(dy, dx);
this._rotation = angle * 180/Math.PI;
this.xmov = mc4_speed*Math.cos(angle);
this.ymov = mc4_speed*Math.sin(angle);
if (Math.sqrt(dx*dx + dy*dy) > 30){
this._x += this.xmov;
this._y += this.ymov;
}
}

КорДум
26.01.2008, 14:57
и это тоже не работает...теперь clip1.clip2.clip3 идет в противоположную сторону, относительно того, что было...
повторюсь:
разве не надо к координатам clip1.clip2.clip3 прибавлять координаты clip1 и clip1.clip2?

например:
var RAD_DEG = 180/Math.PI;
var angle = Math.atan2(_root.clip1._y + _root.clip1.clip2._y + clip1.clip2.clip3._y-_root.clip4._y,
_root.clip1._x + _root.clip1.clip2._x + clip1.clip2.clip3._x-_root.clip4._x);
this._rotation = angle*RAD_DEG;
this._x -= Math.cos(clip1.clip2.clip3._rotation/RAD_DEG)*2;
this._y -= Math.sin(clip1.clip2.clip3._rotation/RAD_DEG)*2;

Волгоградец
27.01.2008, 00:53
Вот рабочий исходник. Красный шарик - третий клип, который вложен во второй, который в свою очередь вложен в первый.

КорДум
27.01.2008, 12:29
большое спасибо, за то, что Вы потратили на меня свое время, маленькая поправка, мне нужно, чтоб clip1.clip2.clip3 двигался за clip4, а не наоборот)
И еще, можно написсать код, содержащийся в клипе clip1.clip2.clip3, а не в кадре?

Волгоградец
27.01.2008, 20:32
Ну код есть - местами поменяй переменные - основная проблема была с localToGlobal - надеюсь ты разобрался...
Код писать в клипе не стоит - это плохая практика, уже свое отжившая. Код должен находиться в одном месте - в одном кадре или еще лучше - в классе.

КорДум
27.01.2008, 20:45
большое спасибо за помощь; с классами я пока не знаком, надо бы мануал по этой теме найти, а вот с местонахождением кода у меня большие проблемы: обстоятельства не позволяют... хотя, при должном усилии можно исправить все недочеты, нужно лишь только захотеть...

ах да, вопрос был довольно-таки интересный и актуальный (как мне кажется), поэтому неплохо бы было перенести его в FAQ...

КорДум
28.01.2008, 16:26
эх, не знаю на что менять эти пути к клипам... не можете подсказать, да что там, ткнуть меня носом в правильный код...

возник такой вопрос, как можно прописать переход координат clip4 в координаты clip1.clip2.clip3, используя метод globalToLocal()?
я с синтаксисом в данном примере не дружу

Волгоградец
28.01.2008, 17:58
Непонятна задача. Если необходимо чтобы clip3 бегал за clip4, то нафига столько уровней вложенности (clip1 -> clip2 -> clip2)? Опиши что конкретно нужно, если смогу - помогу.

КорДум
28.01.2008, 19:47
в моем проекте, что сейчас активно разрабатывается, существует клип player (он же clip4), клип world (он же clip1), который вертится относительно player, затем клип part1 (это локация, она же clip2) и клип enemy (он же тот самый clip3). Вот такая вот иерархия.
Мне нужно, чтоб enemy шел к player. И тут возникает проблема - враг идет не на игрока, а куда-то в сторону. Переубедить его я не знаю как, вот это-то я и хотел узнать...
Можно использовать методы localToGlobal или globalToLocal, только я не знаю как это все прописать.

PS. если Вы недоумеваете, зачем же клип world нужен, отвечаю: для использования меньшего кода в блоке передвижения player, ведь локаций не один десяток...

Волгоградец
28.01.2008, 20:45
Т.е. как я понял clip1 == enemy должен гнаться за clip4 == player. И зачем заморочки с вложенностью? Пусть клип1 находится там же, где и клип1 - в _root! Объясни, зачем клип3 вложен в клип1?

КорДум
28.01.2008, 21:39
Т.е. как я понял clip1 == enemy должен гнаться за clip4 == player.
почти так, clip3 == enemy, и clip3 находится в clip2, а clip2 в clip1, сложно, однако...
Вложен для того, чтобы враг вместе с картой поворачивался относительно player (у меня player находится в центре сцены, всегда)

Волгоградец
30.01.2008, 15:24
Если и это не то, тогда я не знаю...

КорДум
31.01.2008, 15:19
Большое спасибо, работает исходник корректно, не знаю, правда, как этот код будет себя вести в моем проекте, но, думаю, как и в исходнике