О обозначениях

В данном руководстве будут приняты следующие обозначения:
- код будет писаться курсивом
- название сцен будет писаться большими буквами (SCENE)
- принадлежность элемента сцене и элемента элементу будет выглядеть так – SCENE-movieClip1-movieClip2, то есть movieClip1 принадлежит сцене SCENE, а movieClip2 является дочерним (входит в состав) movieClip1.

Руководство программиста

Данное руководство предназначено для пояснения структуры кода анимации демонстрирующей взаимодействие узлов в сети с использованием протокола IP.
Структурно данная «анимация» состоит из двух сцен:
1. PRE – сцена intro.
2. MAIN – основная сцена.
Сцена intro фактически является анимацией, без какого либо сложного программирования по этому подробна она не будет расписана. Скажу одно, что в случае чего ее можно преобразовать в нормальный предзагрузчик для Internet. Вставив любой из видов ожидания загрузки в 35 кадр – PRE-intro, при этом лучше организовать циклический вызов элементов PRE-intro-loading_net, PRE-intro-loading_movie и тд.
Сцена MAIN – главная сцена. Переход в данную сцену происходит по окончанию работы первой сцены PRE. Эта сцена содержит все элементы и коды, которые будут инициализироваться в процессе работы анимации.
Данная сцена имеет следующую структуру:
Сцена кадр Элементы
main 1 Критичных элементов нет
2 W400x300 – стандартно окно для вывода
2 W_2D – окно для демонстрации работы со стеком
2 Net – элементы сети
Дальше эти элементы будут писать без принадлежности к сцене.

Итак, начнем рассматривать код.

Первый кадр данной сцены содержит в себе инициализацию глобальных переменных.
Предназначение основных переменных будет описано по ходу их использовании.
Подробней рассмотрим структуру данных в которую будут записываться значения начальных и конечных узлов передачи данных
lan = {}; - определение объекта lan
lan.begin={}; - дополнительно в объекте определяется еще один объект, он будет хранить информации о узле передающем данные
lan.begin.name="ws4"; - имя узла
lan.begin.lan_num=2; - сеть к которой принадлежит
lan.end={}; - аналогичный объект для конечного элемента
lan.end.name="ws3";
lan.end.lan_num=2;

Так же первый кадр инициализирует дополнительные объекты по работе с сетью и текстовые данные для выдачи информации.

Второй кадр. Если первый кадр является по сути инициализирующим, то второй кадр является управляющим. Рассмотрим его подробнее
Первым делом происходит остановка на данном кадре (то есть без принудительного управления с данного кадра никуда перехода не будет)
stop();
Дальше идет определение переменных которые будут использоваться в работе с анимацией пути передачи данных. По сути в них будут хранится различные буферные значения и дополнительная информация о пути следования данных. Подробнее они будут рассмотрены в процессе рассмотрения анимации.
d_net={};
d_net.ip=0;
stat_str="";
stat_arr=[];
stat_count=0;
d_net.dns=0;
net_obj_buff={};
count2=0;

После этого происходит создание приветственного окна. Путем дублирования movieClip’а окна. При этом в первом кадре данного клипа окна не видно, поэтом и осуществляется переход на второй кадр (третья строчка), с которого и начинается анимация появления окна. Вторая строчка данной части кода передает данному окну информацию о цели его вызова (полный список данной информации будет рассматриваться в следующем разделе).
w400x300.duplicateMovieClip("w",12);
_root.w.t="start";
_root.w.gotoAndPlay(2);

На это обязательно-выполняемые элементы закончились. Дальше рассмотрим процесс управления сценой организованной в данном кадре.
Метод onEnterFrame, который «висит» на данном кадре говорит о том, что все то, что в нем описано, будет выполняться каждый кадр. Фактически этот метод используется для управления процессом формирования пути следования данных и управления движением данных, для этого используются две глобальные переменные _root.toDo и _root.toDoWhat. Первая переменная является признаком, который формируется в процессе работы анимации или при формировании данных, то есть передается из nets в MAIN, а вторая переменная предает из MAIN в NETS.
this.onEnterFrame = function()
{
if (_root.toDo==1)//Отображение пути следования данных
{
_root.color_of_line=0x0000FF;
_root.nets.gotoAndStop(3);
stat_str=stat_str+lan.begin.name+">Формирование и отправка данных\n";
_root.w1.ttf3.text=stat_str;
}
else if (_root.toDo==2)//Формирование пути следования при указании IP-адреса
{
_root.toDo=0;
_root.start_draw=1;
_root.nets.gotoAndStop(2);
}
else if (_root.toDo==3) )//Формирование пути следования при указании DNS-адреса
{
_root.toDo=0;
_root.start_draw=1;
_root.color_of_line=0x66CC66;
_root.nets.gotoAndStop(8);
}
else if (_root.toDo==10)// Процесс доставки данных окончен
{
_root.toDo=0;
delete toDoWhat;
delete toDo;
delete id_dns
stat_str="";
_root.nets.gotoAndStop(1);
w400x300.duplicateMovieClip("w",12);
_root.w.t="steck";
_root.w.gotoAndPlay(2);
}
else if (_root.toDo==101)// Формирование пути для ARP-запроса
{
delete _root.net.net_obj;
_root.toDoWhat=21;
_root.nets.net_obj=[];
_root.color_of_line=0xFF0000;
_root.toDo=0;
_root.nets.gotoAndStop(5);
}
else if (_root.toDo==102) )// Формирование пути ARP-ответа
{
delete _root.net.net_obj;
_root.toDoWhat=22;
_root.nets.net_obj=[];
_root.color_of_line=0x006600;
_root.toDo=0;
_root.nets.gotoAndStop(6);
}
else if (_root.toDo==103) )// Передача данных в узел назначения
{
delete _root.net.net_obj;
_root.toDoWhat=10;
_root.nets.net_obj=[];
_root.color_of_line=0x0000FF;
_root.toDo=0;
_root.nets.gotoAndStop(7);
}
};

Рассмотрим, что происходит при формировании одного из признаков. Рассмотрим, к примеру, случай когда toDO=101.
delete _root.net.net_obj;
_root.toDoWhat=21;
_root.nets.net_obj=[];
_root.color_of_line=0xFF0000;
_root.toDo=0;
_root.nets.gotoAndStop(5);

команда delete удаляет не нужную переменную. Затем произходит формирование признака _root.toDoWhat (подробно его значения будут рассмотрены в разделе с анимацией). Создается заново объект _root.nets.net_obj. _root.color_of_line присваивается значение цвета, которым будет рисоваться путь движения данных. _root.toDo сбрасывается, дабы это условие постоянно не выполнялось. И после чего управление передается клипу nets на пятый кадр. Аналогичным образом работою и другие управляющие переходы.

На это не полный список управляющих элементов данного кадра. Есть еще управляющие элементы кнопки, так как, по сути, все элементы сети – это кнопки и следующий код определяет реакцию на их нажатие. Работает это таким образом - при нажатии на один из элементов происходит его выбор и генерируется событие нажатия, после чего происходит реакция на него. Реакция заключается в следующих трех строчках
w400x300.duplicateMovieClip("w",12);
w.t="ws1.info";
w.gotoAndPlay(2);

Этот код уже подробно рассматривался и он одинаков для всех кнопок. Поэтому подробно я останавливаться на нем не буду.

//////////////////////////////////////////////////////////////////////////////////////////////////
nets.net_points.Lan1_ws1.onPress = function()
{
w400x300.duplicateMovieClip("w",12);
w.t="ws1.info";
w.gotoAndPlay(2);
};
nets.net_points.Lan1_ws2.onPress = function()
{
w400x300.duplicateMovieClip("w",12);
w.t="ws2.info";
w.gotoAndPlay(2);
};
nets.net_points.Lan2_ws1.onPress = function()
{
w400x300.duplicateMovieClip("w",12);
w.t="ws3.info";
w.gotoAndPlay(2);
};
nets.net_points.Lan2_ws2.onPress = function()
{
w400x300.duplicateMovieClip("w",12);
w.t="ws4.info";
w.gotoAndPlay(2);
};

nets.net_points.Lan3_ws1.onPress = function()
{
w400x300.duplicateMovieClip("w",12);
w.t="ws5.info";
w.gotoAndPlay(2);
};
nets.net_points.Lan3_ws2.onPress = function()
{
w400x300.duplicateMovieClip("w",12);
w.t="ws6.info";
w.gotoAndPlay(2);
};
nets.net_points.DNS_server1.onPress = function()
{
w400x300.duplicateMovieClip("w",12);
w.t="dns1.info";
w.gotoAndPlay(2);
};
nets.net_points.DNS_server2.onPress = function()
{
w400x300.duplicateMovieClip("w",12);
w.t="dns2.info";
w.gotoAndPlay(2);
};
nets.net_points.Gate_1.onPress = function()
{
w400x300.duplicateMovieClip("w",12);
w.t="g1.info";
w.gotoAndPlay(2);
};
nets.net_points.Gate_2.onPress = function()
{
w400x300.duplicateMovieClip("w",12);
w.t="g2.info";
w.gotoAndPlay(2);
};

Итак управление сценой было рассмотрено, теперь же необходимо рассмотреть процесс создания окна, ну и непосредственно анимацию передачи данных.

Окно.
Окна создаются путем дублирования оригинального клипа w400x300, который, по сути, не где не используется. По своей сути код содержащий данный кадр не требует какого-то обязательного выполнения. То есть определенная часть кода срабатывает в определенной ситуации. Фактически он является набором управляющих инструкций и функций, которые должны выполнятся по этим инструкциям.

Как всегда первым делом анимация останавливается.
stop();
После чего идет набор функций, которые будут использоваться в процессе отображения текста окна.
Функция AddText – задает создает таймер и задает все его параметры. По этому таймеру будет вызываться другая функция, которая будет постепенно выдавать текст на экран. (Имитируется эффект пишущей машинки).
TextField.prototype.addText=function(texta,speed){
this.count=0;
this.texta=texta;
this.intID=setInterval(this,"controlType",30,speed);
}
Функция controlType – отображает определенное количество символов в текстовом поле.
TextField.prototype.controlType=function(s){
this.count=this.count+s; // определяет сколько надо отобразить символов
this.text=this.texta.substr(0,this.count); // отображение
if (this.count > this.texta.length)
{
this.destroyAll();
}
}
Функция destroyAll вызывает, когда строка текст уже отображен, что бы удалить таймер и неиспользуемые переменные.
TextField.prototype.destroyAll = function() {
delete this.count;
delete this.texta;
clearInterval(this.intID);
delete this.intID
}

Функция viewText – создает новое текстовое поле с названием находящемся в ttf, с координатами x,y, размером w на h. При этом задается цвет символов в данном поле, лубина вложенности текстового поля и шрифт.
MovieClip.prototype.viewText = function(ttf,x,y,w,h,text_color,depth,font_s) {
this.createTextField(ttf,depth,x,y,w,h)
eval(ttf).wordWrap = true;
eval(ttf).selectable = false;
eval(ttf).multiline = true;
ttfTextFormat = new TextFormat("Verdana",font_s,text_color);
eval(ttf).setNewTextFormat(ttfTextFormat);
}

Функция outText – создает и отображает три текстовых поля t1 – заголовок, t2 - подзаголовок, t3 – основной текст.
function outText(t1,t2,t3)
{
viewText("ttf1",10,30,400,50,0xFFFFFF,55,25);
eval("ttf1").addText(t1,1);
viewText("ttf2",10,60,390,50,0xFFCC11,54,14);
eval("ttf2").addText(t2,3);
viewText("ttf3",10,100,380,300,0xFFCC11,51,11);
eval("ttf3").addText(t3,10);
}

Ниже приводится код для передвижения окна w1 он достаточно прост и названия функций используемых в нем говорят сами за себя.
_root.w1.top.onPress = function()
{
_root.w1.startDrag();
};
_root.w1.top.onRelease = function()
{
_root.w1.stopDrag();
};
_root.w1.top.onReleaseOutside = function()
{
_root.w1.stopDrag();
};

Функции используемые в данном клипе рассмотрены, теперь можно приступать к рассмотрению управляющих компонентов кода.
Следующая часть кода срабатывает в момент когда нажимается кнопка «ftp-передача данных». В этот момент происходит создание второго окна с именем w1, в котором и появится вся необходимая информация для формирования данных для отправки пакета.
this.send_ftp.onPress = function()
{
//создание окна с идентификатором состоящий из двух частей <имя узла>+”.send” подробно идентификаторы будут рассмотрены далее.
_root.w400x300.duplicateMovieClip("w1",13);
_root.w1._x=25;
_root.w1._y=400;
_root.w1.t=_root.w.t.substr(0,4)+"send";
_root.w1.gotoAndStop(2);
// Следующая часть кода формирует данные об отправителе.
_root.lan.begin.name=_root.w.t.substr(0,3);
if (Number(_root.w.t.substr(2,1))<=2)
{
_root.lan.begin.lan_num=1;
}
else if (Number(_root.w.t.substr(2,1))<=4)
{
_root.lan.begin.lan_num=2;
}
else
{
_root.lan.begin.lan_num=3;
}
};

В целом код предназначен для определения источника отправки данных. А следующий код, который «висит» на кнопке «отправить» созданного окна предыдущей функцией предназначен для определения конечного пункта назначения.
this.send_to.onPress = function()
{
// определения формата вводимых данных ip или dns
if (Number(_root.w1.in_adr.lan_end_adres.text.substr(0,1))!=1)
{
// если это dns
this.find=0;
// производим поиск наличия данного адреса в сети. Подробная информация о сети находится в массиве _root.ws определенном в первом кадре сцены.
for (i in _root.ws)
{
if ((_root.ws[i].dns==_root.w1.in_adr.lan_end_adres.text)&&(Number(_root.w1.t.substr(2,1)-1)!=i))
{
// Если он есть в сети сохраняем его как конечный пункт
_root.lan.end.name=_root.ws[i].name;
_root.lan.end.lan_num=_root.ws[i].lan;
this.find=1;
// И отправляем указания управляющему коду на втором кадре сцены сведения о том, что данные о начальном и конечном пункте сформированы и также передается информация о том, что исходный адрес задан в виде DNS
_root.toDo=3;
break;
}
}
if (this.find==0)
{
// Если адрес не найден значит ошибка
_root.w1.in_adr.lan_end_adres.textColor=0xFF0000;
_root.w1.in_adr.lan_end_adres.text="error";
_root.w1.in_adr.lan_end_adres.textColor=0xFFCC11;
}
}
else
{
// Аналогично работает и эта часть только проверка выполняется на IP
this.find=0;
for (i in _root.ws)
{
if ((_root.ws[i].ip==_root.w1.in_adr.lan_end_adres.text)&&(Number(_root.w1.t.substr(2,1)-1)!=i))
{
_root.lan.end.name=_root.ws[i].name;
_root.lan.end.lan_num=_root.ws[i].lan;
this.find=1;
_root.toDo=2;
break;
}
}
if (this.find==0)
{
_root.w1.in_adr.lan_end_adres.textColor=0xFF0000;
_root.w1.in_adr.lan_end_adres.text="error";
_root.w1.in_adr.lan_end_adres.textColor=0xFFCC11;
}
}
if (this.find==1)
{
_root.w.removeMovieClip();
_root.w1.in_adr._x=-3000;
_root.w1.in_adr._y=240;
_root.w1.send_to._x=-300;
_root.w1.view_steck._x=-1000;
_root.w1.ttf1.destroyAll();
_root.w1.ttf2.destroyAll();
_root.w1.ttf3.destroyAll();
text_str=_root.text_translate_begin+_root.ws[Number(_root.lan.begin.name.substr(2,1))-1].ip+"\n"+_root.text_translate_end+_root.ws[Number(_root.lan.end.name.substr(2,1))-1].ip;
outText(_root.text_translate,text_str,"События\n");
}
else
{
_root.toDo=0;
}
};

Теперь рассмотрим все идентификаторы окна.
“start” – В окне вывдится приветственный текст
“steck" – Выводится информация о успешном завершении работы
"dns1.info" и "dns2.info" – информация о серверах DNS
“g1.info” и “g1.info” – выводится информация о шлюзах
И идентификаторы по работе с рабочими станциями. Если идентификатор “info”, то выводится информация о рабочей станции и появляется кнопка дающая возможность сформировать данные, “send” – появляется поля для ввода адреса и кнопка отправки сообщения.
if (this.t=="steck")
{
outText(_root.text_steck_name,_root.text_steck_info,_root.text_steck_param);
this.view_steck._x=310;
this.view_steck._y=275;
this.info._alpha=30;
}
else if (this.t=="dns1.info")
{
outText(_root.text_dns[0].name,_root.text_dns[0].info,_root.text_dns[0].param);
this.info_net._alpha=30;
}
else if (this.t=="dns2.info")
{
outText(_root.text_dns[1].name,_root.text_dns[1].info,_root.text_dns[1].param);
this.info_net._alpha=30;
}
else if (this.t=="g1.info")
{
outText(_root.text_g[0].name,_root.text_g[0].info,_root.text_g[0].param);
this.info_net._alpha=30;
}
else if (this.t=="g2.info")
{
outText(_root.text_g[1].name,_root.text_g[1].info,_root.text_g[1].param);
this.info_net._alpha=30;
}
else if (this.t.substr(4,4)=="info")
{
n=Number(this.t.substr(2,1))-1;
outText(_root.text_info[n].name,_root.text_info[n].info,_root.text_info[n].param);
this.send_ftp._x=310;
this.send_ftp._y=275;
this.info_net._alpha=30;
}
else if (this.t.substr(4,4)=="send")
{
n=Number(this.t.substr(2,1))-1;
outText(_root.text_send[n].from,_root.text_send[n].from_param,_root.text_send[n].from_text);
this.send_to._x=310;
this.send_to._y=275;
this.in_adr._x=10;
this.in_adr._y=240;
this.info_send._alpha=30;
}
else if (this.t=="start")
{
outText(_root.text_h,null,_root.text_w);
this.info._alpha=30;
}

Теперь приступим к рассмотрения главного элемента сцен, главного код программы – анимация передачи данных.
Все процессы происходящие в клипе до момента анимации выше были рассмотрены. Поэтому в какой момент происходит переход в даны блок сцены я думаю понятно (в момент когда второму кадру сцены передается управляющая информация в переменной toDo). Рассмотрим код находящейся в клипе nets:
Первый кадр как и первый кадр сцены содержит описание переменных которые будут использоваться в данном процессе.
stop();
/*===============================================================*/
var i=1;
var num_kk=0;
var speed=15;
var kk=0;
this.net_obj=[]; // главный объект в котором будет хранится путь следования данных
var c_s=0;
nt_c={};
st_c=1;
/*===============================================================*/

Ниже описываются структуры хранящие координаты различных узлов и точек их соединения с сетью.
nets_el_name=["ws1","ws2","ws3","ws4","ws5","ws6","dns1","dns2","g1","g2"];
nets_el_x=[102,249,595,745,680,826,197,342,367,667];
nets_el_y=[481,481,138,138,481,481,363,139,335,335];
net=[];
net[0]={};
net[0].name=["ws1","ws2","dns1"];
net[0].x=[122,269,148];
net[0].y=449;
net[0].gx=297;
net[0].gy=449;

net[1]={};
net[1].name=["ws3","ws4","dns2","g1","g2"];
net[1].x=[558,709,305,448,749];
net[1].y=198;

net[2]={};
net[2].name=["ws5","ws6"];
net[2].x=[700,847];
net[2].y=449;
net[2].gx=597;
net[2].gy=449;

g=[];
g[0]={};
g[0].name=["net1","net2"];
g[0].x=[345,367];
g[0].y=[372,335];
g[1]={};
g[1].name=["net2","net3"];
g[1].x=[667,645];
g[1].y=[335,372];
Функция search предназначена для поиска в массиве a элемента str, индекс этого элемента возвращается.
function search(a,str)
{
for (s in a)
{
if (a[s]==str)
{
return s;
}
}
return -1;
}

Остальные кадры логически можно разделить на три группы – просчет отображение управление.

Просчет
В процессе вычисления формируется массив st_arr, который используется для вывод в окне текущего действия, в него записывается путь но не по координатно а в виде название узлов (ws1,g1,ws3).

stop();
Просчет количества узлов через которые должены пойти данные
num_kk = Math.abs(_root.lan.begin.lan_num-_root.lan.end.lan_num);
Формирование последовательности координат для отрисовки пути
this.net_obj[0]={};
this.net_obj[0].x =[1];
this.net_obj[0].y =[1];

Сохранение как первый элемент координаты компьютера который посылает сообщение
s=search(nets_el_name,_root.lan.begin.name);
this.net_obj[0].y[0]=nets_el_y[s];
this.net_obj[0].x[0]=nets_el_x[s];
str=_root.lan.begin.name;

Вторым элементом сохраняется координаты связи с сетью. Принцип, я думаю, понятен. Отрисовка будет вестись линиями Тось помимо исходных координат надо знать координаты куда провести линию.
s=search(net[_root.lan.begin.lan_num-1].name,str);
if (s!=-1)
{
this.net_obj[0].x[1]=net[_root.lan.begin.lan_num-1].x[s];
this.net_obj[0].y[1]=net[_root.lan.begin.lan_num-1].y;
}

Определения направления следования данных от сети с меньшим номером большему или наоборот.
nt_c.num=_root.lan.begin.lan_num-1;
if (nt_c.num<_root.lan.end.lan_num) {
nt_c.inc = 1;
}
else {
nt_c.inc=-1;
}
_root.stat_arr[0]=_root.lan.begin.name;

Цикл в котором просчитывается массив координат
for (i=0; i<=num_kk; i++)
{
if (i!=0)
{

Выше выполнялась проверка закончено создание координат для первой части пути или нет. Если закончено то тогда необходимо создать новый элемент пути и записывать в него новые координаты. Такая ситуация складывается когда данные должны быть доставлены следующему элементу.
this.net_obj[i]={};
this.net_obj[i].x =[1];
this.net_obj[i].y =[1];

Выполнение проверки направления следования данных. Для определения необходимости использования определенного порта шлюза
if (_root.lan.begin.lan_num<_root.lan.end.lan_num)
{

// Тогда это только переход от первого порта g ко второму
this.net_obj[i].x[0]=g[net_obj[i-1].from].x[1];
this.net_obj[i].y[0]=g[net_obj[i-1].from].y[1];
}
else
{
// Тогда это только переход от второго порта g к первому
this.net_obj[i].x[0]=g[net_obj[i-1].from+nt_c.inc].x[0];
this.net_obj[i].y[0]=g[net_obj[i-1].from+nt_c.inc].y[0];
}
Сохранения координат шлюза и и его связи с сетью.
if ((net_obj[i-1].from+nt_c.inc)==1)
{

str="g"+((net_obj[i-1].from)+(1+nt_c.inc)/2);
s=search(net[nt_c.num].name,str);
this.net_obj[i].x[1]=net[nt_c.num].x[s];
this.net_obj[i].y[1]=net[nt_c.num].y;
}
else
{
this.net_obj[i].x[1]=net[nt_c.num].gx;
this.net_obj[i].y[1]=net[nt_c.num].gy;
}
}
Проверка на завершение пути
if (nt_c.num==_root.lan.end.lan_num-1)
{
Путь надо завершать
s=search(net[nt_c.num].name,_root.lan.end.name);
if (s!=-1)
{
_root.stat_arr[st_c]=_root.lan.end.name;
_root.stat_count=st_c;
this.net_obj[i].x[2]=net[nt_c.num].x[s];
this.net_obj[i].y[2]=net[nt_c.num].y;
s=search(nets_el_name,_root.lan.end.name);
this.net_obj[i].y[3]=nets_el_y[s];
this.net_obj[i].x[3]=nets_el_x[s];
}
}
else
{
Если путь завершать не надо, то надо записать маршрутизатор
if ((nt_c.num+1)==2)
{
kk=2-(2-(2*nt_c.inc))/4;
str="g"+String(kk);//можно nt_c.num вместо 2
_root.stat_arr[st_c]=str;
st_c++;
s=search(net[nt_c.num].name,str);
this.net_obj[i].x[2]=net[nt_c.num].x[s];
this.net_obj[i].y[2]=net[nt_c.num].y;
net_obj[i].from=nt_c.num;
this.net_obj[i].x[3]=g[kk-1].x[2-kk];
this.net_obj[i].y[3]=g[kk-1].y[2-kk];
}
else
{
this.net_obj[i].x[2]=net[nt_c.num].gx;
this.net_obj[i].y[2]=net[nt_c.num].gy;
for (j in g)
{
nt_c.num++;
s=search(g[j].name,"net"+nt_c.num);
nt_c.num--;
net_obj[i].from=nt_c.num;
if (s!=-1)
{
j++;
_root.stat_arr[st_c]="g"+String((j));
j--;
st_c++;
this.net_obj[i].x[3]=g[j].x[s];
this.net_obj[i].y[3]=g[j].y[s];
break;
}
}
}
}
this.net_obj[i].n=4;
nt_c.num=nt_c.num+nt_c.inc;
}
num_kk++;

Если путь сформирован то необходим выполнить передачу сцене идентификатор того что путь следования сформирован.
if ((num_kk!=0)&&(_root.start_draw!=0))
{
_root.speed_dr=100;
if (num_kk==1)
{
_root.toDoWhat=10;
}
_root.toDo=1;
}
По окончанию работы данного кадра будет сформирован массив координат, и можно уже приступать к отображению.
Функция в особых комментариях не нуждается. Про выбираются из массива координаты и рисуется линия.
/*===============================================================*/
_root.id_draw=1;
point1 = new object();
point1.x = net_obj[kk].x[0];
point1.y = net_obj[kk].y[0];
point2 = new object();
point2.x = net_obj[kk].x[1];
point2.y = net_obj[kk].y[1];
draw_x=point1.x;
step=(point2.x-point1.x)/speed;
idInt=setInterval(this,"draw_nets",_root.speed_dr);
i=1;

/*===============================================================*/
function draw_nets() {
if (_root.id_draw==1)
{
nets_line.moveTo(point1.x,point1.y);
draw_x=draw_x+step;
c_s++;
if (c_s>speed)//(draw_x>=point2.x)
{
c_s=0;
draw_x=point2.x;
draw_y=point2.y;
i++;
point1.x=point2.x;
point1.y=point2.y;
point2.x = net_obj[kk].x[i];
point2.y = net_obj[kk].y[i];
step=(point2.x-point1.x)/speed;
if (i>=net_obj[kk].n)
{
clearInterval(idInt);
/*=== ===============================================*/
kk++;
if ((kk==num_kk-1)&&(_root.toDoWhat!=21))
{
_root.count2++;
_root.stat_str=_root.stat_str+_root.stat_arr[_root.count2]+">Извлечение из ENET-кадра ip-адреса узлу назначения\n";
_root.w1.ttf3.text=_root.stat_str;
_root.stat_str=_root.stat_str+_root.stat_arr[_root.count2]+">Проверка на принадлежность адреса данной сети\n";
_root.w1.ttf3.text=_root.stat_str;
_root.stat_str=_root.stat_str+_root.stat_arr[_root.count2]+">Адрес узла принадлежит данной сети\n";
_root.w1.ttf3.text=_root.stat_str;
_root.stat_str=_root.stat_str+_root.stat_arr[_root.count2]+">Отправка широковещательного ARP-запроса\n";
_root.w1.ttf3.text=_root.stat_str;
_root.net_obj_buff.x=net_obj[kk].x;
_root.net_obj_buff.y=net_obj[kk].y;
_root.net_obj_buff.n=net_obj[kk].n;
_root.toDo=101;
}
else if (kk < num_kk)
{
i=1;
if (_root.toDoWhat!=21)
{
_root.count2++;
_root.stat_str=_root.stat_str+_root.stat_arr[_root.count2]+">Извлечение из ENET-кадра ip-адреса узлу назначения\n";
_root.w1.ttf3.text=_root.stat_str;
_root.stat_str=_root.stat_str+_root.stat_arr[_root.count2]+">Проверка на принадлежность адреса данной сети\n";
_root.w1.ttf3.text=_root.stat_str;
_root.stat_str=_root.stat_str+_root.stat_arr[_root.count2]+">Адрес узла не пренадлижит сети\n";
_root.w1.ttf3.text=_root.stat_str;
_root.stat_str=_root.stat_str+_root.stat_arr[_root.count2]+">Переадресация сообщения на другой маршрутизатор\n";
_root.w1.ttf3.text=_root.stat_str;
}
point1.x = net_obj[kk].x[0];
point1.y = net_obj[kk].y[0];
point2.x = net_obj[kk].x[1];
point2.y = net_obj[kk].y[1];
draw_x=point1.x;
step=(point2.x-point1.x)/speed;
draw_y=(((draw_x-point1.x)*(point2.y-point1.y))/
(point2.x-point1.x))+point1.y;
nets_line.moveTo(point1.x,point1.y);
idInt=setInterval(this,"draw_nets",30);
}
else
{
_root.id_draw=0;
nextFrame();
}
/*===================================================*/
}
}
else
{
draw_y=(((draw_x-point1.x)*(point2.y-point1.y))/
(point2.x-point1.x))+point1.y;
}

nets_line.lineTo(draw_x,draw_y);
}
}

Управление
Управление в этом клипе использутся для того чтобы определить, что необходимо делать когда весь массив координат отработан. Вывод организован таким образом, что этот массив используется и для координат линий при организации DNS и ARP запроса.

stop();
if ((_root.toDoWhat==10)) //По окончанию необходимо выйти и сообщить об окончании
{
_root.toDo=10;
}
else if (_root.toDoWhat==21) //По окончанию необходимо сформировать ARP-данные
{
_root.toDo=102;
}
else if (_root.toDoWhat==22) //По окончанию необходимо сформировать ARP-jndtn
{
_root.toDo=103;
}
else if (_root.id_dns==1) // Формирование DNS-запроса
{
_root.id_dns=0;
gotoAndStop(9);
}
else if (_root.id_dns==2) // Получен DNS-ответ и формирование данных для отправки пакет
{
_root.id_dns=0;
_root.toDo=2;
}




Rambler's Top100