Архив

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

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

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

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

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

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

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

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

  1. package {
  2.  
  3. public class Fruit {
  4.  
  5. public static const Apple:Fruit=new Fruit(0);
  6. public static const Pear:Fruit=new Fruit(1);
  7. public static const Peach:Fruit=new Fruit(2);
  8.  
  9. private var _value:int;
  10.  
  11. public function Fruit(value:int) {
  12. _value=value;
  13. }
  14.  
  15. public function get value():int {
  16. return _value;
  17. }
  18. }
  19. }

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

  1. package {
  2.  
  3. public class Vegetable {
  4. public static const Tomato:int=0;
  5. public static const Onions:int=1;
  6. public static const Cucumber:int=2;
  7. }
  8. }

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

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

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

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

  1. public var faces:Array; . . .
  2.  
  3. public function ReorderChildren()
  4. {
  5. for(var i:uint = 0; i < 6; i++)
  6. {
  7. faces[i].z = faces[i].child.transform.getRelativeMatrix3D(root).position.z;
  8. this.removeChild(faces[i].child);
  9. }
  10. faces.sortOn("z", Array.NUMERIC | Array.DESCENDING);
  11. for (i = 0; i < 6; i++)
  12. {
  13. this.addChild(faces[i].child);
  14. }
  15. }

Для ознакомления с другими возможностями 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 приложения.

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

  1. i = x < 0 ? -x : x;

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

  1. 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:

  1. package lib3d {
  2. import lib3d.Object3D;
  3.  
  4. /**
  5. * @author Michael
  6. */
  7. public class Surfaces extends Object3D {
  8. private var _exampleNum : int = 1;
  9.  
  10. public function set exampleNum(n : Number) : void {
  11. _exampleNum = n;
  12. setTilesArray();
  13. }
  14.  
  15. public function get exampleNum() : Number {
  16. return _exampleNum ;
  17. }
  18.  
  19. private const cubeSize : Number = 100;
  20.  
  21. public function Surfaces() {
  22. super();
  23. }
  24.  
  25. override public function setTilesArray() : void {
  26. var i : int;
  27. var j : int;
  28. var istep : Number;
  29. var jstep : Number;
  30. var tmin : Number;
  31. var tmax : Number;
  32. var smin : Number;
  33. var smax : Number;
  34. var curt : Number;
  35. var curs : Number;
  36.  
  37. tmin = 0;
  38. smin = 0;
  39.  
  40. switch (_exampleNum) {
  41. case 1:
  42. tmax = Math.PI;
  43. smax = 7 / 4 * Math.PI;
  44. break;
  45. case 2:
  46. tmax = 2 * Math.PI;
  47. smax = 2 * Math.PI;
  48. break;
  49. case 3:
  50. tmax = 1.5 * Math.PI;
  51. smax = 2 * Math.PI;
  52. break;
  53.  
  54. case 4:
  55. tmax = Math.PI;
  56. smax = 1.5 * Math.PI;
  57. break;
  58.  
  59. case 5:
  60. tmax = Math.PI;
  61. smax = 2 * Math.PI;
  62. break;
  63.  
  64. case 6:
  65. tmax = Math.PI;
  66. smax = 1.5 * Math.PI;
  67. break;
  68.  
  69. case 7:
  70. tmax = 1;
  71. smax = 2 * Math.PI;
  72. break;
  73.  
  74. case 8:
  75. tmax = 1.5 * Math.PI;
  76. smax = 2 * Math.PI;
  77. break;
  78.  
  79. case 9:
  80. tmax = 1.5 * Math.PI;
  81. smax = 2 * Math.PI;
  82. break;
  83.  
  84. case 10:
  85. tmax = Math.PI;
  86. smax = 2 * Math.PI;
  87. break;
  88.  
  89. case 11:
  90. tmax = Math.PI;
  91. smax = 3 * Math.PI;
  92. break;
  93. }
  94. istep = (smax - smin) / nMesh;
  95. jstep = (tmax - tmin) / nMesh;
  96. tilesArray = new Array();
  97. for(i = 0;i <= nMesh; i++) {
  98. curs = istep * i + smin;
  99. tilesArray[i] = new Array();
  100. for(j = 0;j <= nMesh;j++) {
  101. curt = jstep * j + tmin;
  102. switch (_exampleNum) {
  103. case 1:
  104. tilesArray[i][j] = [cubeSize * Math.cos(curs) * Math.sin(curt),cubeSize * Math.sin(curs) * Math.sin(curt),cubeSize * Math.cos(curt)];
  105. break;
  106. case 2:
  107. 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];
  108. break;
  109. case 3:
  110. 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];
  111. break;
  112.  
  113. case 4:
  114. 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];
  115. break;
  116.  
  117. case 5:
  118. 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];
  119. break;
  120.  
  121. case 6:
  122. 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)];
  123. break;
  124.  
  125. case 7:
  126. 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];
  127. break;
  128.  
  129. case 8:
  130. 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)];
  131. break;
  132.  
  133. case 9:
  134. 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];
  135. break;
  136.  
  137. case 10:
  138. 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)];
  139. break;
  140.  
  141. case 11:
  142. 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];
  143. break;
  144. }
  145. }
  146. }
  147. }
  148. }
  149. }

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