PDA

Просмотр полной версии : Очередность выполнения функций


V_e_g_a
09.07.2007, 22:56
Как можно организовать выполнение второй функции после окончания выполнения первой? Третей - после выполнения второй и т. д.
И еще не пойму как работают глобальные переменные. Ниже привожу код, который не работает до конца. Может как то по-другому можно сделать?


_root.createEmptyMovieClip ("main_top", 5);
main_top._x=150;
main_top._y=296;
main_top.lineStyle (0, 0xFF0000, 100);
main_top.beginFill (0xFF0000);
main_top.moveTo (0, 0);
main_top.lineTo (501, 0);
main_top.lineTo (501, 3);
main_top.lineTo (0, 3);
main_top.lineTo (0, 0);
main_top.endFill ();

_root.createEmptyMovieClip ("main_middle", 3);
main_middle._x=150;
main_middle._y=300;
main_middle.lineStyle (0, 0xFBFFE6, 100);
main_middle.beginFill (0xFBFFE6);
main_middle.moveTo (0, 0);
main_middle.lineTo (500, 0);
main_middle.lineTo (500, 3);
main_middle.lineTo (0, 3);
main_middle.lineTo (0, 0);
main_middle.endFill ();

_root.createEmptyMovieClip ("main_bottom", 4);
main_bottom._x=150;
main_bottom._y=304;
main_bottom.lineStyle (0, 0xFF0000, 100);
main_bottom.beginFill (0xFF0000);
main_bottom.moveTo (0, 0);
main_bottom.lineTo (501, 0);
main_bottom.lineTo (501, 3);
main_bottom.lineTo (0, 3);
main_bottom.lineTo (0, 0);
main_bottom.endFill ();

_root.createEmptyMovieClip ("main_l", 1);
main_l._x=150;
main_l._y=0;
main_l.lineStyle (0, 0xFBFFE6, 100);
main_l.beginFill (0xFBFFE6);
main_l.moveTo (0, 0);
main_l.lineTo (1, 0);
main_l.lineTo (1, 1);
main_l.lineTo (0, 1);
main_l.lineTo (0, 0);
main_l.endFill ();

_root.createEmptyMovieClip ("main_r", 2);
main_r._x=649;
main_r._y=600;
main_r.lineStyle (0, 0xFBFFE6, 100);
main_r.beginFill (0xFBFFE6);
main_r.moveTo (0, 0);
main_r.lineTo (1, 0);
main_r.lineTo (1, 1);
main_r.lineTo (0, 1);
main_r.lineTo (0, 0);
main_r.endFill ();

_global.x_1=0;
_global.x_2=0;
function schetchik_I()
{
main_l._height=main_l._height+5;
main_r._height=main_r._height+10;
main_r._y=main_r._y-5;
if (main_l._height>296)
{
_global.x_1=1;
clearInterval(inter_I);
}
}
var inter_I:Number=setInterval(schetchik_I, 1);


if (_global.x_1==1)
{
function schetchik_II()
{
main_l._height=main_l._height-5;
main_r._height=main_r._height-10;
main_r._y=main_r._y+5;
main_top._y=main_top._y-5;
main_bottom._y=main_bottom._y+5;
main_middle._y=main_middle._y-5;
main_middle._height=main_middle._height+10;
if (main_middle._height>400)
{
_global.x_2=1;
main_middle._y=100;
main_middle._height=400;
main_top._y=96;
main_bottom._y=502;
clearInterval(inter_II);
}
}
var inter_II:Number=setInterval(schetchik_II, 1);
}

if (_global.x_2==1)
{
function schetchik_III()
{
main_l._y=main_l._y+5;
main_r._y=507;
main_r._height=main_r._height-5;
if (main_r._height<6)
{
main_r._height=0;
clearInterval(inter_III);
}
}
var inter_III:Number=setInterval(schetchik_III, 1);
}

BigDan
09.07.2007, 23:57
в конце каждой функции вызывай следующую функцию.
А вообще если записывать так:
func1();
func2();
то func2 не вызывается пока не выполнится func1.

V_e_g_a
10.07.2007, 01:05
Все равно не понял как. Там вызов происходит по setInterval и если просто попорядку писать функции, то они начнутся практически одновременно. Можно ли как-то внутри функции присвоить переменной значение, а потом уже вне функции при проверке значения этой переменной запустить или не запустить другую функцию? Ну или что-то похожее как сделать?

iNils
10.07.2007, 02:26
Флеш выполняет код последовательно, паралелльных потоков нет.
К примеру
function a () {
trace ("enter a");
for (i < 0; i < 1000000; i++) {
k = Math.random ();
}
trace ("exit a");
}
function b () {
trace ("b");
}
setInterval(a, 1);
setInterval(b, 1);

V_e_g_a
11.07.2007, 01:41
Попробуй выполнить этот код и увидишь, что функции выполняются параллельно (одновременно).


_root.createEmptyMovieClip ("m", 1);
m._x=0;
m._y=100;
m.lineStyle (0, 0xFF0000, 100);
m.beginFill (0xFF0000);
m.moveTo (0, 0);
m.lineTo (25, 0);
m.lineTo (25, 25);
m.lineTo (0, 25);
m.lineTo (0, 0);
m.endFill ();

_root.createEmptyMovieClip ("n", 2);
n._x=0;
n._y=200;
n.lineStyle (0, 0x33289B, 100);
n.beginFill (0x33289B);
n.moveTo (0, 0);
n.lineTo (25, 0);
n.lineTo (25, 25);
n.lineTo (0, 25);
n.lineTo (0, 0);
n.endFill ()


function p_1()
{
m._x=m._x+5;
if (m._x>300)
{
clearInterval(i_1)
}
}

function p_2()
{
n._x=n._x+5;
if (n._x>300)
{
clearInterval(i_2)
}
}

var i_1:Number=setInterval(p_1, 1);
var i_2:Number=setInterval(p_2, 1);

iNils
11.07.2007, 03:31
Не вижу. Я вижу, что раз в 1 миллисекунду происходит вызов двух функций, сначала вызывается одна, потом другая. Но во время выполнения p_1, p_2 не работает и наоборот.

V_e_g_a
11.07.2007, 11:39
Ясно. А как сделать, что бы первая функция выполнялась n-ое кол-во раз до наступления условия, описанного ней, а только потом запускалась на выполнение вторая функция?

iNils
11.07.2007, 12:12
после clearInterval, запустить второй setInterval, а не сразу оба.

V_e_g_a
11.07.2007, 18:56
Ага, я уже и сам догадался. Не могу только теперь понять как остановить второй setInterval.

iNils
11.07.2007, 19:38
function p_1 () {
m._x = m._x + 5;
if (m._x > 300) {
clearInterval (i_1);
i_1 = setInterval (p_2, 1);
}
}
function p_2 () {
n._x = n._x + 5;
if (n._x > 300) {
clearInterval (i_1);
}
}
var i_1:Number = setInterval (p_1, 1);

V_e_g_a
11.07.2007, 22:49
Классно. Спасибо. Сам бы не догадался.