PDA

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


Vrefr
13.05.2003, 20:16
Всем привет, после долгого перерыва у меня вопрос:
как сделать программно движение плавающее, например, чтобы кнопка плавала случайным образом...

типа

onClipEvent (enterFrame) {
xend = random(3);
if (_x>-10) {
_x+=xend;
} else if (_x>10) {
_x--;
}
yend = random(3);
if (_y>-10) {
_y++;
} else if (_y>10) {
_y-=yend;
}
}

только оно у меня почему-то не работает.... :(
Хелп

voro_bej
13.05.2003, 21:20
Посмотри трейсом. У тебя всегда наращивается _x и никогда не перейдет на else. Думай :)

Vrefr
14.05.2003, 02:10
там ошибка, но она е меняет дела....
onClipEvent (enterFrame) {
xend = random(3);
if (_x>-10) {
_x+=xend;
} else if (_x>10) {
_x-=xend;
}
yend = random(3);
if (_y>-10) {
_y+=xend;
} else if (_y>10) {
_y-=yend;
}
}

оно же должно двигаться только при условии что x>-10 а если он не больше, то по идее двигаться не должно я пробовал с
do {_x+=xend;
}
while(_x<-10)
говорит, что скрипт приведет к большой затрате ресурсов и предлагает абортнуть выполнение

voro_bej
14.05.2003, 10:50
Правильно говорит. Этого делать не стоит.
Вопрос: тебе нужно плавающее движение или неподвижный клип?
Вариант решения. :)
Создай лог. переменную и проверяй ее значение. Если ложь наращивай (уменьшай) х или y, если значение х или y превысило (или снизилось) определенного значения - лог. переменная меняет значение на истину.
Подумай.

ps Смотри-ка, у нас с тобой количество сообщений одинаково!

Techmaker
14.05.2003, 16:17
плавало? это как? :)
вот так пойдёт:
:)

Vrefr
14.05.2003, 17:36
что-то типа этого?? %))))

onClipEvent (enterFrame) {
r = Math.random();
if (flag == 0) {
_x += r;
} else {
_x -= r;
}
if (_x>2) {
flag = 1;
} else if (_x<-1) {
flag = 0;
}
if (flagy == 0) {
_y += r;
} else {
_y -= r;
}
if (_y>122) {
flagy = 1;
} else if (_y<121) {
flagy = 0;
}
}
onClipEvent (load) {
flag = 0;
flagy = 0;
}
как раз то, что надо :)
Спасибо, что заставил думать, хотя я и злился сначала :)
PS: А сообщений действительно одинаковое кол-во :))

Vrefr
14.05.2003, 17:45
2Techmaker: sorry не увидел твой файл сначала, да, именно так только не так широко, а в пределах 1-2 пикселов...
но кажется мой код тоже катит :)
Спасибо всем :)

voro_bej
14.05.2003, 18:29
Спасибо что понял меня, а то действительно некоторые обижаются. Я же как лучше хочу, чтоб человек не просто списал исходник, а сам дошел до ответа.
Вот тебе мой вариант:

onClipEvent (enterFrame) {
r = Math.random();
if (!flag1) {
_x+=r;
if (_x>-2) {flag1=true}
} else {
_x--;
if (_x<-1) {flag1=false}
}
if (!flag2) {
_y++;
if (_y>122) {flag2=true}
} else {
_y-=r;
if (_y<121) {flag2=false}
}
}

почти одно и тоже. :)

Vrefr
14.05.2003, 20:00
Да :)), а то я уж думал мои гуманитарные мозги не способны справляться с иксами и игреками :)
Еще один вопрос:
вот все это движение было с movie clip, таким же образом мы можем, например, запихнув в клип прямую, изменять ее длину и угол наклона, а есть ли программное движение для кривых?
Т.е. например я рисую кривую ну, например, в форме буквы с, а потом хочу ее плавно выровнять в прямую... если это делать не программно, то я просто делаю в таймлайне два кадра, в одном "с" в конечном прямая, а выделив выбираю "shape" в "Propertiеs"... а можно ли такое же сделать в одном ключевом кадре, т.е. программно...
Просто у меня та кнопка, которая плавает соединена с главным меню прямой, и сейчас получается, что плавает только кнопка, а прямая не изменяется... я сделал ее в мувик и теперь она у меня поворачивается и укорачивается в зависимости от положения кнопка, но это неестесственно, а я хотел бы ее изгибать, когда кнопка движется по направлению к главному меню, навстречу этой кривой....
ой..... вроде так :)))

Vrefr
15.05.2003, 01:21
не то чтобы я нудил..... но неужели никто не ответит на столь интригующий меня вопрос??:)))

voro_bej
15.05.2003, 12:13
Программно изгибать линию можно попытаться с помощью curveTo. В help-е есть хороший пример с нарисованием круга. Разобраться не сложно.
В начале определяешь lineStyle(1, 0x000000, 100) - линия толщиной в 1, rgb(черный в данном случае) и alpha
Потом moveTo(X, Y) - начальная точка и т.д.

Vrefr
15.05.2003, 14:09
кажется разобрался, вот типа того:

_root.createEmptyMovieClip("ship", 1);
with (_root.ship) {
lineStyle(1, 0xCCCCCC, 100);
beginFill(0xCC3300, 80);
moveTo(1, 1);
curveTo(1, 1, 17, 17);
curveTo(17, 17, 300, 17);
curveTo(300, 17, 300, 10);
curveTo(300, 10, 1, 1);
endFill();
}

но оно же только рисует, т.е. сразу готовый результат, а как заставить его выростать по команде, например линию

moveTo(1, 1);
lineTo(1, 3);
заставить плавно вырасти в линию
lineTo(1,200);
?

Vrefr
15.05.2003, 14:25
точнее это я уже догадался как....
просто
_root.m.onEnterFrame = function(){
_root.m._yscale++;
}

а как это делается по кривой, например чтобы из точки
1, 1 она шла в 2, 2 потом в 3, 1 ... и т.д. ?

Vrefr
15.05.2003, 15:28
а я уже знаю :)))
если по простому чтобы двигалось, то можно привязать к мувиклипу вот так:
onClipEvent (enterFrame) {
_x--;
_y++;
_root.createEmptyMovieClip("machta", 2);
with (_root.machta) {
butx = getProperty(_root.but, _x);
buty = getProperty(_root.but, _y);
lineStyle(0, 0x000000, 100);
moveTo(10, 10);
lineTo(butx, buty);
}
}
а если по сложному,
то вместо координат задаем переменные, которые перебирают элементы массива, состоящие из заранее заданного пути :)

voro_bej
15.05.2003, 15:39
Здорово! Вот сам на все и ответил. :)