PDA

Просмотр полной версии : еще раз про движение


tsep
16.11.2002, 11:50
Господа, на прошлое сообщение никто не ответил, поэтому делаю репост. Если вопрос очень ламерский или тупой, то хоть скажите об этом....

Есть 2 объекта s1 и s2. Объект s2 должен двигаться к объекту s1.
Пишу примерно следующее:

onClipEvent (enterFrame) {
dx = _root.s1._x - _root.s2._x
dy = _root.s1._y - _root.s2._y
if (dx<0) sG1 = 270; else sG1 = 90
rotGR = 180/Math.PI * Math.atan (dy/dx)
_root.s2._x+=Math.cos(rotGR);
_root.s2._y+=Math.sin(rotGR);
_root.s2._rotation = sG1 + rotGR
}

Все работает, пока s1 статичен. Как только s1 начинает двигаться, s2 начиинает совершать вращательные движения на месте. Никак не могу разобраться почему?
Пример *.fla заатачил.

tsep
16.11.2002, 11:51
что-то не атачится с первого раза пример

sergwizard
16.11.2002, 23:30
Вставь в клип "s2" следующий код:

onClipEvent (load) {
k = 0.002;
decay = 0.96;
}
onClipEvent (enterFrame) {
dx = _root._xmouse-_x;
dy = _root._ymouse-_y;
if (dx>0 && dy>0) {
quad = 4;
}
if (dx<0 && dy>0) {
quad = 1;
}
if (dx<0 && dy<0) {
quad = 2;
}
if (dx>0 && dy<0) {
quad = 3;
}
abs_x = Math.abs(dx);
abs_y = Math.abs(dy);
tg = abs_y/abs_x;
_root.sG1 = Math.atan(tg)*180/Math.PI;
if (quad == 1) {
angle = 90-_root.sG1;
}
if (quad == 2) {
angle = 90+_root.sG1;
}
if (quad == 3) {
angle = 270-_root.sG1;
}
if (quad == 4) {
angle = 270+_root.sG1;
}
_rotation = angle-180;
x = _x;
y = _y;
mx = _root._xmouse;
my = _root._ymouse;
disx = math.abs(x-mx);
disy = math.abs(y-my);
xmov = k*(mx-x)+decay*xmov;
ymov = k*(my-y)+decay*ymov;
_x = xmov+x;
_y = ymov+y;
}

Надеюсь, это поможет.

Nox Noctis
17.11.2002, 21:55
2sergwizard
гоооосподи... =))
это конечно могучий код, но зачем так так вот сразу человека по голове ? :)

всего-то спрашивали про движение из пункта А в пункт Б =)

и к тому же громоздко как-то, тебе не кажется ?
тут конечно кому как нравится писать, но я бы написал то же самое:
onClipEvent (load) {
k = 0.002;
decay = 0.96;
rad = 180/Math.PI;
}
onClipEvent (enterFrame) {
mx=_root._xmouse
my=_root._ymouse;
dx = mx-_x
dy = my-_y
_rotation = Math.atan(dy/dx)*rad+180*(mx<_x);
xmov = k*dx+decay*xmov;
ymov = k*dy+decay*ymov;
_x = xmov+_x;
_y = ymov+_y;
}

попроще будет, правда ? =)
по-моему незачем делать лишние переменные, дублирующие свойства, до которых и так можно добраться написав всего две буквы =)
и к тому же ты сам создаешь себе работу: сначала берешь модуль, а потом выясняешь что же за угол этот модуль предатавляет =)

2tsep
файлик твой не открывается...

Nox Noctis
17.11.2002, 22:24
хм... открылся файлик...

в принципе в предыдущих постах все написано, но для особо одаренных вот исправленная версия =)

sergwizard
17.11.2002, 22:32
Nox, ну не будь таким строгим :-) Я это выцарапал из своего старого исходника. Что первое под руку подвернулось, то и дал. Я еще подумал, что Tsep явно какую-то игрушку стрелялку делает, и это ему поможет. А потом, ну кто ж с тобой потягается насчет кодов? Это я без шуток.

Nox Noctis
17.11.2002, 23:00
ну ладно, ладно... спасибо канеш... :)

просто когда человек не особо разбирающийся в скриптах спрашивает как сделать что-то нехитрое, нужно объяснить так, чтобы было понятно... твой код работает, да, только разобраться в нем, не зная заранее, как это нужно писать, довольно трудно... :)

Max N Chubin_
18.11.2002, 18:36
2 Nox Noctis:
а можно еще немножко упростить??? можно? можно? :D
вот строчку заменить:

_rotation = Math.atan(dy/dx)*rad+180*(mx<_x);

на

_rotation = Math.atan2(dy,dx)*rad;

;)

Nox Noctis
18.11.2002, 19:05
уговорил =)

я по инерции всегда atan пишу =)
если не прогуливать математику в восьмом классе, то можно узнать массу интересного... например, что atan возвращает значания от -П/2 до П/2 =)) если это знать, то без разницы как писать в принципе...

можно байткоды посмотреть - я думаю атан2 так и реализован - сначала арктангенс а потом плюс 180 при отрицательной ординате =)

Max N Chubin_
18.11.2002, 19:21
нееееее байт коды это не ко мне... :eek:
я тока ездить на машине умею, а вот клапана регулировать - не научился...
;)

tsep
20.11.2002, 11:15
Спасибо всем большое, оказывается все очень просто и легко.