Архив

Публикации с меткой ‘ActionScript 3.0’

Сортировка массива объектов по нескольким полям

16 февраля 2011 1 комментарий

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

Эмуляция типа enum

17 октября 2009 6 комментариев

Java сильно влияет на ActionScript разработчиков. Сегодня я попробую эмулировать тип данных enum из Java.

Например вот так:

package {

	public class Fruit {

		public static const Apple:Fruit=new Fruit(0);
		public static const Pear:Fruit=new Fruit(1);
		public static const Peach:Fruit=new Fruit(2);

		private var _value:int;

		public function Fruit(value:int) {
			_value=value;
		}

		public function get value():int {
			return _value;
		}
	}
}

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

package {

	public class Vegetable {
		public static const Tomato:int=0;
		public static const Onions:int=1;
		public static const Cucumber:int=2;
	}
}

К тому-же он работает в два с лишним раза быстрее. Но придется все таки изучать правильные и архитектурно изящные варианты. От этого зависит буду я хорошим программистом или говнокодером...

Использование Matrix3D для z-сортировки

8 октября 2008 2 комментария

Как всегда буду краток. Для сортировки можно использовать следующий механизм:

public var faces:Array; . . .

public function ReorderChildren()
{
    for(var i:uint = 0; i < 6; i++)
    {
        faces[i].z = faces[i].child.transform.getRelativeMatrix3D(root).position.z;
        this.removeChild(faces[i].child);
    }
    faces.sortOn("z", Array.NUMERIC | Array.DESCENDING);
    for (i = 0; i < 6; i++)
    {
        this.addChild(faces[i].child);
    }
}

Для ознакомления с другими возможностями Flash Player 10 читайте Help

Вкусности ActionScript 3.0 для Flash Player 10 API

29 сентября 2008 1 комментарий

Помимо прочих креативных изменений, Flash Player 10 включает в себя несколько полезных дополнений, которые были так необходимы разработчикам и появились благодаря их усилиям.

unloadAndStop

Наконец то внешний контент можно без головной боли загружать и выгружать, так же как в старом добром ActionScript 2.0. Применив unloadAndStop к загруженному контенту (например, загруженный SWF файл), Вы тем самым останавливаете все аудио-потоки, удаляете все eventListener-ы и передаете все мусорщику. Подробнее здесь.

Ограниченный доступ к клавиатуре в полноэкранном режиме

В Flash Player 10 имеется доступ к "непечатным" клавишам. Таким как стрелки, Пробел, Shift, Tab и так далее. Раньше, как известно, в полноэкранном режиме клавиши, кроме Esc, не работали.

Доступ к файловой системе

Теперь пользователь СМОЖЕТ загрузить файл из локальной файловой системы, обработать его и сохранить результат обратно на диск. Теперь можно будет обходиться без загрузки файла на сервер и обратно для работы с внешними файлами. Это радует.

Поддержка "крупнокалиберной" графики

Имеется в виду БИТМАПЫ большого размера, до 16`777`216 пикселей (4`096 × 4`096) с максимальным размером одной стороны, равным 8`191 пикселей.

FDT 3.1 beta доступна для скачивания

Адобовские соглашения по кодированию. Дождались!

17 апреля 2008 Нет комментариев

Наконец-то мы дождались документа "Flex SDK coding conventions and best practices" от Адоба. Документ носит рекомендательный характер, однако позволит разработчикам иметь общие точки соприкосновения в вопросах читабельности кода. Было бы вообще шикарно, если бы Адоб подарил нам автоформатилку для Flex, в этом я абсолютно согласен с Ильей.

FDT 3.0 Enterprise поступил в продажу

26 марта 2008 1 комментарий

Ок, представляю вашему вниманию Enterprise-версию FDT 3.0 - популярной среды разработки ActionScript (Flash, Flex) приложений.

С помощью FDT 3.0 Enterprise Вы можете производить отладку Ваших исходников с помощью мощного отладчика, который поддерживает точки останова (breakpoints) и анализировать код шаг-за-шагом.

Еще одна крутая фишка - продвинутая система рефакторинга. Рефакторинг в FDT реализован намного сильнее чем во Flex. Не верите - попробуйте сами.

Загрузить пробную версию можно по адресу: http://fdt.powerflasher.com/index.php?page=try

Как повысить производительность AS3 приложений?

20 марта 2008 1 комментарий

Андрей Горбатов написал отличную статью, помогающую повысить производительность вашего ActionScript 3 приложения.

Честно говоря, для меня было откровением, что, например, при вычислении абсолютного значения конструкция

i = x < 0 ? -x : x;

работает на 250% быстрее чем

i = Math.abs(x);

Короче говоря, настоятельно рекомендую читать всем!

Categories: Основы Tags:

Книга “Learning ActionScript 3.0: A Beginner’s Guide” с исходником

19 марта 2008 9 комментариев

Представляю Вашему вниманию книгу "Learning ActionScript 3.0: A Beginner's Guide", вышедшую в начале этого года. Книга хорошая сама по себе. Но любопытно еще и то, что авторы этой книги создали блог, где кроме исходных тестов, используемых в книге можно пройти небольшой тест на знание языка.

Вот исходники по главам книги, доступные для скачивания:

Chapter 3: Properties, Methods, and Events (176.9 KB)
Chapter 4: The Display List (209.9 KB)
Chapter 5: Timeline Control (210.3 KB)
Chapter 6: OOP (132.1 KB)
Chapter 7: Motion (702.9 KB)
Chapter 8: Drawing with Vectors (147.7 KB)
Chapter 9: Drawing with Bitmaps (2.2 MB)
Chapter 10: Text (172.2 KB)
Chapter 11: Sound (921.6 KB)
Chapter 12: Video (10.8 MB)
Chapter 13: Loading Assets (2.3 MB)
Chapter 14: XML and E4X (1 MB)
Chapter 15: Programming Design and Resources (5.7 KB)

Categories: Новости Tags:

Оперирование визуализацией произвольных 3D поверхностей

14 марта 2008 2 комментария

В продолжение предыдущей публикации, я попробовал расширить наглядность примера. Для этого я создал новый 3D-объект, который представляет собой набор из 11 параметрических поверхностей (взято из туториала "A Demonstration of Customizable Features of Our 3D Surfaces") :

Класс Surfaces:

package lib3d {
	import lib3d.Object3D;

	/**
	 * @author Michael
	 */
	public class Surfaces extends Object3D {
		private var _exampleNum : int = 1;

		public function set exampleNum(n : Number) : void {
			_exampleNum = n;
			setTilesArray();
		}

		public function get exampleNum() : Number {
			return _exampleNum ;
		}

		private const cubeSize : Number = 100;

		public function Surfaces() {
			super();
		}

		override public function setTilesArray() : void {
			var i : int;
			var j : int;
			var istep : Number;
			var jstep : Number;
			var tmin : Number;
			var tmax : Number;
			var smin : Number;
			var smax : Number;
			var curt : Number;
			var curs : Number;

			tmin = 0;
			smin = 0;

			switch (_exampleNum) {
				case 1:
					tmax = Math.PI;
					smax = 7 / 4 * Math.PI;
					break;
				case 2:
					tmax = 2 * Math.PI;
					smax = 2 * Math.PI;
					break;
				case 3:
					tmax = 1.5 * Math.PI;
					smax = 2 * Math.PI;
					break;

				case 4:
					tmax = Math.PI;
					smax = 1.5 * Math.PI;
					break;

				case 5:
					tmax = Math.PI;
					smax = 2 * Math.PI;
					break;

				case 6:
					tmax = Math.PI;
					smax = 1.5 * Math.PI;
					break;

				case 7:
					tmax = 1;
					smax = 2 * Math.PI;
					break;

				case 8:
					tmax = 1.5 * Math.PI;
					smax = 2 * Math.PI;
					break;

				case 9:
					tmax = 1.5 * Math.PI;
					smax = 2 * Math.PI;
					break;

				case 10:
					tmax = Math.PI;
					smax = 2 * Math.PI;
					break;

				case 11:
					tmax = Math.PI;
					smax = 3 * Math.PI;
					break;
			}
			istep = (smax - smin) / nMesh;
			jstep = (tmax - tmin) / nMesh;
			tilesArray = new Array();
			for(i = 0;i <= nMesh; i++) {
				curs = istep * i + smin;
				tilesArray[i] = new Array();
				for(j = 0;j <= nMesh;j++) {
					curt = jstep * j + tmin;
					switch (_exampleNum) {
						case 1:
							tilesArray[i][j] = [cubeSize * Math.cos(curs) * Math.sin(curt),cubeSize * Math.sin(curs) * Math.sin(curt),cubeSize * Math.cos(curt)];
							break;
						case 2:
							tilesArray[i][j] = [cubeSize / 4.4 * (curt) * Math.cos(curs + Math.PI) * Math.sin(Math.cos(curt)),cubeSize / 4.4 * (curt) * Math.sin(curs + Math.PI) * Math.sin(Math.cos(curt)),cubeSize / 3.7 * (curt) * Math.cos(Math.cos(curt)) - 0.8 * cubeSize];
							break;
						case 3:
							tilesArray[i][j] = [cubeSize / 4.3 * Math.cos(curs) * (2 + Math.cos(curt) * 2),cubeSize / 4.3 * Math.sin(curs) * (2 + Math.cos(curt) * 2),cubeSize / 2.6 * (3 - curt) - 0.3 * cubeSize];
							break;

						case 4:
							tilesArray[i][j] = [cubeSize / 1.6 * Math.sqrt(curt) * Math.sin(2 * curt) * Math.cos(curs - Math.PI),cubeSize / 1.6 * Math.sqrt(curt) * Math.sin(2 * curt) * Math.sin(curs - Math.PI),cubeSize / 1.6 * Math.sqrt(curt) * Math.cos(2 * curt) - 0.15 * cubeSize];
							break;

						case 5:
							tilesArray[i][j] = [cubeSize / 3.5 * Math.cos(curs) * (Math.cos(4 * curt) + 2),cubeSize / 3.5 * Math.sin(curs) * (Math.cos(4 * curt) + 2),cubeSize / 2 * curt - 0.8 * cubeSize];
							break;

						case 6:
							tilesArray[i][j] = [3.2 * cubeSize * Math.sin(curt) * Math.cos(Math.PI / 2 * Math.sin(curt) * Math.cos(curs)) / 2 * Math.sin(curt) * Math.cos(curs),2.2 * cubeSize * Math.sin(curt) * Math.cos(Math.PI / 2 * Math.sin(curt) * Math.cos(curs)) / 2 * Math.sin(curt) * Math.sin(curs),2.2 * cubeSize * Math.sin(curt) * Math.cos(Math.PI / 2 * Math.sin(curt) * Math.cos(curs)) / 2 * Math.cos(curt)];
							break;

						case 7:
							tilesArray[i][j] = [cubeSize / 2.4 * (2 * Math.cos(curs) + (curt - 0.5) * Math.cos(curs / 2)),cubeSize / 2.4 * (2 * Math.sin(curs) + (curt - 0.5) * Math.cos(curs / 2)),cubeSize / 2.4 * 4 * (curt - 0.5) * Math.sin(curs / 2) - 0.1 * cubeSize];
							break;

						case 8:
							tilesArray[i][j] = [cubeSize / 4.3 * (curt) * Math.cos(curs + Math.PI) * Math.sin(curt),cubeSize / 4.3 * (curt) * Math.sin(curs + Math.PI) * Math.sin(curt),cubeSize / 4.3 * (curt) * Math.cos(curt)];
							break;

						case 9:
							tilesArray[i][j] = [cubeSize / 2.8 * (curt) * Math.cos(curs + Math.PI) * Math.sin(Math.cos(curt)),cubeSize / 2.8 * (curt) * Math.sin(curs + Math.PI) * Math.sin(Math.cos(curt)),cubeSize / 2.8 * (curt) * Math.cos(Math.cos(curt)) - cubeSize];
							break;

						case 10:
							tilesArray[i][j] = [cubeSize / 1.15 * Math.cos(curs) * Math.sin(2 * curt),cubeSize / 1.15 * Math.sin(curs) * Math.sin(2 * curt),cubeSize / 1.15 * Math.cos(curt)];
							break;

						case 11:
							tilesArray[i][j] = [cubeSize / 2.7 * Math.pow(4 / 3, curs - 5) * Math.sin(curt) * Math.sin(curt) * Math.cos(curs - 5),cubeSize / 2.7 * Math.pow(4 / 3, curs - 5) * Math.sin(curt) * Math.sin(curt) * Math.sin(curs - 5) + 0.2 * cubeSize,cubeSize / 2.7 * Math.pow(4 / 3, curs - 5) * Math.sin(curt) * Math.cos(curt) - 0.2 * cubeSize];
							break;
					}
				}
			}
		}
	}
}

Небольшие изменения для управления альфа-каналом пришлось сделать в классе View3D. Попробуйте сами его "доработать лобзиком" 🙂 Ну а нетерпеливые могут скачать архив.