15 марта 2011 г.

Код-сниппеты

Часто хочется иметь под рукой куски кода, которыми пользовался раньше, которые выполняют простые типовые операции.

Как повернуть MovieClip? Как вращать объекты в ActionScript вокруг центра?
Напомню, что все объекты, являющиеся DisplayObject'ами вращаются заданием свойства rotation. Однако, такой поворот происходит относительно левой верхней точки Sprite или MovieClip.
Чтобы сделать вращение относительно центра, к примеру, нам понадобится такая функция:

package inputControllers.basics
{
import flash.geom.Matrix;


public class FlexMatrixTransformer
{
public static function rotateAroundExternalPoint(m:Matrix, x:Number, y:Number, angleDegrees:Number):void
{
m.translate(-x, -y);
m.rotate(angleDegrees*(Math.PI/180));
m.translate(x, y);
}
}
}

И вот как её использовать.

FlexMatrixTransformer.rotateAroundExternalPoint(backMatrix, VIEWPORT_WIDTH / 2, VIEWPORT_HEIGHT / 2, BACK_ROTATION_SPEED);
back.transform.matrix = backMatrix; 

Если этот код вызывать каждый кадр, то объект back, являющийся Sprite'ом, будет вращаться вокруг центра на BACK_ROTATION_SPEED за каждый кадр.

Если необходимо фиксировано задавать вращение, то в функцию rotateAroundExternalPoint в самом начале добавляем m.identity() - это приведет к сбросу матрицы преобразования объекта в единичную, т.е. без преобразований.



Как случайно перемешать массив в ActionScript?
Для этого опишем функцию randomSort в глобальном пространстве имён приложения и вызовем функцию sort над массивом, где в качестве функции-компаратора подставим функцию randomSort.

Создадим файл ShuffleMachine.as следующего содержания:

package model
{
public class ShuffleMachine
{
public static function shuffle(source:Array):Array
{
return source.sort(randomSort);
}
}
}



function randomSort(a:Object, b:Object):int { //функция в глобальном пространстве имен
return Math.random() > 0.5 ? 1: -1;
}

Как сделать вероятностную функцию? Функция случайного события в ActionScript.


Пусть функция случайного события pRand при её вызове возвращает 0 или 1 в зависимости от того, произошло ли это событие в данный момент с заданной вероятностью p или нет, а функция pRandVariant указывает произошедшей случайное событие из списка несовместимых событий с заданными вероятностями. Код, реализующий эти функции приведен ниже.



public class MathUtils
{
public static const ERROR:int = -1;
public static const TRUE:int = 1;
public static const FALSE:int = 0;

/**
* Возвращает 0 или 1 в зависимости от того, произошло ли случайное событие с вероятностью p или нет.
* */
public static function pRand(p:Number):int
{
var random:Number = Math.random();
return random < p? TRUE:FALSE;
}

/**
* Возвращает индекс выпавшего варианта при заданной функции вероятности p
* */
public static function pRandVariant(p:Array):int
{
var random:Number = Math.random();
var a:Number = 0;
var b:Number = 0;
for (var i:uint = 0; i < p.length; i++) {
b = b + p[i];
if (random >= a && random < b) {
return i;
}
a = b;
}
return ERROR;
}
}



Отправить комментарий