PDA

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


Slayer aka Warrior
23.12.2005, 23:34
Решил я, понимаете ли, сделать игрульку... :) А банальных вещей не знаю... Специально качал книги с нета по AS но там полезного не нашёл...
А вопрос у меня следующий. Есть прямоугольник(условно) при глике мышкой надо чтоб нос этого самого прямоугольника повернулся в том направлении где, собтвенно говоря, кликнули... :)
Если не трудно подскажите кде можно почитать про основы создания Flash игр....
Help NeWbie?!

KUZEN
23.12.2005, 23:37
здесь на форуме выкладывали исходники стратегии , там всё это было ... да и поворот дело не сложное нужно просто расчитать угол и повернуть мувик

Король
23.12.2005, 23:41
"Специально качал книги с нета по AS но там полезного не нашёл... "

не нашел ничего полезного в книгах по АС? не верю

Slayer aka Warrior
24.12.2005, 00:48
А каким образом его вообще рассчитывать? Я просто вообще представления не имею...
2 Король Просто ты меня не прально понял... :) Книга 1 была весом в 20 мб... Но в ней просто тупое описание команд без "особеннстей приминения"... Очень поверхностная книга попалась...

KUZEN
24.12.2005, 01:22
Всё просто
в первый кадр и тестим
_root.createEmptyMovieClip("mc", 1);
mc._x = 250;
mc._y = 200;
with (mc) {
lineStyle(2, 0x333333, 100);
moveTo(0, 0);
lineTo(0, 0);
lineTo(100, 0);
}
onMouseDown = function () {
yoffs = _ymouse-_root.mc._y;
xoffs = _xmouse-_root.mc._x;
_root.mc._rotation = (Math.atan2(yoffs, xoffs)*180)/Math.PI;
};

Slayer aka Warrior
25.12.2005, 20:36
C линией всё пашет на ура, а с прямоугольником глючит... Нашел скриптик, прямоугольник крутиться! Но я хочу чтоб он не сразу а постепенно "крутился"! Делаю такую штуку:

onMouseDown = function () {
xgll = getProperty("_root.x", _x);
ygll = getProperty("_root.x", _y);
xtt = getProperty("_root.x.targ", _x);
ytt = getProperty("_root.x.targ", _y);
qqy = xgll-xtt;
qqx = ygll-ytt;
ulg = Math.atan2 ( qqy, qqx )*180/3.14+90;
while(_root.x._rotation < ulg){
_root.x._rotation = _root.x._rotation + 1
}
while(_root.x._rotation > ulg){
_root.x._rotation = _root.x._rotation - 1
}
}

Но флэш виснет... хелп как это оптимизировать, я туплю наверное

Antares
25.12.2005, 20:54
Для начала, прекратить пользоваться черверочным синтаксисом вперемешку с точечной нотацией. Потом -- научиться осмысленно называть переменные. Затем -- подумать, как это поворот "постепенно" будет совершаться в цикле? Нужен последовательный вызов через промежуток времени.

Весьма удивительно, что люди, адрес которых не много, ни мало -- Hell, не знают таких дьявольски простых вещей. ;)

KUZEN
25.12.2005, 21:21
C линией всё пашет на ура, а с прямоугольником глючит... Нашел скриптик, прямоугольник крутиться! Но я хочу чтоб он не сразу а постепенно "крутился"! Делаю такую штуку:

onMouseDown = function () {
xgll = getProperty("_root.x", _x);
ygll = getProperty("_root.x", _y);
xtt = getProperty("_root.x.targ", _x);
ytt = getProperty("_root.x.targ", _y);
qqy = xgll-xtt;
qqx = ygll-ytt;
ulg = Math.atan2 ( qqy, qqx )*180/3.14+90;
while(_root.x._rotation < ulg){
_root.x._rotation = _root.x._rotation + 1
}
while(_root.x._rotation > ulg){
_root.x._rotation = _root.x._rotation - 1
}
}

Но флэш виснет... хелп как это оптимизировать, я туплю наверное
Всё нормально работает и с прямоугольником и с чем угодно

убираешь этот код


_root.createEmptyMovieClip("mc", 1);
with (mc) {
lineStyle(2, 0x333333, 100);
moveTo(0, 0);
lineTo(0, 0);
lineTo(100, 0);
}

на сцене делаешь мувик с именем mc и всё ...

Slayer aka Warrior
25.12.2005, 21:45
Прямоугольник колбАсить начинает....
Переменные-переменные... :) Ну вот прижилося так!
А с Hell... Просто когда регался на форуме маленький был и считал что ето круто! Ж)

А как это запузырить через промежуток времени если у нас функция MouseDown?

Kyber Anton
25.12.2005, 23:18
onMouseDown = function () {
yoffs = _ymouse-_root.mc._y;
xoffs = _xmouse-_root.mc._x;
_root.mc.ENDrotation = (Math.atan2(yoffs, xoffs)*180)/Math.PI;
};
После этого ты имеешь начальную ротацию(_rotation) и желаемую(ENDrotation),
затем тебе надо посчитать, в какую сторону надо крутить клип(по часовой или против) и дальше в функции
mc.onEnterFrame = function(){
mc._rotation+=mc.AngleMov
}, пока клип не установится на нужный поворот.
А дальше удаляешь mc.onEnterFrame (это, по-моему, mc.onEnterFrame = null)

Король
25.12.2005, 23:27
_root.onEnterFrame = function() {
difx = mc._x-_xmouse;
dify = mc._y-_ymouse;
mc._rotation = -Math.atan2(difx, dify)*180/Math.PI;
};
вот все что тебе нужно

Slayer aka Warrior
26.12.2005, 00:05
Вот! Сделал так что он "плавно" поворачивается... но один трабл остался... Я понял что вычесления угла поворота немного неправильное! Трабл в том что значение rotation любого объекта находится в промежутке [-180; 180] , а ulg то есть вычесленный градус угла может попасть в промежуток [-180; -270] (это следствие того что приходится вычитать 90) И тогда прямоугольник крутится до бесконечности! Помогите, а то голова кипит ужо...
2 король
Чисто из геометрии это должно работать, но прямоугольник встает не так как надо! :mad:
Методом перебора я понял, что работать корректно с прямоугольником будет только так:

xt = _xmouse
yt = _ymouse
xlgt = xgl-xt;
ylgt = ygl-yt;
ulg = Math.atan2 ( ylgt, xlgt )*180/3.14-90;

Если не вычитать/прибавлять 90 градусов то прямоугольник "смотрит" боком... Это по-любому!

Король
26.12.2005, 00:13
все относительно. понимаешь о чем я? для тебя это бок, для флеша - перед

Slayer aka Warrior
26.12.2005, 00:27
Да... но как мне побороть ето фигню?? :confused:

KUZEN
26.12.2005, 00:34
Да... но как мне побороть ето фигню?? :confused:
Как в мувике прямоугольник стоит так и поворачивается ...

Slayer aka Warrior
26.12.2005, 00:40
KUZEN
у меня MX и 8-ку я не магу прочитать :(

Но я поборол это, может и не очень красиво, зато работает!!!! :D :D


ulg = Math.atan2 ( ylgt, xlgt )*180/3.14-90;
if (ulg < -180){
ulg = ulg + 360
}

KUZEN
26.12.2005, 00:41
KUZEN
у меня MX и 8-ку я не магу прочитать :(

Но я поборол это, может и не очень красиво, зато работает!!!! :D :D


ulg = Math.atan2 ( ylgt, xlgt )*180/3.14-90;
if (ulg < -180){
ulg = ulg + 360
}

Главное чтоб работало ...

Буньков Максим
26.12.2005, 00:41
cnt = 0;
onMouseDown = function () {
yoffs = _ymouse-_root.mc._y;
xoffs = _xmouse-_root.mc._x;
ID = setInterval(rotation, 1, yoffs, xoffs, 100);
};
function rotation(yoffs, xoffs, count) {
_root.mc._rotation = ((Math.atan2(yoffs, xoffs)*180)/Math.PI)/(count-cnt);
updateAfterEvent();
cnt++;
if (cnt == count) {
clearInterval(ID);
cnt = 0;
}
}

На тебе еще одну фигню... :) mc твоя стрелочка. смотрит в право и центр у нее на указателе... ну сам поэксперементируй...
все относительно. понимаешь о чем я? для тебя это бок, для флеша - перед
Он имеет введу то что типа твой мувик со стерочкой можно первоначально то как нить повернуть... ну ты кликни на него 2жды и цетрируй и вращай...