PDA

Просмотр полной версии : Рисовалка с сохранением действий на сервер. Не могу разобраться с кодом.


Error202
12.06.2010, 10:36
Здравствуйте!

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

Рисую так:

Дополнительные параметры: диаметр, цвет, прозрачность


// Обработка отпускания мыши
on (release, releaseOutside) {
delete onMouseMove;
}

// Обработка нажатия мыши
on (press) {
m++;

_root.otm.gotoAndStop(1);
_root.undo = true;
_root.norep();
aa = this.createEmptyMovieClip("ff"+m, m);
aa._x = 0;
aa._y = 0;


x = aa._xmouse
y = aa._ymouse
aa.lineStyle(_root.diam,_root.kolor,_root.al);
// В первый параметр массива arr2 будет записано 1
loadVariables("http://server.ru/cgi-bin/krok/test.pl?diam="+_root.diam+"&kolor="+_root.kolor+"&al="+_root.al, "_root", "get");
aa.moveTo(x,y);
aa.lineTo(aa._xmouse+0.2,aa._ymouse+0.2);

onMouseMove = function() {

aa.lineTo( aa._xmouse, aa._ymouse);
xx = aa._xmouse;
yy = aa._ymouse;
// В первый параметр массива arr2 будет записано 2
loadVariables("http://server.ru/cgi-bin/krok/test.pl", "_root", "post");
}



Указанный выше блок исправно работает сохраняет всес помощью скрипта

Отображаю так:

arr2 - массив 1 или 2, x,y,диаметр,цвет и прозрачность


if (arr2[0] == 1)
{
m++;
aa = this.createEmptyMovieClip("ff"+m, m);
aa._x = 0;
aa._y = 0;
_root.diam=Number(arr2[3]);
cc = new Color(aa);
cc.setRGB(Number(arr2[4]));
_root.kolor=cc.getRGB();

_root.al=Number(arr2[5]);
aa.lineStyle(_root.diam,_root.kolor,_root.al);
aa.moveTo(Number(arr2[1]),Number(arr2[2]));
aa.lineTo(Number(arr2[1])+0.2,Number(arr2[2])+0.2);
}
else
{

aa.lineTo( Number(arr2[1]), Number(arr2[2]));
}


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

Что в кодах нужно подправить, чтобы такого не происходило?

rainbowrussia
12.06.2010, 18:22
Жестко у вас как-то - loadVariables везде, даже в onMouseMove. Подозреваю что из-за этого loadVariables "путаются" в очередности загрузки, что вызывает плавающие проблемы, причем именно при рисовании линий.

Error202
12.06.2010, 20:09
Я просто не знаю как правильно надо :(

zurkis
12.06.2010, 20:22
пример реализации рисовалки с сохранением можешь скачать тут:
http://flash-world.ru/flash_tutorial/51-actionscript_2_jpg_png_bmp_saving.html

rainbowrussia
12.06.2010, 21:16
Я просто не знаю как правильно надо :(

Как минимум сохранять действия в массив, с загрузкой данных на сервер либо по окончанию рисования, либо периодически, но не так часто как срабатывает onMouseMove. Полагаю что можно сделать сохранение по кнопке "Save", а до этого сохранять данные в памяти (в массиве). При этом не забывая контролировать факт успешной загрузки данных.

Error202
15.06.2010, 11:13
Меня самого смущает такое использование LoadVariable, только задача сливать в скрипт все действия, они записываются в файл и воспроизводятся, имитируя рисование в реальном времени... Мне вот надо сохранялку сделать правильно, а плеер уже несложно...

rainbowrussia
15.06.2010, 12:20
Опишите поточнее задачу.
Я понял что вам нужно реальное время, но я не понял вы где-то ходите выводить на экран то что кто-то рисует? Как раньше была "общая рисовалка" в netmeeting вроде.
Или же достаточно нарисовать и сохранить, запоминая временные метки и потом воспроизвести записанное.

Error202
15.06.2010, 13:08
Прошу прощения за неточность...

Да, Вы правильно поставили оба вопроса...

Нужна не совсем общая рисовалка, а просто рисовалка, у других в реальном времени должно отображаться то, что рисует один... Т.е. у них только плееры...

А также мне нужна возможность у плеера воспроизводить (эмулируя реальное время) то, что уже было когда-то нарисовано кем-то...

Хемуль
15.06.2010, 13:53
2 Error202:
Ну, вам нужно будет действительно как-то лаги обрабатывать. Я в своё время тоже как-то пробовал забрасывать сервер запросами - путаются они.

Error202
15.06.2010, 13:57
да уж... :(

Через LoadVars() что-то вообще не отправляется ничего...

Хемуль
15.06.2010, 14:02
2 Error202:
Ну, если у вас есть браузер Firefox с плагином FireBug, на его закладке Net можете по-быстрому глянуть, что за запросы отсылает флешка и доходят ли они до скрипта.

Error202
15.06.2010, 14:16
не работает у меня чего-то этот плагин... :(

Хемуль
15.06.2010, 16:15
2 Error202:
Если выложите это в онлайн, я смогу глянуть.

rainbowrussia
15.06.2010, 17:49
Тогда вот вам пара советов, которые приведут вас к успеху.
1) Совместно с событиями "изменение цвета", "рисование линии" и тд сохранять еще метку времени, а так же время начала рисования.
2) Прочитать про событие onLoad объекта LoadVars

В итоге флешка "художника" будет буферизировать в себе все события, отправлять их на сервер, как только сработает onLoad, в принципе можно отправлять следующую порцию событий. На сервере в базе будет сохраняться вся последовательность событий для возможности последующего воспроизведения. Подключенные клиенты удут периодически запрашивать свежие события через LoadVars и отображать процесс по событию onLoad.

Но мне все это не нравится, по делу клиенты должны между собой общаться напрямую в реальном времени через сокеты. На AS3 вроде бы сокеты есть, но деталей не знаю. На AS2 есть XMLSocket, но я с ним тоже не работал никогда. Судя по описанию, XMLSocket как раз для этих целей и создан - low latency, real-time.

Если остановиться на XMLSocket, то у вас почти ничего менять не придется - там где вы делается loadvars, вы будете отправлять данные через единственный открытый заранее XMLSocket с временными метками, а подключеные клиенты так же будут открывать XMLSocket к серверу и в реальном времени получать обновления... НО для этого нужно писать своего демона.

Извините если только запутал.

UPD. В принципе, если у вас сейчас все работает кроме ошибок с цветами, то просто совместно с данными о координатах линии передавайте еще и текущий цвет и другие атрибуты. Таким образом потеря данных об изменении цвета или других атрибутов не будет критична.

Error202
15.06.2010, 18:35
А сколько коннектов потянет такое соединение?

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

Добавлено через 19 часов 33 минуты
Справился...

Проблема была в том, что loadVars отправлял быстро много данных, они перемешивались и в итоге была неточность...

Заливаю все действия в массив и периодически его отправляю весь и вычищаю...
Чисту провожу по событию data...

Действия, сделанные во время отправки, но до подтверждения ее добаваю во временный массив, который присваиваю основному после его чистки...

Вроде пока работает...