Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
Шрифт:
Хотя этот раздел не называется "Руководство по программированию на Perl для начинающих", ниже приведены листинги программ Submitscore.pl и Getscores.pl с краткими пояснениями, как работает каждая из их частей. Если вы незнакомы с программами, использующими стандарт CGI, обратитесь за разъяснениями к людям, сведущим в этой области.
Комментарий в языке Perl начинаются с символа #. Программа Submitscore.pl начинается с комментария, который на самом деле используется Web-сервером для определения адреса программы, интерпретирующей сценарии Perl. Нижеприведенный
#!/usr/bin/perl
Первая строка текста самой программы начинается с отправки результативных данных обратно во Flash-ролик. Именно за это отвечает выражение Content-type: text/html, за которым следуют две пустые строки. Первая строка любого файла, посылаемого с Web-сервера, сообщает браузеру (в данном случае Flash-ролику) о типе передаваемых данных. В этом примере передаваемые данные – обычный текст.
# Устанавливаем метку для текстового документа, отсылаемого
# назад браузеру.
print "Content-type: text/html\n\n";Затем данные из Flash-ролика передаются в программу, где для их временного хранения используется переменная $get_data:
# Получаем переданные данные. $get_data = $ENV{‘QUERY_STRING’};
Когда данные пересылаются через сеть, они обычно кодируются таким образом, чтобы не допустить их некорректную передачу. Буквы не кодируются в отличие от пробелов, которые передаются как знак "+", и небуквенно-цифровых символов, передающихся как символьные последовательности, например %OA. Чтобы раскодировать данные, необходимо дополнить программу следующими строками:
# Преобразуем закодированные символы.
$get_data =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C",hex($1))/eg;
#get_data =~ tr/\+/ /;Далее нужно получить текущее время, измеренное на Unix-сервере в секундах, прошедших с 01.01.1970. Эти данные вы будете использовать как то время, когда был получен результат. Лучше оперировать именно этим показателем, а не временем, которое показывает сам Flash-ролик: игроки могут находиться в разных часовых поясах, а у некоторых из них может быть неправильно установлено время на их компьютерах.
# Вносим в базу данных время, показываемое сервером, в секундах. $server_time = time;
Следующий шаг – организация цикла, который берет последовательность символов, хранящуюся в переменной $get_data, и разделяет ее на части. Например, такая последовательность имеет вид: name=Gary&score=967. Она разделяется на два элемента: до и после символа & , а затем каждый из этих элементов подразделяется еще на два – на ключ и на значение, теперь уже благодаря символу =.
# Обрабатываем полученные данные и создаем массив.
@split_data = split("&",$get_data);
foreach $data_item (@split_data)
{
($key, $value) = split("=",$data_item);
$info{$key} = $value;
}Текстовой базой данных, где хранятся лучшие
# Определяем имя файла, который будет содержать базу данных.
$filename = "highscore.txt";
# Открываем базу данных.
open(OUTFILE, ">>$filename") || exit;После того как файл будет открыт, программа внесет в него единичные записи, содержащие набранные очки, имя игрока и время, например: 967&Gary&978887513.
# Вносим информацию в базу данных. print OUTFILE "$info{‘score’}&$info{‘name’}&$server_time\n";
Программа Submitscore.pl заканчивает свою работу, закрывая текстовый файл и пересылая определенную информацию во Flash. В данном случае переменной resultText присваивается символьная строка OK.
# Закрываем базу данных.
close(OUTFILE);
# Подтверждаем ввод данных.
print "resultText=OK\n";
# Завершаем программу.
exit;Программа Getscores.pl несколько сложнее, чем Submitscore.pl. В ее задачу входит просмотр базы данных, удаление устаревших записей и затем выдача списка десяти лучших результатов. Начало этой программы аналогично началу Submitscore.pl. Далее файл открывает базу данных и перебирает все ее записи с использованием переменной типа "массив" @score_text.
#!/usr/bin/perl
# Устанавливаем метку для текстового документа,
# получаемого на выходе.
print "Content-type: text/html\n\n";
# Указываем имя файла, содержащего базу данных.
$filename = "highscore.txt";
# Просматриваем записи базы данных.
open(DATABASE,$filename) || exit;
@score_text = <DATABASE>;
close(DATABASE);Затем программа подсчитывает, какое время (в секундах на сервере) было ровно семь дней назад.
# Определяем время на сервере.
$server_time = time;
# Выясняем, как долго сохранять полученные результаты.
# (7 дней * 24 часа * 60 минут * 60 секунд)
$keep_time = 7*(24*60*60);Теперь база данных открыта и готова для записи. Старый файл перезаписывается с учетом новых данных.
# Открываем базу данных для перезаписи. open(DATABASE,">" . $filename) || exit;
Следующий цикл проверяет каждую запись и определяет, как давно она была внесена в базу данных. Если запись устарела, то она не переписывается в новый файл.
# Просматриваем каждую запись.
foreach $score_line (@score_text) {
# Получаем данные о набранных очках.
@score_item = split(/&/,$score_line);
# Определяем время занесения результата.
$score_time = $score_item[2];
# Если запись не устарела, переписываем ее в новый файл.
if ($score_time > ($server_time-$keep_time)) {
print DATABASE "$score_line";
}
}
# Закрываем базу данных.
close(DATABASE);