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

вторник, 28 апреля 2009 г.

cacheAsBitmap для AS2 ручками. AS2

Давно, работая с AS3, убедился, что очень эффективно кэшировать статические мувики вручную - сохранять снимок мувика в BitmapData и заменять на сцене сложный клип на полученное растровое изображение. Выигрыш производительности просто неимоверный! Я даже сделал специальный механизм, который сканировал сцену на предмет таких клипов (помеченных особым именем) и кэшировал их таким способом. Причем, штатный cacheAsBitmap работает совершенно отвратительно и против ручного метода, просто курит в затяг.

И вот, на днях, доделывая одну ужасно тормозную заставку на flash 8, решил применить это дело и для AS2. Вот простейший код, который вставляется во фрейм мувика, на котором мувик надо закешировать (правда внешний контроль над ним будет потерян, но это уже другая история):
import flash.display.BitmapData;
stop();
var bitmap:BitmapData = new BitmapData(this._width,this._height,false);
bitmap.draw(this);
this._parent.attachBitmap(bitmap,this.getDepth());
this.unloadMovie();

четверг, 24 апреля 2008 г.

"Ручной" cacheAsBitmap. AS2

Код для статьи "Ручной" cacheAsBitmap. AS2.

Пример использования:
import flash.display.BitmapData;
import flash.geom.Matrix;
import flash.geom.ColorTransform;

var bmp_data:BitmapData = new BitmapData(this._width,this._height,false,0);
bmp_data.draw(this,new Matrix(),new ColorTransform(),"normal",new Rectangle(0,0,this._width,this._height),true);

var name:String;
for (name in this)
if (this[name] instanceof MovieClip) {
var movie:MovieClip = this[name];
movie.unloadMovie();
delete this[name];
}

this._height-=0.5;
this.attachBitmap(bmp_data,1,"auto", true);

понедельник, 18 февраля 2008 г.

Псевдо-генератор случайных чисел. AS3

package org.racer.utils
{
/**
* Псевдо-генератор случайных чисел.
* Получает гамму случайных чисел, и по запросу, выдает каждый последующий элемент гаммы
* Класс представляет только статические методы и не позволяет себя инстанцировать.
*
* @author Evgeny [Racer] Simonov
* @version 1.0
*/
public class TGammaRandom {

/**
* При отсутствии гаммы случайных чисел, random возвращает -1
*/
static public const RETURN_ERROR_MODE:int=0;

/**
* При отсутствии гаммы случайных чисел, random возвращает Math.random();
*/
static public const RETURN_RANDOM_MODE:int=1;

/**
* При отсутствии гаммы случайных чисел, random генерирует исключение
*/
static public const THROW_EXCEPTION_MODE:int=2;

/**
* @private
* Текущий элемент
*/
static private var __current:Number=0;

/**
* @private
* Режим реакции на ошибку в случае неустановленной гаммы случайных чисел
* true - генерируется исключение, false - в результат выдается Math.random();
*/
static private var __strict_mode:int=THROW_EXCEPTION_MODE;

/**
* Режим реакции на ошибку в случае неустановленной гаммы случайных чисел
* true - генерируется исключение, false - в результат выдается Math.random();
*/
static public function set strict_mode(value:int):void {
__strict_mode=value;
}

/**
* @private
*/
static public function get strict_mode():int {
return __strict_mode;
}

/**
* @private
* Гамма случайных чисел
*/
static private var __gamma:Array=null;

/**
* Гамма случайных чисел
*/
static public function set gamma(value:Array):void {
__gamma=value;
}

/**
* @private
*/
static public function get gamma():Array {
return __gamma;
}

/**
* Конструктор. Никогда не вызывается.
*/
public function TGammaRandom() {
throw new Error("Класс TGammaRandom инстанцировать нельзя. Все методы класса являются статическими.");
}

/**
* Возвращает значение из гаммы случайных чисел.
*
* @return Случайное значение
*/
static public function random():Number {
if ((__gamma==null)||(__gamma.length==0)) {
switch (__strict_mode) {
case RETURN_ERROR_MODE:
return -1;
break;
case RETURN_RANDOM_MODE:
return Math.random();
break;
case THROW_EXCEPTION_MODE:
throw new Error("Гамма случайных чисел не установлена, либо пуста. Невозможно возвратить случайное число.");
break;
}
}
if (__current>=__gamma.length) __current=0;
return __gamma[__current++];
}
}
}

понедельник, 11 февраля 2008 г.

Серверный скрипт изменения значения переменной комнаты с оповещением всех пользователей зоны. SmartFoxServer API

Получить запрос на изменение переменной комнаты, изменить ее и оповестить всех авторизованных в зоне пользователей об изменении (дело в том, что стандартный метод SFS Flash API изменения переменной комнаты оповещает только пользователей, находящихся в изменяемой комнате).
function init() {
trace("Initialization Zone Level Extension")
zone=_server.getCurrentZone();
}

function handleRequest(cmd, params, user, fromRoom) {
trace("Zone Level Extension received request: cmd="+cmd+" params="+params+" user="+user+" fromRoom="+fromRoom);

switch (cmd) {
case "setrv":
trace("Room "+zone.getRoom(fromRoom).getName()+" variable changed: "+params.name+". Setting the variable and sending broadcast for all users.");
_server.setRoomVariables(zone.getRoom(fromRoom), user, [params], false, false);
var response={}
response._cmd="chgrv"
response.r_id=fromRoom
response.name=params.name
response.val=params.val
_server.sendResponse(response, fromRoom, null, zone.getUserList().toArray())
break;
}
}

вторник, 29 января 2008 г.

Представление компонентов в виде списка. Flex

Создать ItemVO.as с кодом:
package
{
import flash.events.IEventDispatcher;
import flash.events.EventDispatcher;
[Bindable]
public class ItemVO extends EventDispatcher
{
public var label : String;
public var checked : Boolean;
}
}


Создать CheckBoxItemRender.mxml с кодом:
<?xml version="1.0" encoding="utf-8"?>
<?xml:namespace prefix = mx /><mx:canvas height="20" width="100" mx="http://www.adobe.com/2006/mxml">
<mx:checkbox id="checker" change="{data.checked = checker.selected}" selected="{data.checked}" label="{data.label}"></mx:checkbox>
</mx:canvas>

Создать ComponentListTest.mxml с кодом:
<?xml version="1.0" encoding="utf-8"?>
<!-- Tree control example. -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*" layout="vertical">
<mx:Script>
<![CDATA[
public function clearItems() : void
{
for (var i : Number=0; i<arcoltest.length; i++)
{
arcoltest.getItemAt(i).checked = false;
}
}
]]>
</mx:Script>
<mx:ArrayCollection id="arcoltest">
<local:ItemVO label="qewqw" checked="true" />
<local:ItemVO label="1" checked="true" />
<local:ItemVO label="2" checked="true" />
<local:ItemVO label="1231" checked="true" />
<local:ItemVO label="qweqwe" checked="true" />
</mx:ArrayCollection>
<mx:List dataProvider="{arcoltest}" itemRenderer="CheckBoxItemRender" />
<mx:Button label="Clear all" click="clearItems()"/>
</mx:Application>

пятница, 18 января 2008 г.

Код для статьи "Делаем прелоадер для Flex-приложения". AS3.

Код основного класса MainClass:
package {
import flash.display.Sprite;
import flash.display.Bitmap;

[Frame(factoryClass="MyFactory")]
public class FrameTest extends Sprite
{
[Embed(source="big_asset.jpg")]
private var Asset:Class;

public function FrameTest()
{
init();
}

public function init():void
{
var asset:Bitmap = new Asset();
addChild(asset);
}
}
}

Код класса фабрики MyFactoryClass:
package
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.utils.getDefinitionByName;

public class MyFactory extends MovieClip
{
public function MyFactory()
{
stop();
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}

public function onEnterFrame(event:Event):void
{
graphics.clear();
if(framesLoaded == totalFrames)
{
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
nextFrame();
init();
}
else
{
var percent:Number = root.loaderInfo.bytesLoaded / root.loaderInfo.bytesTotal;
graphics.beginFill(0);
graphics.drawRect(0, stage.stageHeight / 2 - 10,
stage.stageWidth * percent, 20);
graphics.endFill();
}
}

private function init():void
{
var mainClass:Class = Class(getDefinitionByName("FrameTest"));
if(mainClass)
{
var app:Object = new mainClass();
addChild(app as DisplayObject);
}
}
}
}

среда, 26 декабря 2007 г.

Преобразование цветного изображения в чернобелое с использованием ColorMatrixFilter. AS3

Один из способов преобразования цветного изображения в оттенки серого - установить пропорции цветов R:G:B в отношении 3:6:1 соответственно.

BMP - имя класса изображения в библиотеке.

var bmp:BitmapData = new BitmapData(1600, 1200);
var b:Bitmap = new Bitmap(bmp);
this.addChild(b);
var arr:Array = [
0.3, 0.6, 0.1, 0.0, 0.0,
0.3, 0.6, 0.1, 0.0, 0.0,
0.3, 0.6, 0.1, 0.0, 0.0,
0.0, 0.0, 0.0, 1.0, 0.0
];
var cmf:ColorMatrixFilter = new ColorMatrixFilter(arr);
bmp.applyFilter(new BMP(1600, 1200), new Rectangle(0, 0, bmp.width,
bmp.height), new Point(0, 0), cmf);

воскресенье, 25 ноября 2007 г.

Загружаемый растр. Как включить сглаживание при трансформациях. AS2

//this.__display - клип, в который только что было загружено растровое изображение

public function makeBitmap() {

//Сохраняем изображение в BitmapData с включенным сглаживанием
var bmp_data:BitmapData = new BitmapData(this.__display._width,this.__display._height,true,0);
bmp_data.draw(this.__display,new Matrix(),new ColorTransform(),"normal",new Rectangle(0,0,this.__display._width,this.__display._height),true);

//Очищаем клип от загруженных данных (возможно есть более правильный способ)
var display_parent:MovieClip=this.__display._parent;
var display_name:String=this.__display._name;
var display_depth:Number=this.__display.getDepth();
this.__display.removeMovieClip();
this.__display=display_parent.createEmptyMovieClip(display_name,display_depth);

//Выводим растр в очищенный клип
this.__display.attachBitmap(bmp_data,0,"auto", true);
}

суббота, 24 ноября 2007 г.

Ждем следующего фрейма для получения полноценного доступа к свойствам загруженного клипа. AS2

Особенность использования onLoadComplete вместо onLoadInit

private function waitForOneFrame() {
this.__display.onEnterFrame=Delegate.create(this,this.afterOneFrame);
}

private function afterOneFrame() {
this.__display.onEnterFrame=null;
//Есть доступ ко всем свойствам
}

private function onLoadComplete() {
this.waitForOneFrame();
}

пятница, 23 ноября 2007 г.

Вариант реализации паттерна Singleton с проверкой булева флага на возможность инстанцирования. AS3

package
{
/**
* Пример реализации паттерна Одиночка на языке ActionScript 3
* с проверкой специального флага на возможность инстанцирования.
*
* @author Yuri "Barmaley" Yarovoy
* @version 1.0
*/
public class Singleton
{
private static var __instance:Singleton;
private static var __allowInstantiation:Boolean = false;

public static function get instance():Singleton
{
if(!__instance)
{
// Разрешаем создание экземпляра класса.
__allowInstantiation = true;
// Создаем экземпляр.
__instance = new Singleton();
// Запрещаем создание экземпляров.
__allowInstantiation = false;
}
return __instance;
}
/**
* Конструктор.
*/
public function Singleton()
{
if(!__allowInstantiation)
throw new Error("Вы не можете создавать экземпляры класса при помощи конструктора. Для доступа к экземпляру используйте Singleton.instance.");
}
}
}

пятница, 16 ноября 2007 г.

Скрипт мониторинга загрузки

/*
* Скрипт мониторинга загрузки.
* Вставляется в главную временную шкалу, требует от владельца:
* - метод onComplete - что делать по завершении загрузки
* - String text_format - как форматировать текст информацией о загрузке. Сивол $ заменяется на процент загрузки
* - MovieClip display - клип, отображающий загрузку. Должен иметь 101 фрейм с анимацией мониторинга загрузки и текстовое поле text
*/

if (_root.getBytesLoaded()!=_root.getBytesTotal()) {
this.stop();
this.display.owner=this;
this.display.skipped=Number(_root.getBytesLoaded());
this.display.total=Number(_root.getBytesTotal()-this.display.skipped);
this.display.onEnterFrame=function (){
var progress:Number=Math.floor(((_root.getBytesLoaded()-this.skipped)*100)/this.total);
this.gotoAndStop(progress+1);
this.text.text=this.owner.text_format.split("$").join(progress);
if (_root.getBytesLoaded()==_root.getBytesTotal()) {
this.onEnterFrame=null;
this.owner.onComplete();
}
}
} else {
this.onComplete();
}

понедельник, 5 ноября 2007 г.

Принудительный вызов сборщика мусора. AS3

try {
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
} catch (e:*) {}


Позаимствовано отсюда.

четверг, 1 ноября 2007 г.

Как загрузить библиотеку и затем аттачить из нее клипы. AS3

package {
import flash.display.Sprite;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
//
public class duplicateLoadedExample extends Sprite {
public function duplicateLoadedExample() {
var loader:Loader = new Loader();
var url:URLRequest = new URLRequest( “library.swf” );
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, movieLoaded);
loader.load( url );
}
public function movieLoaded(event:Event){
var ms:Class = event.target.applicationDomain.getDefinition(”movie”) as Class;
var mvs = new ms();
addChild( mvs );
}
}
}

Версия подгружаемой SWF (Получить 4й байт)

static public const SWF_SIGN:String = 'CWS';
static public const SWF_VERSION_POS:int = 3;
static public function getSWFVersion(b:ByteArray):uint {
if(BinLoader.isSWF(b)) {
var pos:uint = b.position;
b.position = BinLoader.SWF_VERSION_POS;
var ver:uint = b.readByte();
b.position = pos;
return ver;
} else return null;
}