Показаны сообщения с ярлыком actionscript. Показать все сообщения
Показаны сообщения с ярлыком actionscript. Показать все сообщения

20 декабря 2012

Постинг в социалки из actionscript

Недавно столкнулся с необходимостью постить в социалки информацию из своего приложения. Долго гулил и был удивлен что нигде нет простого и очевидного решения проблемы. Но все таки я смог победить проблемы собрав воедино то что мне попадалось на глаза и теперь я готов поделиться этим.

package ru.mixailflash
{
    import flash.net.URLRequest;
    import flash.net.navigateToURL;

    public class SocialShare extends Object{
        public static var URL:String = "http//yoursite.ru/";
        public static var IMAGE:String = "http//yoursite.ru/image.png";
        public static var MESSAGE:String = "message for VK and FB";
        public static var TW_MESSAGE:String = "message for twitter";
        public static var TITLE:String = "Title for message";
  
        private static var urlVK:String = "http://vkontakte.ru/share.php";
        private static var urlTW:String = "http://twitter.com/home?status=";
        private static var urlFB:String = "http://www.facebook.com/sharer.php?s=100&p[title]=";
  
        public static function shareTwitter():void{
            var url:String = urlTW + TW_MESSAGE + " " + encodeURI(URL) 
            navigateToURL(new URLRequest(url), "_blank" );
        }
  
        public static function shareVkontakte():void{
            var url:String = urlVK + "?url=" + encodeURI(URL) + "&title=" 
            url = url.concat(encodeURI(TITLE) + "&image="+IMAGE);
            url = url.concat("&description=" + encodeURI(MESSAGE) + "&noparse=true");
            navigateToURL(new URLRequest(url), "_blank");
        }
  
        public static function shareFacebook():void{
            var url:String = urlFB+TITLE+"&p[summary]="+MESSAGE;
            url = url.concat("&p[url]="+URL+"&p[images][0]="+IMAGE);
            navigateToURL(new URLRequest(url), "_blank");
        }
    }
}

07 ноября 2012

Расширение Array в actionscript

Не так давно возникла проблема расширения класс Array для включения ряда своих дополнений. Я написал расширения. И решил поделиться с Вами. Есть несколько нюансов, например наследование будет не от Array, а от Proxy (он специально создан для итого чтобы расширять Array пользователем):

30 октября 2012

Документация actionscript 3

Нашел в своих архивах правила оформления кода при написание приложение на actionscript, решил что будет кому-нибудь интересно и выложить так что вперед под кат.

24 октября 2012

Перезапуск swf

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

10 мая 2012

Сложные решения или autocad в сети...

Все привыкли, что на flash можно делать только простенькие игры или не сложные приложения. Но это не так.

flash исходники

Совершенно случайно наткнулся на один сайт поясвященный различным урокам и фишкам на actionscript: flashandmath 

03 февраля 2012

Ответ на вопрос читателя или с чего начать изучение...

Сегодня один мой читатель написал мне с вопросами о том с чего начать изучение actionscript, стоит ли покупать книги и так далее...

02 февраля 2012

socialAPI или как делать игру для всех социалок



Сейчас очень часто flash упоминается как средство разработки игр для социальных сетей. Но социальных сетей очень много и у них совершенно разный api для работы с инструментами самой социальной сети. Не так давно я задумался над тем, что было бы замечательно сделать библиотеку которая бы могла помочь с этом вопросом. И так как у меня сейчас есть свободное время я решил этим заняться.

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


Для начала я решил взять две социальные сети со свободным доступом к песочнице: мой мир и вконтакте. Получилось просто и легко.
Кратко, о том что теперь не прийдется делать разработчику, а именно что за него сможет сделать данная библиотека:
1). Определение социальной сети по flashVars.

2). Авторизация в социальной сети.
     - для вконтакте проверка настроек доступа.

3). Получение информации о пользователе.

4). Получение списка друзей и информации о них.

5). Открытие окна приглашения друзей.

И так что нам для этого будет необходимо:
  • Скачаем саму библиотеку http://mixailflash.assembla.me и напишем код.
  • После этого выложим наше приложение в социальные сети и посмотрим что все работает.
Код для подключения библиотеки и пример использования команд:
package
{
    import flash.display.Sprite;
    import flash.display.Stage;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import SocialAPI.connection.*;
    public class main extends Sprite
    {
        private var connectionAPI:ConnectionApi;

        public function main()
        {
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            trace ('this is sotialAPI');
            // get flashVars                  
            // получаем flashVars                                                                                        
            var parametrs:Object = this.loaderInfo.parameters;
         
            // add specific default settings for mm;                                                                                        
            // добавляем специфичесие настройки социальных сетей;
            parametrs.mm={DOMFlashId:'flash-app',        
                          privateKey:'a284a33469d7e982d344f4db15baaf7c'};
            //add specific default settings for vk;                                                                                        
            parametrs.vk = {setting:31};


            //rear of the name of social networks;                                                                                         
            // получаем имя социальной сети;
            ConnectionApi.SET_SOCIAL_NAME(parametrs);


            //create an instance of the social network;
            // создаем экземпляр объекта для работы с социальной сетью                                                                                   
            connectionAPI = new ConnectionApi.SOCIAL_CLASS_API(parametrs);
            //Adds a listener to successfully connect to a set of social;
            // добавляем слушатель успешной авторизации                                                                 
            connectionAPI.addEventListener(ConnectionApi.CONNECT, handlerConnect);
            //call the connect;            
            // вызываем метод авторизации                                                                                             
            connectionAPI.connect();
        }
        private function handlerConnect(event:Event):void
        {
            // отписываемся от прослушивания события
            connectionAPI.removeEventListener(ConnectionApi.CONNECT, handlerConnect);
            // добавляем слушатель успешного получения информации о пользователе
            connectionAPI.addEventListener(ConnectionApi.USER_COMPLITE, handlerUser);
            // запрашиаем информацию о пользователе
            connectionAPI.askUserInfo();
         }
        private function handlerUser(event:Event):void
        {
            connectionAPI.removeEventListener(ConnectionApi.USER_COMPLITE, handlerUser);
            connectionAPI.addEventListener(ConnectionApi.FRIENDS_COMPLITE, handleFriends);
            //запрашиваем информацию о друзьях;
            connectionAPI.askFriendsList();
        }
        private function handleFriends(event:Event):void
        {
            connectionAPI.removeEventListener(ConnectionApi.FRIENDS_COMPLITE, handleFriends);
            //выводим информацию о друзьях
            for(var g:* in connectionAPI.friends) connectionAPI.friends[g].out();
            // показываем окно приглашения друзей;
            connectionAPI.showInviteBox();
        }
    }
}

В следующей версии я постараюсь подключить facebook.com и расширить функционал имеющихся социальный сетей.
Жду предложений по развитию функционала.


26 января 2012

Компиляция с параметрами!


Доброго времени суток.


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

Есть несколько решений:
- сделать переменную, которую необходимо будет постоянно менять.
- использовать параметр -define=CONFIG в mxmlc


Оба варианта имеют право на жизнь. Но я хочу рассказать о втором варианте.

Для его реализации достаточно в коде программы написать условие выбора:
package
{
  import flash.display.Sprite;

  public class HelloWorld extends Sprite
  {
    public function HelloWorld()
    {
      if(CONFIG::COMPILE_FOR_AIR)
      {
         trace("This line of code will be compiled when COMPILE_FOR_AIR=true.");
      }
      else
      {
        trace("This line of code will be compiled when COMPILE_FOR_AIR=false.");
      }
    }
  }
}

а при компиляции добавить новый параметр -define=CONFIG:
mxmlc -define=CONFIG::COMPILE_FOR_AIR,true HelloWorld.as -debug=true

вот и все, теперь при запуске программы, она смотрит с каким входным параметром ее скомпилировали и в зависимости от этого исполняет себя.


22 января 2012

fdb или как тестировать swf без графического интерфейса

Все мы во время разработок сталкивались с проблемой тестирования или дебагинга (то есть отлова ошибок). Сегодня я расскажу как это можно делать без специальных IDE, используя только инструменты непосредственно входящие в пакет flex sdk.

17 января 2012

Я открываю канал на youtube



Доброго времени суток. Это mixailflash и я открываю свой канал на youtube посвященный флешу и всему что с ним связанно.



В первом выпуске я буду рассказывать о том что такое flex sdk, как его поставить на компьютер. А потом с его помощью команды mxmlc скомпилировать swf файл без какой либо графической оболочки.
Первое что нам предстоит сделать это скачать сам flex sdk. Для это в наберем в гуге download flex sdk 4.6 на первую страницу из списка предложенных. Попадаем на сайт adobe.com, кликнем download zip архив, переходим на новую страницу, здесь необходимо подтвердить, что мы согласны с правилами использования, путем постановки галочки и наконец кликам download.
После того как загрузка завершилась перейдем в finder и кликнем на архиве чтобы он распаковался. После завершения распаковки зайдем в папку с flex sdk и посмотрим сколько тут разных папок и файликов. В следующих выпусках я подробно рассмотрю для чего они нужны и как именно с ними работать. Теперь нам надо проверить, не стоит ли у нас уже flex sdk, и для этого нам надо открыть терминал и ввести команду:
echo $PATH

это команда выводит все прописанные в нашей системе пути для сборок и всякого такого. Как мы можем увидеть никаких путей на flex sdk у нас сейчас не прописано. Теперь откроем файловый менеджер. Я в частность пользуюсь mc. Каким будете пользоваться, решать вам. Здесь нам надо найти директорию Library зайти в нее и создать папку flex. И после ее создания зайдем в эту папку, в другом окне перейдем в директорию Download (Загрузки) и скопируем папку с flex sdk в только что созданную папку flex.Вернемся в терминал и займемся пропитыванием путей на наш sdk.

Для это в любом текстовом редакторе откроем файл ~/.profile и здесь пропишем пути до нашей библиотеки
export PATH=/Users/IMAC/Library/flex/flex_sdk_4.6.0.23201B/bin:$PATH
export PATH=/Library/flex/flex_sdk_4.6.0.23201B/bin:$PATH

Теперь нам необходимо что бы прописанные нами изменения вступили в силу. Мы работаем не в Windows поэтому машину перегружать не надо. Но вот терминал перезапустим и как мы увидим введя опять команду
echo $PATH

что прописанные изменения применены.
Вызовем команду:
mxmlc

если мы до этого сделали все правильно то должно появиться несколько строк содержащих знаки вопросов. Не пугайтесь. Это исправим. Нам надо зайти в настройки терминала и во вкладке дополнительно нам надо поменять кодировки текста на «Кириллическую (Mac OS)» Теперь закроем настройки в при вызове команды mxmlc появится нормальный читабельный текст. Самое сложное мы уже осилили, теперь давай те перейдем непосредственно к написанию нашего первого приложения на actionscript а именно helloWorld:
package
{
  import flash.display.Sprite;
  import flash.text.TextField;
  public class HelloWorld extends Sprite
  {
    public function HelloWorld()
    {
      var _text:TextField = new TextField();
      _text.text = 'Hello World';
      addChild(_text);
    }
  }
}

Как мы видим в директории Documents у нас лежит файл HelloWorld.as но нет файла HelloWorld.swf.
Создайте файл HelloWorld.as и напишите простой текст программы.
Сохраните его и вернитесь опять в терминал.
Выполним команду:
mxmlc HelloWorld.as

после этого у нас создался файл HelloWorld.swf. Давай те его запустим. Как мы убедились все работает. Но когда мы с вами компилировали, компилятор нам сообщил о том кто у нас не прописанны какие то библиотеки.

/Users/IMAC/Documents/HelloWorld.as: Предупреждение: Для этой единицы компиляции не определен factoryClass в метаданных кадра для загрузки сконфигурированных общих библиотек времени выполнения. Для выполнения компиляции без общих библиотек времени выполнения задайте параметру "-static-link-runtime-shared-libraries" значение "true" или удалите параметр "-runtime-shared-libraries"

Для исправления этого перейдем в файл:
~/Library/flex/flex_sdk_4.6.0.23201B/frameworks/flex-config.xml

и найдем там строку
<static-link-runtime-shared-libraries>false</static-link-runtime-shared-libraries>

и поменяем false на true, вот так:
<static-link-runtime-shared-libraries>true</static-link-runtime-shared-libraries>

теперь компилятор у нас ругаться больше не будет.

Спасибо за внимание. Смотрите видео уроки и подписывайтесь на канал!

12 января 2012

twitter и actionscript

    На многих сайтах поятоянно встречаю трансляторы с твитера. И подумал: если можно размещать на сайтах, то можно и во флеше трансляцию проводить.

И для этого практически ничего не нужно, сам я птратил на это всего 10 минут, о есл поколдовать то может получиться очень даже красиво и функционально)))


И так первое что надо сделать это скачать готовую библиотеку, документации по которой я правда не нашел, поэтому пришлось сугубо перебором искать решение.
После этого достаточно подключить ее в наш проект и паписать несколько строк кода:

// инициализируем создание самого твиттера и повесим на него событие загрузки сообщений ползователя;

private function init():void
{
    twitte = new Twitter(); // инициализируем сам твиттер;
  
    // ставим прослушиватель события загрузки сообщений;
    twitte.addEventListener(TwitterEvent.ON_USER_TIMELINE_RESULT, out); 

    twitte.loadUserTimeline('mixailc'); // задаем ник, чьи сообщения будем читать; 

    // внимание, надо проверить чтобы аккаунт был публичным;
}

// а здесь выводим те сообщения которые получили;

private
function out(event:TwitterEvent):void 
{
    for(var i:int = 0; i < event.data.length; i++)
    {
        trace (event.data[i]['id']);            // номер сообщения;
        trace (event.data[i]['text']);          // текст сообщения;
        trace (event.data[i]['user']['name']);  // имя автора твитта;
     
       //здесь все должны быть созданны только тем кого мы
       //читаем то есть mixail (это не ник, а имено имя);
    }
}


Как мы видим ничего сложного, если еще поиграться и поковырять данную библиотеку, а потом нарисовать красивый интерфейс можно использовать и гордиться собой)))

23 ноября 2011

Что выбрать? Number, int, uint


В actionscript представлены три основных типа числовых значений. Самое интересное, что многие флешеры не совсем понимают разницу между ними:



Number - число с плавающей точкой, с размером в 64 бита, на целую часть может приходиться до 53 бит;
int - 32-разрядное целое число со знаком (значения -2147483648 (-2 в степени 31) до 2147483647 (2 в степени 31 -1));
uint - 32-разрядное число без знака (значения 0 до 4294967295 (2 в степени 32 - 1));

При инициализации int и uint значение переменной равно 0. То есть можно писать так:

int x;

вместо:

int x = 0;

а вот Number при инициализации дает только null.

Для счетчиков или каких то целых действий лучше использовать uint или int, это будет сокращать расход памяти в два раза.

Так же если переменная будет иметь тип int все ее значения будут целочисленными, даже после такого:

int/*uint*/ x = 1/2;

Но будьте осторожны с использованием uint в счетчиках, он не может быть меньше 0:

uint x;
while( x >= 0)
{
x--;
} //этот цикл никогда не завершится;


Также почему то принять для хранения цветов с альфа каналом (0xFFFFFFFF) использоваться Number, потому что не хватает значений у int, но зато у uint вполне хватает диапазона, для таких чисел.

22 ноября 2011

Отладка на лету


При написании проекта необходимо выводить некоторую информацию. Обычно, когда пишешь в IDE то для этого вполне хватает обычного trace(), но вот когда приложение уже выложено в интернет и тестируется работа например с социальным api то этого уже не достаточно.

Для этих целей можно воспользоваться дебагером arthropod, очень удобный и простой способ на лету выводить сообщения из вашего приложения.

arthropod view
На картинке изображен внешний вид данного приложения.

Создан он с использованием adobe air, что делает его кросплатформенным.

Для установки достаточно скачать и установить (если нет adobe air то можно его установить отсюда).

Так же необходимо скачать класс подключения (само приложение сообщит хотели вы этого или нет).

import com.carlcalderon.arthropod.Debug;

// а потом можно уже использовать
Debug.log ('mesage', 0xff0000);
//Второй параметр задает цвет сообщения.

Причем данное приложение может выводить не только текст но и картинки:
Debug.bitmap(someBitmap); 

Приятного тестирование)))

P.S. установка air для ubuntu:
wget http://airdownload.adobe.com/air/lin/download/latest/AdobeAIRInstaller.bin
chmod +x ./AdobeAIRInstaller.bin
sudo ./AdobeAIRInstaller.bin


20 ноября 2011

Утечка памяти в actionscript

Часто при создании больших проектов встает вопрос с тем, что во время работы приложения происходит утечка памяти (то есть с течением времени количество памяти которое необходимо для приложения постоянно растет).

Основной причиной утечки памяти является постоянное увеличения количества графических объектов, которые не удаляются, а напротив постоянно прибавляются. Это может быть вызвано тем, что что по каким-то событиям происходит создание и добавления элементов в область видимости. Это может быть вызвано некоторыми вещами:
1. Случайное создание объектов (недосмотр);
2. Если графика была создана с помощью flash cs, и графика располагалась на stage то эти объекты плодятся (как не парадоксально).

Самое элементарное что можно сделать это просто считать сколько графических объектов у нас лежит... 

// ставим прослушиватель на stage
stage.removeEventListener(Event.ENTER_FRAME, tick);
....
private var ticks:uint = 0;
private var tf:TextField = new TextField();
private var last:uint = getTimer();
  public function tick(evt:Event):void 
  {
    ticks++;
    var now:uint = getTimer();
    var delta:uint = now - last;
    if (delta >= 1000) 
    {
     var countObject:uint = countObjects(stage);
     tf.text = 'Count Object Display: '+ countObject;
     addChild(tf);// что бы было всегда выше всего на экране
     ticks = 0;
     last = now;
    }
  }
  
  //функция рекурсивная так что будет бежать и по детям детей
  private function countObjects(obj:DisplayObjectContainer):uint
  {
    if (!obj) return 0;
    var count:uint = 0;
    count += obj.numChildren;
    // бежим о всем детям
    for (var i:int = 0; i < obj.numChildren; i ++)
     count += countObjects(obj.getChildAt(i) as DisplayObjectContainer);
    return count;
  }

Теперь мы можем видеть растет ли количество, если да, то осталось посмотреть в коде откуда у нас утечка)))


Если есть предложения, то буду рад услышать ваши предложения...

17 ноября 2011

Подгоняем элементы на живую

В предыдущем посте я писал о том как считать fps и memory, я решил не останавливаться и дописать еще одну вкусность.

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

Поэтому добавил возможность в наш класс FPSCounter.as события нажатия клавиши F2, что будет приводить к выводу на экран поля с координатами мыши относительно stage а также указателя на все поле.

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

FPSCounter.as:

//file: FPSCounter.as
//language: actionscript 3.0
//author: mixailflash
//site: mixailflash.livejournal.com

package
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.display.DisplayObjectContainer;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.utils.getTimer;
import flash.system.System;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;
import flash.ui.*;

public class FPSCounter extends Sprite
{
  private var last:uint = getTimer();
  private var ticks:uint = 0;
  private var tf:TextField;
  private var spr:Sprite;
  public static var DRAG:DisplayObjectContainer; //таскаемый объект;
  
  public function FPSCounter(stage:Stage) 
  {
    tf = new TextField();
    spr = new Sprite();
    tf.textColor = 0x000000;
    tf.text = "----- fps --------- memory";
    tf.selectable = false;
    tf.autoSize = 'left';
    tf.textColor = 0xeeeeee;
    tf.background = true;
    tf.backgroundColor = 0x333333;
    //ставим прослушиватель на нажатия кнопок клавиатуры
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
  }
  private function keyPressedDown(event:KeyboardEvent):void 
  {
    var key:uint = event.keyCode;
    if (key == 112) // проверяем нажата ли кнопка F1
    {
      // если еще не нажимали и текст не находится в области видимости
       if (!tf.parent)
       {
         stage.addEventListener(Event.ENTER_FRAME, tick);
         stage.addChild(tf);
       }
       else 
       {
         stage.removeEventListener(Event.ENTER_FRAME, tick);
         stage.removeChild(tf);
       }
    }

    if (key == 113) // проверяем нажата ли кнопка F2
    {
      if (!spr.parent)
      {
        stage.addChild(spr);
        stage.addChild(tf);
        stage.addEventListener(MouseEvent.MOUSE_MOVE, moving);
      }
      else 
      {
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, moving);
        stage.removeChild(spr);
        stage.removeChild(tf);
      }
    }

    // комманды для того чтобы двигать переданный графический объект
    if (key == 39) // налево
      DRAG.x++;
    if (key == 37) // направо
      DRAG.x--;
    if (key == 40) // вниз
      DRAG.y++;
    if (key == 38) // вверх
      DRAG.y--;
  }
  
  private function moving(event:MouseEvent):void
  {
    spr.graphics.clear();
    var str:String = '';
    // показываем координаты мыши
    str = str.concat('x: '+ event.stageX + ' y: ' + event.stageY);
    if (DRAG) 
    {
      str = str.concat('\nDRAG x: '+ DRAG.x +' y: '+ DRAG.y); // координаты объекта
    }
    tf.text = str;
    spr.graphics.lineStyle(1, 0xff0000, 1);
    spr.graphics.moveTo(stage.stageWidth, event.stageY);
    spr.graphics.lineTo(0, event.stageY);
    spr.graphics.moveTo(event.stageX, stage.stageHeight);
    spr.graphics.lineTo(event.stageX, 0);
  }
  public function tick(evt:Event):void 
  {
    //считаем fps и memory  
    ticks++;
    var now:uint = getTimer();
    var delta:uint = now - last;
    if (delta >= 1000) 
    {
      var fps:Number = ticks / delta * 1000;
      tf.text = fps.toFixed(1) + " fps " + int(System.totalMemory/1024) + 'kb'+ " memory";
      ticks = 0;
      last = now;
    } 
  } 
}
}

Main.as:

//file: Main.as
//language: actionscript 3.0
//author: mixailflash
//site: mixailflash.livejournal.com

package
{
import flash.display.Sprite;
import flash.display.Stage;
import FPSCounter;
public class Main extends Sprite
{
  public function Main() 
  {
    var fps:FPSCounter = new FPSCounter(stage);
    addChild(fps);
    
    //рисуем простой прямоугольник
    var spr:Sprite = new Sprite();
    spr.graphics.beginFill(0xff00ff, 1);
    spr.graphics.drawRect(0,0,100,100);
    addChild(spr);
    
    FPSCounter.DRAG = spr; // передаем прямоугольник что бы его можно было двигать
  }
}
}

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

Actionscript IDE


Хочу рассказать об IDE для actionscript с которыми я работал и высказать свое мнение по поводу них.

Рассмотрим следующие распространённые IDE для actionscript Adobe Flash BuilderIntelliJ IDEA и два плагина под eclipse AXDT и FDT.

Начнем по порядку Adobe Flash Builder: красивый приятный дизайн, удобный но работает только под Windows и Mac OS, а так же стоимость почти 24 тысячи рублей (примерно 800 долларов).

IntelliJ IDEA: не очень красивый, настраивается ручками работает под всеми платформами, стоить 499 долларов.

FDT: также работает под всем но стоит 599 долларов.

AXDT: бесплатный работает под всем.

Из всех этих IDE я рекомендую AXDT, так как он бесплатный и является плагином eclipse работает под всеми платформами.

16 ноября 2011

Считаем ресурсы

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

Решил написать небольшой класс который выводит данные два параметра, после того как нажать " ` ", выводит fps с точностью до первого знака после запятой, и количество памяти в kb.

Класс будет называться FPSCounter.as:

package
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.utils.getTimer;
import flash.system.System;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class FPSCounter extends Sprite
{
  private var last:uint = getTimer();
  private var ticks:uint = 0;
  private var tf:TextField;
  public function FPSCounter(stage:Stage) 
  {
    tf = new TextField();
    tf.textColor = 0x000000;
    tf.text = "----- fps --------- memory";
    tf.selectable = false;
    tf.autoSize = 'left';
    tf.textColor = 0xeeeeee;
    tf.background = true;
    tf.backgroundColor = 0x333333;
    //ставим прослушиватель на нажатия кнопок клавиатуры
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
  }
  private function keyPressedDown(event:KeyboardEvent):void 
  {
    var key:uint = event.keyCode;
    if (key == Keyboard.BACKQUOTE)
      {
        // если еще не нажимали и текст не находится в области видимости
        if (!tf.parent)
         {
            stage.addEventListener(Event.ENTER_FRAME, tick);
            stage.addChild(tf);
         }
        else 
         {
            stage.removeEventListener(Event.ENTER_FRAME, tick);
            stage.removeChild(tf);
         }
      }
  }
    
  public function tick(evt:Event):void 
  {
    //считаем fps и memory  
    ticks++;
    var now:uint = getTimer();
    var delta:uint = now - last;
    if (delta >= 1000) 
      {
        var fps:Number = ticks / delta * 1000;
        tf.text = fps.toFixed(1) + " fps " +
                  int(System.totalMemory/1024) + 'kb'+ " memory";
        ticks = 0;
        last = now;
      }
  }
}
}

А теперь осталось только создать экземпляр класса в Main.as:

package
{
import flash.display.Sprite;
import flash.display.Stage;
import FPSCounter;
public class Main extends Sprite
{
  public function Main() 
  {
    var fps:FPSCounter = new FPSCounter(stage);
    addChild(fps)
  }
}
}

Теперь по нажатию на клавишу на клавиатуре, мы можем получить доступ к этим важным для нас данным.
Приятного тестирования и работы)

15 ноября 2011

Секреты растра...

Часто большое количество контента, которое отображается на экране через flash является статичным или практически статичным, то есть изменяется не каждый кадр а только после какого то действия.
Флешь работает так что каждый кадр он постоянно отрисовывается все, что лежит в области видимости, при этом векторную графику он рендерить с гораздо большей нагрузкой чем раст.
Поэтом, что бы оптимизировать нагрузку на процессор и не заставлять его каждый кадр переводить вектор в растр лучше сделать сразу же из наших DisplayObject растр:

var spr:Sprite = new Sprite();

/*
    Делаем что-нибудь с нашим спрайтом, или любым другим 
    DisplayObject  
*/

spr.cacheAsBitmap = true;
//так мы сделали раст, и рендерится он будет как растровое изображение


//если потом надо будет его изменить то:
spr.cacheAsBitmap = false;

Так мы немного снизили нагрузку на процессор.

14 ноября 2011

Прелоадер как во FlashDevelop

Столкнулся с проблемой отображения загрузки больших флешек с большим количеством контента, Загрузка которых не укладывалась в секунду и вызывало беспокойство, грузится она или нет.
Случайно увидел что во FlashDevelop можно создавать проект с прелоадером, но не мог разобраться как с ним работать, и просто принял как данность. Спустя время разобрался и решил написать об этом.

Допустим главный класс у нас будет Main и лежать будет в Main.as, а прелоадер будет лежать тут Preloader.as Что бы подключить прелоадер к главной флешке нужно прописать его там же где и свойства самой флешки: 

// Параметры SWF-файла
[SWF(width="550", height="380")]
// Интегрирование прелоадера, лежащего в Preloader.as
[Frame(factoryClass="Preloader")]

А дальше основная флешка будет выглядеть как обычно:

package 
{
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.Event;
// Параметры SWF-файла
[SWF(width="550", height="380")]
// Интегрирование прелоадера, лежащего в Preloader.as
[Frame(factoryClass="Preloader")]

// Основной класс программы
public class Main extends Sprite 
{
  // Конструктор основного класса
  public function Main():void 
  {
    if (stage) init(); 
    else addEventListener(Event.ADDED_TO_STAGE, init);
  }

  // Точка входа, после того как загрузился весь ролик
  public function init(e:Event = null):void
  {

    // Отключение обслуживания прелоадера
    removeEventListener(Event.ADDED_TO_STAGE, init);
    
    //показываем, что загрузка готова
    var text:TextField = new TextField();
    text.text = 'loadComlplite';
    addChild(text);
  }
}
}

Теперь приступим к самому прелоадеру, тут все еще проще:

package 
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.utils.getDefinitionByName;
import flash.text.TextField;
import flash.display.LoaderInfo;
 public class Preloader extends MovieClip 
 {

   //Текст для отслеживания процента загрузки 
   private var preloader_text:TextField;
   
   // Инициализация загрузчика
   public function Preloader() 
   {
     if (stage) 
       {
          stage.scaleMode = StageScaleMode.NO_SCALE;
          stage.align = StageAlign.TOP_LEFT;
       }

     //так будем проверять загрузилось или нет, 
     //Event.COMPLITE в данном случае срабатывает плохо и не всегда
     addEventListener(Event.ENTER_FRAME, checkFrame);

     //так будем смотреть сколько загрузилось
     loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);

     //так будем смотреть ошибки
     loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);

     // Текст о состоянии загрузки выводится на экран
     // либо здесь можно задать фигуру которую будет менять в функции progress
     preloader_text = new TextField();
     preloader_text.text = "Load 0 % ";
     addChild(preloader_text);
   }
   private function ioError(e:IOErrorEvent):void 
   {
     trace(e.text);
   }

   // Метод, вызываемый при изменении количества загруженных байт
   private function progress(e:ProgressEvent):void 
   {
     // Обновляется текст загрузчика
     preloader_text.text = 
       "Load "+ (Math.round((loaderInfo.bytesLoaded * 100) / loaderInfo.bytesTotal)) + " %";
   }
   private function checkFrame(e:Event):void 
   {
     if (currentFrame == totalFrames) 
       {
          stop();
          loadingFinished();
       }
   }
   
   // Завершение загрузки
   private function loadingFinished():void 
   {
     removeEventListener(Event.ENTER_FRAME, checkFrame);
     loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
     loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);
     startup();
   }
    
   private function startup():void 
   {

     //сокрытие текста и вывод главного класс в нашем случае Main
     preloader_text.visible = false;
     var mainClass:Class = getDefinitionByName("Main") as Class;
     if (parent == stage) stage.addChildAt(new mainClass() as DisplayObject, 0);
     else addChildAt(new mainClass() as DisplayObject, 0);
   }
 }
}

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

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