Статьи

Доступ к одним и тем же сохраненным данным с помощью отдельных приложений Flash и JavaScript

В этом уроке я покажу вам, как получить доступ к одним и тем же сохраненным данным в отдельных приложениях Flash и JavaScript, сохранив их в HTML5 LocalStorage и используя ExternalInterface для доступа к ним с AS3. Мы создадим одно и то же приложение на JavaScript и Flash, чтобы продемонстрировать, что оно не зависит от платформы.


Локальное хранилище — это интересная часть HTML5, которая позволяет сохранять постоянное хранилище на стороне браузера, то есть оно сохраняется между сеансами браузера. Он исчезает только тогда, когда пользователь очищает кеш браузера.

Это очень простой в использовании API, использующий простые пары ключ-значение для хранения данных, и его можно использовать несколькими различными способами. Одним из способов является использование localStorage.setItem('key','value') и localStorage.getItem('key') . Другой способ — использовать localStorage[key] = value нотацию: localStorage[key] = value чтобы установить значение, и theValue = localStorage[key] чтобы получить его. И, если этого было недостаточно, есть еще третий способ — Dot Notation: localStorage.key = value чтобы установить его, и theValue = localStorage.key чтобы получить его.

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


Сначала мы создадим приложение JavaScript. Вы должны разработать и этот, и проект Flash на живом сервере, иначе у вас возникнут проблемы. Я использую WAMP на своей машине в качестве локального хостинга.

Создайте папку для хранения вашего проекта. В этой папке создайте две новые папки. Назовите один из них «JS», а другой «стили».

В папке «styles» создайте новый файл и назовите его «style.css», а в папке «js» создайте новый файл и назовите его «externalinterface.js». Наконец, в корневом каталоге вашего проекта создайте новый файл и назовите его «index.html».


Введите следующий код в файле «index.html», который вы создали на предыдущем шаге.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE html>
<html>
<head>
<title>Local Storage with external Interface</title>
<link rel=»stylesheet» type=»text/css» href=»styles/style.css» />
<script type=»text/javascript» src=»js/externalinterface.js»></script>
</head>
<body>
<div id=»wrapper»>
<div id=»scorewrapper»>
<p id=»scorediv»></p>
 
 
<p id=»randomscorediv»>Random Score is: </p>
 
 
<button type=»button» id=»scorebtn»>Generate Score</button>
</div>
 
 
</div>
 
 
</body>
</html>

Здесь мы устанавливаем структуру нашего файла «index.html». Мы включили «style.css» и «externalinterface.js», которые мы создали в предыдущем шаге. scorediv будет обновляться, когда мы получим новый высокий балл, и randomscorediv будет обновляться каждый раз, когда мы генерируем новый счет (нажмите на кнопку, чтобы создать случайный счет).


Введите следующее в «style.css», который вы создали на шаге выше.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
#wrapper{
    width:400px;
    height:400px;
    margin: 0 auto;
     
     
}
#scorewrapper{
    width:400px;
    height:200px;
    background-color:#FFFFFF;
}
 
#randomscorediv{
    visibility: hidden;
}
 
body{
    background: #f2f2f2;
    text-align: center;
    padding: 20px;
}

Здесь мы устанавливаем приложение для центрирования на странице, устанавливаем background-color div- scorewrapper и устанавливаем randomscorediv изначально hidden (невидимым). Когда мы нажимаем на кнопку, мы устанавливаем randomscorediv видимым.


Введите следующий код в «externalinterface.js», который вы создали на шаге выше.

1
2
3
window.onload = function(){
alert(«Window Loaded»);
}

Всякий раз, когда вам нужно связать элементы на вашей веб-странице, вы должны убедиться, что окно загружается первым. Поскольку нам нужно привязать кнопку, мы используем функцию window.onload предоставляемую JavaScript. Здесь мы просто выскакиваем предупреждение со словами «Окно загружено». Если вы протестируете страницу, вы увидите, что она работает.


На этом шаге мы setScore() функцию setScore() которая изначально устанавливает счет на 0. Введите следующий код в «externalinterface.js».

1
2
3
4
5
6
7
window.onload = function(){
    function setScore(){
        if(!localStorage.score){
            localStorage.score = 0;
        }
    }
}

Здесь мы проверяем, существует ли localStorage.score , и если нет, мы инициализируем его значение равным 0. Когда пользователь впервые запускает приложение или после того, как он очистит свой кэш, это значение не будет существовать — поэтому нам нужно его создать ,

Теперь вызовите эту функцию сразу после ее создания и протестируйте, поместив ее в оповещение.

1
2
3
4
5
6
7
8
9
window.onload = function(){
    function setScore(){
        if(!localStorage.score){
            localStorage.score = 0;
        }
    }
    setScore();
    alert(localStorage.score);
}

У нас есть способ установить наш счет, теперь нам нужен способ получить его. Это то, что будет выполнять функция getScore() . Введите следующее ниже функции setScore() вы создали в setScore() шаге.

1
2
3
4
5
function getScore(){
    if(localStorage.score){
        return(localStorage.score);
    }
}

Здесь мы проверяем, что localStorage.score существует, и если это так, мы просто возвращаем значение, которое он содержит. Удалите предупреждение с предыдущего шага и добавьте следующее предупреждение под getScore() .

1
2
3
4
5
6
7
function getScore(){
    if(localStorage.score){
        return(localStorage.score);
    }
}
alert(getScore());
}

Если вы тестируете сейчас, вы должны снова увидеть предупреждение, показывающее счет «0».


Теперь, когда у нас есть способ установить и получить наш счет, нам нужен способ его обновить. Это именно то, чего достигает функция updateScore() . Добавьте следующее ниже функции getScore() вы создали в getScore() шаге.

1
2
3
4
5
function updateScore(newScore){
    if(localStorage.score){
        localStorage.score = newScore
    }
}

Здесь мы передаем в качестве параметра newScore ; затем мы устанавливаем localStorage.score равным этому значению. Удалите оповещение из предыдущего шага, затем добавьте следующее ниже только что созданной функции updateScore() .

1
2
3
4
5
6
7
function updateScore(newScore){
    if(localStorage.score){
        localStorage.score = newScore;
    }
}
updateScore(10);
alert(getScore());

Если вы тестируете сейчас, вы должны увидеть предупреждение «10», поскольку в строке 6 мы обновили счет до 10.


Теперь, когда у нас есть все наши методы для манипулирования счетом, давайте покажем его. Введите следующее ниже функции updateScore() вы создали на шаге выше.

1
2
3
4
function showScore(){
    var scoreText = document.getElementById(‘scorediv’);
    scoreText.innerHTML = «Current High Score is «+getScore();
}

Здесь мы получаем ссылку на scorediv и scorediv его свойство innerHTML чтобы отображать текущий счет.

Вызывайте эту функцию сразу после ее создания.

1
2
3
4
5
function showScore(){
    var scoreText = document.getElementById(‘scorediv’);
    scoreText.innerHTML = «Current High Score is «+getScore();
}
showScore();

Если вы протестируете страницу сейчас, вы должны увидеть слова «Текущий рекорд 10».


Мы хотим запустить функцию, когда пользователь нажимает на кнопку. Добавьте следующее ниже showScore() , которую вы создали на шаге выше.

1
2
var scoreBtn = document.getElementById(‘scorebtn’);
scoreBtn.addEventListener(‘click’,getRandomScore,false);

Здесь мы получаем ссылку на кнопку, которой мы дали идентификатор scorebtn . Затем мы добавляем EventListener типа click , который вызывает getRandomScore() которую мы создадим на следующем шаге.


Функция getRandomScore() — это место, где имеет место логика этого приложения. Добавьте следующее под строкой scoreBtn.addEventListener('click',getRandomScore,false); Вы вошли в шаг выше.

01
02
03
04
05
06
07
08
09
10
11
12
function getRandomScore(){
    var randScoreText = document.getElementById(‘randomscorediv’);
    randScoreText.style.visibility=’visible’;
    var randScore = Math.floor(Math.random()* 200000);
    var currentScore = Number(getScore());
    randScoreText.innerHTML = «Random Score is «+randScore;
    if(randScore > currentScore){
        alert(«New High Score!!»);
        updateScore(randScore);
        showScore();
    }
}

Здесь мы сначала получаем ссылку на randomscorediv и устанавливаем ее видимой. Затем мы генерируем случайную оценку, вызывая Math.floor(Math.random()* 200000) , который создает число от 0 до 200 000. Мы используем нашу getScore() чтобы установить переменную currentScore (убедившись, что мы приводим ее к Number), и устанавливаем innerHTML для randScoreText randScore .

Наконец, мы проверяем, является ли randScore больше, чем currentScore , и, если это так, мы показываем alert("New High Score!!") а затем обновляем localStorage.score , вызывая наш updateScore() и передавая randomScore . Затем мы используем showScore() чтобы показать новый счет.

На этом мы заканчиваем приложение JavaScript — вы можете проверить его здесь . На следующем шаге мы начнем разрабатывать версию Flash.


На этом шаге мы настроим проект Flash.

Создайте папку для хранения файлов вашего проекта. Теперь внутри этой папки создайте папку с именем «js», и в этой папке создайте файл и назовите его «externalinterface.js». В корневой папке вашего проекта создайте файл с именем «index.html». Наконец, создайте новый проект Flash и сохраните его в корневой папке, указав имя «externalInterface.fla». Дайте ему белый фон и установите размер 400x200px.


Добавьте следующее в файл «index.html», который вы создали на предыдущем шаге.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Transitional//EN» «http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd»>
<html xmlns=»http://www.w3.org/1999/xhtml»>
<head>
<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />
<title>Tuts+ Premium: Demo</title>
<style>
    body {background: #f2f2f2;
</style>
<script type=»text/javascript» src=»js/externalinterface.js»></script>
</head>
<body>
<object classid=»clsid:d27cdb6e-ae6d-11cf-96b8-444553540000″ codebase=»http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0″ width=»400″ height=»200″ id=»externalInterface» align=»middle»>
  <param name=»allowScriptAccess» value=»sameDomain» />
  <param name=»allowFullScreen» value=»false» />
  <param name=»movie» value=»externalInterface.swf» />
  <param name=»quality» value=»high» />
  <param name=»bgcolor» value=»#ffffff» />
  <embed src=»externalInterface.swf» quality=»high» bgcolor=»#ffffff» width=»400″ height=»200″ name=»externalInterface» align=»middle» allowScriptAccess=»sameDomain» allowFullScreen=»false» type=»application/x-shockwave-flash» pluginspage=»http://www.macromedia.com/go/getflashplayer» />
</object>
</body>
</html>

Здесь мы настраиваем наш файл «index.html». Мы включаем «externalinterface.js», который мы создали в предыдущем шаге, и встраиваем SWF-файл в тег object . Если вы решили назвать свой FLA как-то иначе, важно указать правильное значение для SWF, где это применимо.


Добавьте следующее в «externalinterface.js», который вы создали в предыдущем шаге.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
function setScore(){
    if(!localStorage.score){
        localStorage.score = 0;
    }
}
 
function getScore(){
    if(localStorage.score){
     return localStorage.score;
      
    }
}
 
function updateScore(newScore){
        localStorage.score = newScore
    }

Это те же функции, которые мы использовали в приложении JavaScript, поэтому я не буду их здесь объяснять. Важно отметить, что я удалил window.onload , однако.


На этом этапе мы настроим пользовательский интерфейс для FLA, который вы создали на предыдущих этапах.

Выберите инструмент «Текст» и убедитесь, что на панели «Символ» установлены следующие свойства.

  • Черный цвет
  • Размер: 16pt

Теперь перетащите TextField на сцену и присвойте ему следующие свойства.

  • X: 102,00
  • Y: 14,00
  • W: 210,00
  • H: 25,25

Дайте ему имя экземпляра «currentScore_txt» и убедитесь, что тип установлен в «Классический текст» и «Динамический текст» соответственно.

Теперь перетащите другой TextField на сцену и присвойте ему следующие свойства.

  • X: 102,00
  • Y: 49,00
  • W: 210,00
  • H: 25,25

Дайте ему имя экземпляра «randomScore_text».

Перейдите на панель «Компоненты» и перетащите кнопку на сцену. (Вы можете перейти на панель «Компоненты», перейдя в «Окно»> «Компоненты» или просто нажав CTRL + F7.)

Придайте кнопке следующие свойства.

  • X: 150,00
  • Y: 110,00
  • W: 100,00
  • H: 22.00

Дайте ему имя экземпляра «scorebtn».

На панели «Параметры компонентов» измените метку на «Создать счет».

Выберите инструмент «Прямоугольник» и присвойте ему цвет заливки «#CCCCCC», а не обводку.

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

  • X: 118,00
  • Y: 50,00
  • Ш: 173,00
  • H 82.00

Теперь щелкните правой кнопкой мыши на прямоугольнике и выберите «Преобразовать в символ»; дать ему имя «alertBox».

Дважды щелкните по прямоугольнику, чтобы перейти в режим редактирования. Откройте панель «Компоненты» и перетащите кнопку в этот мувиклип. Придайте кнопке следующие свойства.

  • X: 37,00
  • Y: 52,00
  • W: 100,00
  • H: 22.00

Дайте ему имя экземпляра «alertBox_btn» и измените метку на «OK».

Перетащите TextField в мувиклип и присвойте ему следующие свойства.

  • X: 29,00
  • Y: 10,00
  • W: 131,00
  • H: 22.00

Введите слова «Новый рекорд!» в TextField, затем закройте этот мувиклип.


Создайте новый файл ActionScript и сохраните его как «Main.as». Затем, вернувшись в свой FLA, установите Main в качестве класса документа .


Добавьте следующее в файл «Main.as», созданный на шаге выше.

01
02
03
04
05
06
07
08
09
10
11
12
package {
    import flash.display.Sprite;
    import flash.events.*;
    import flash.external.ExternalInterface;
     
    public class Main extends Sprite {
 
        public function Main() {
             
        }
    }
}

Здесь мы импортируем необходимые нам классы и кодируем нашу функцию конструктора.


Добавьте следующее в Main() .

1
2
3
public function Main() {
    addEventListener(Event.ADDED_TO_STAGE,setup);
}

Событие ADDED_TO_STAGE запускается, когда фильм полностью загружен. Здесь он вызывает функцию setup , которую мы создадим дальше.


Добавьте следующее ниже функции конструктора Main() .

1
2
3
private function setup(e:Event):void{
    trace(«MOVIE READY»);
}

Если вы протестируете сейчас, вы увидите, что «MOVIE READY» отслеживается на панели вывода.


Возможно, вы заметили, что окно оповещения, которое мы создали, показывалось при первом запуске фильма; давайте спрятать это. Введите следующее в функцию setup() .

1
2
3
private function setup(e:Event):void{
    alertBox.visible = false;
}

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


На этом шаге мы будем использовать класс External Interface для вызова нашей функции setScore() которую мы настроили в коде JavaScript. Введите следующее ниже функции setup() вы создали в предыдущих шагах.

1
2
3
private function setScore():void {
    ExternalInterface.call(«setScore»);
}

Здесь мы используем метод call() класса ExternalInterface для запуска функции setScore() которая есть в нашем коде JavaScript. Метод call() принимает в качестве параметра имя функции JavaScript для запуска (в виде строки). Если бы у нас были параметры в нашей функции setScore() , мы бы включили их и здесь.

Мы хотим, чтобы эта функция запускалась при первом запуске фильма, поэтому добавьте ее в функцию setup() .

1
2
3
4
private function setup(e:Event):void{
    alertBox.visible = false;
    setScore();
}

На этом этапе мы получим счет для показа в нашем Flash-фильме. JavaScript будет отправлять счет во Flash, и для этого мы будем использовать метод внешнего интерфейса addCallback() чтобы сделать функцию доступной для него.

Добавьте следующее в функцию setup() .

1
2
3
4
5
private function setup(e:Event):void{
    alertBox.visible = false;
    setScore();
    ExternalInterface.addCallback(«getScore», getScore);
}

addCallback принимает два параметра: имя функции, которую вы хотите сделать доступной через JavaScript (в виде строки), и функцию AS3, с которой будет связан этот вызов (как обратный вызов функции AS3). Здесь мы хотим сделать getScore() AS3 доступной сначала для нашего кода JavaScript; для простоты мы даем ему имя getScore() при доступе через JavaScript.

Теперь мы getScore() эту getScore() AS3. Добавьте следующее ниже функции setScore() вы создали в setScore() шаге.

1
2
3
4
private function getScore(score:String):int{
    var theScore:int = int(score);
    return theScore;
}

Здесь мы настроили нашу getScore() . Поскольку мы получим строку обратно из JavaScript, мы устанавливаем параметр как строку и возвращаем целое число. Внутри этой функции мы устанавливаем переменную с именем theScore и theScore ее к int ; затем мы возвращаем theScore .


На этом шаге мы показываем текущий счет во Flash-фильме. Введите следующее ниже функции getScore() вы создали в getScore() шаге.

1
2
3
private function showScore():void{
    currentScore_txt.text = «Current High Score is: «+ExternalInterface.call(«getScore»);
}

Здесь мы устанавливаем currentScore_txt.text для отображения текущего счета. Мы используем ExternalInterface.call("getScore") для вызова функции getScore в коде JavaScript, который, в свою очередь, вызывает getScore() в нашем коде ActionScript. Помните, это возвращает счет.

Теперь добавьте следующее в функцию setup() .

1
2
3
4
5
6
private function setup(e:Event):void{
    alertBox.visible = false;
    ExternalInterface.addCallback(«getScore», getScore);
    setScore();
    showScore();
}

Если вы сейчас тестируете фильм , вы должны увидеть показанный счет.


Нам нужен способ добавить слушателей к нашим кнопкам, чтобы когда пользователь нажимал на них, они что-то делали. Добавьте следующее под showScore() который вы создали на шаге выше.

1
2
3
4
private function addButtonListeners():void{
    scorebtn.addEventListener(MouseEvent.CLICK,getRandomScore);
    alertBox.alertBox_btn.addEventListener(MouseEvent.CLICK,hideAlertBox);
}

Добавьте следующую выделенную строку в функцию setup() .

1
2
3
4
5
6
7
private function setup(e:Event):void{
    alertBox.visible = false;
    setScore();
    ExternalInterface.addCallback(«getScore», getScore);
    showScore();
    addButtonListeners();
}

Здесь мы настраиваем нашу scorebtn для вызова функции AS3 с именем getRandomScore() , и мы устанавливаем alertBox_btn который находится в alertBox для вызова функции AS3 с именем hideAlertBox() . Далее мы добавим эти функции.

Добавьте следующее ниже только что созданной функции addButtonListeners() .

1
2
3
4
5
6
7
private function getRandomScore(e:MouseEvent):void{
     
}
         
private function hideAlertBox(e:Event):void{
    alertBox.visible = false;
}

Мы закончим getRandomScore() на следующем шаге. Все, что мы делаем в функции hideAlertBox() — устанавливаем alertBox как невидимый. Мы сделаем это видимым, когда пользователь получит новый рекорд.


На этом шаге мы getRandomScore() функцию getRandomScore() , где — как и в приложении JavaScript, которое мы сделали — вся логика приложения имеет место. Добавьте следующее в getRandomScore() вы создали на шаге выше.

01
02
03
04
05
06
07
08
09
10
private function getRandomScore(e:MouseEvent):void{
    var randScore:int = Math.floor(Math.random()* 200000);
    var currentScore:int = ExternalInterface.call(«getScore»);
    randomScore_text.text = «Random Score is: «+ randScore.toString();
        if(randScore > currentScore){
        alertBox.visible = true;
        ExternalInterface.call(«updateScore»,randScore);
        showScore();
    }
}

Это работает очень похоже на версию JavaScript. Сначала мы генерируем число от 0 до 200 000. Затем мы получаем текущий счет, используя ExternalInterface.call("getScore") . Мы устанавливаем randomScore_text чтобы randomScore_text случайный счет. Наконец, мы проверяем, больше ли randScore чем currentScore , и, если это так, мы показываем окно оповещения, обновляем счет в Local Storage с помощью ExternalInterface.call("updateScore",randScore) и вызываем наш showScore() чтобы показать новый Гол.

Проверьте демо .


Мы использовали внешний интерфейс для доступа к API локального хранилища из HTML5. Я надеюсь, что вы нашли этот урок полезным и спасибо за чтение!