В этом блоге уже скопилось довольно много постов, посвящённых теме создания flash-часиков. В одной из последних статей по этой тематике приводился мини-обзор онлайн-сервиса clocklink, который не только предоставляет широкий выбор дизайнерских решений для флеш-часиков, но и позволяет настроить эти часики на отображение времени конкретного часового пояса. Естественно, это достигается за счёт взаимодействия флеш-плеера с серверными скриптами. Ведь сам Flash Player умеет только считывать время, установленное на локальном компьютере, а этого часто бывает недостаточно. И сегодня мы попытаемся сделать что-то подобное сервису clocklink своими руками...
Общий план: у нас есть серверный скрипт (пусть он будет написан на популярном языке PHP), который возвращает текущее время; флеш-приложение обращается к данному серверному скрипту, чтобы узнать текущее время, а затем использовать полученные данные для корректировки работы flash-часов.
Начнём с php-скрипта. Он, кстати, невероятно простой...
Код PHP:
<?php
$curtime = time();
echo 'curtime='.$curtime;
?>
Что делает этот код? А он просто возвращает количество секунд (!), прошедших с начала эпохи Unix.
Откройте удобный вам текстовый редактор и перепишите приведённый выше код, а затем сохраните получившийся текстовый файл на сервере (!) как «gettime.php». И не забывайте, что все текстовые файлы, с которыми предполагается работа флеш-приложений, должны сохраняться в кодировке utf-8.
Теперь нам надо как-то загрузить данные из gettime.php в наше флеш-приложение. В самом простом случае, это будет выглядеть примерно так...
Код ActionScript 3.0:
import flash.events.*;
import flash.net.*;
var urlRequest:URLRequest = new URLRequest("gettime.php?"+Math.random()*int.MAX_VALUE);
var urlLoader:URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
urlLoader.addEventListener(Event.COMPLETE, onComplete);
urlLoader.load(urlRequest);
function onComplete(event:Event):void
{
var loader:URLLoader = URLLoader(event.target);
trace(loader.data.curtime)
}
Правда, приведённый выше код не учитывает один момент - могут возникнуть ошибки при загрузке данных. Возможно, стоит эти ошибки отслеживать и как-то на них реагировать...
Код ActionScript 3.0:
import flash.events.*;
import flash.net.*;
var urlRequest:URLRequest = new URLRequest("gettime.php?"+Math.random()*int.MAX_VALUE);
var urlLoader:URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
urlLoader.addEventListener(Event.COMPLETE, onComplete);
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
urlLoader.load(urlRequest);
function onComplete(event:Event):void
{
var loader:URLLoader = URLLoader(event.target);
trace(loader.data.curtime)
}
function onSecurityError(event:SecurityErrorEvent):void
{
trace("Ошибка!!!");
}
function onIOError(event:IOErrorEvent):void
{
trace("Ошибка!!!");
}
Итак, теперь данные из php-скрипта загружены в flash-ролик. И эти данные можно использовать для настройки объекта Date (напомню, что именно класс Date отвечает в ActionScript 2.0/3.0 за работу с датой/временем).
Код ActionScript 3.0:
import flash.events.*;
import flash.net.*;
import flash.text.TextField;
var urlRequest:URLRequest = new URLRequest("gettime.php?"+Math.random()*int.MAX_VALUE);
var urlLoader:URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
urlLoader.addEventListener(Event.COMPLETE, onComplete);
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
urlLoader.load(urlRequest);
function onComplete(event:Event):void
{
var loader:URLLoader = URLLoader(event.target);
var curtime:Number = parseInt(loader.data.curtime,10) * 1000;
var now:Date = new Date(curtime);
var h:Number = now.getHours();
var m:Number = now.getMinutes();
var s:Number = now.getSeconds();
var tf:TextField = new TextField();
tf.text = "Текущее время: " + h + " ч. " + m + " мин. " + s + " сек..";
tf.width = 400;
tf.height = 200;
tf.x = 50;
tf.y = 50;
addChild(tf);
}
function onSecurityError(event:SecurityErrorEvent):void
{
trace("Ошибка!!!");
}
function onIOError(event:IOErrorEvent):void
{
trace("Ошибка!!!");
}
Результат:
Здесь мы в качестве единственного параметра для конструктора объектов Date указали ранее полученное с сервера значение, но умноженное на 1000 (дело в том, что от сервера мы получили время в секундах, а конструктору объектов Date мы должны передать время в миллисекундах). Таким нехитрым образом мы загрузили данные о текущем времени с сервера. А что вы дальше будете делать с загруженными данными - это уже ваше дело.
Скачать исходники к данному уроку (под Adobe Flash CS 5.5).
ЗЫ: Думаю понятно, что точность возвращаемых сервером данных будет определяться настройками сервера + качество/скорость передачи данных с сервера в флеш-приложение.