Advertisement
terorama

Flash / Examples 6

Apr 1st, 2013
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //-----------------------------------------------------------
  2. //-----------------------------------------------------------
  3. //-----------------------------------------------------------
  4. //-----------------------------------------------------------
  5.  
  6.  
  7. const particleContainer_bolt:Sprite = new Sprite();
  8. addChild(particleContainer_bolt);
  9.  
  10.  
  11. function Bolt():void {
  12.     stage.addEventListener(Event.ENTER_FRAME, Particles_bolt);
  13.     var mcParticle_bolt:Boltmc=new Boltmc();
  14.     particleContainer_bolt.addChild(mcParticle_bolt);
  15.  
  16.     function Particles_bolt(event:Event):void {
  17.         if (Math.random()*10<0.5) {
  18.             mcParticle_bolt.x=Math.random()*stage.stageWidth;
  19.             mcParticle_bolt.y=200;
  20.             mcParticle_bolt.scaleX=Math.random()*1;
  21.             mcParticle_bolt.scaleY=mcParticle_bolt.scaleX;
  22.         }
  23.     }
  24. }
  25. Bolt();
  26.  
  27. //-----------------------------------------------------------
  28. //-----------------------------------------------------------
  29. //-----------------------------------------------------------
  30. //-----------------------------------------------------------
  31.  
  32.  
  33. //Запускаем таймер. Таймер вызывает функцию timerHandler каждые 0.2 секунды.
  34. var timer:Timer = new Timer(200, 0);
  35. timer.addEventListener (TimerEvent.TIMER, timerHandler);
  36. timer.start ();
  37.  
  38. //Находим центр сцены
  39. var centerX:Number = stage.stageWidth / 2;
  40. var centerY:Number = stage.stageHeight / 2;
  41.  
  42. //Описываем функцию, вызываемую таймером
  43. function timerHandler (e:Event):void {
  44.  
  45.     //Создаем новый квадрат
  46.     var newRectangle:MyRectangle = new MyRectangle();
  47.  
  48.     //Устанавливаем для квадрата координаты равные координатам мыши
  49.     newRectangle.x = mouseX;
  50.     newRectangle.y = mouseY;
  51.  
  52.     //Высчитываем положение квадрата по х и у от центра сцены
  53.     var dx:Number = newRectangle.x - centerX;
  54.     var dy:Number = newRectangle.y - centerY;
  55.  
  56.     //Высчитываем расстояние от квадрата до центра сцены с помощью теоремы Пифагора
  57.     newRectangle.radius = Math.sqrt(dx*dx + dy*dy);
  58.  
  59.     //Высчитываем угол квадрата относительно центра сцеы
  60.     newRectangle.myAngle = Math.atan2(dy, dx);
  61.  
  62.     //Устанавливаем скорость поворота
  63.     newRectangle.speed = 0.06;
  64.  
  65.     //Сначала квадрат должен быть прозрачный
  66.     newRectangle.alpha = 0;
  67.  
  68.     //Устанавливаем случайные размеры квадрата
  69.     newRectangle.scaleX = Math.random() + 1.5;
  70.     newRectangle.scaleY = newRectangle.scaleX;
  71.  
  72. //Получаем доступ к смене цвета квадрата с помощью ColorTransform 
  73. var colorInfo:ColorTransform = newRectangle.transform.colorTransform;
  74.  
  75.     // Устанавливаем случайный цветобъекта ColorTransform
  76.     colorInfo.color = 0xffffff * Math.random();
  77.  
  78.     //Даем получившийся цвет квадрату
  79.     newRectangle.transform.colorTransform = colorInfo;
  80.  
  81.     //Добавляем квадрат на сцену
  82.     addChild (newRectangle);
  83.  
  84.     //Добавляем функцию  ENTER_FRAME для анимации вращения
  85.     newRectangle.addEventListener (Event.ENTER_FRAME, moveRectangle);
  86. }
  87.  
  88. //Эта функция вращает квадраты
  89. function moveRectangle (e:Event):void {
  90.  
  91.     //Берем квадрат как цель действий
  92.     var rectangle:MovieClip = e.target as MovieClip;
  93.  
  94.     //Высчитываем новые х и у позиции для квадрата
  95.     var newX:Number = centerX + Math.cos(rectangle.myAngle) * rectangle.radius;
  96.     var newY:Number = centerY + Math.sin(rectangle.myAngle) * rectangle.radius;
  97.  
  98.     //Увеличиваем угол в следующем кадре
  99.     rectangle.myAngle += rectangle.speed;
  100.  
  101.     //Задаем новую позицию
  102.     rectangle.x = newX;
  103.     rectangle.y = newY;
  104.  
  105.     //Уменьшаем радиус, то бы получить спиральную анимацию
  106.     rectangle.radius -= 0.6;
  107.  
  108.     //Уменьшаем размер
  109.     rectangle.scaleX -= rectangle.radius * 0.0001;
  110.     rectangle.scaleY -= rectangle.radius * 0.0001;
  111.  
  112.     //Увеличиваем непрозрачность, если она меньше 1 и радиус больше 50
  113.     if (rectangle.alpha < 1 && rectangle.radius > 50) {
  114.         rectangle.alpha += 0.05;
  115.     }
  116.     //Увеличиваем прозрачность если радиус меньше 50
  117.     if (rectangle.radius < 50) {
  118.         rectangle.alpha -= 0.005;
  119.     }
  120.  
  121.     //Если радиус меньше 0 удаляем квадрат
  122.     if (rectangle.radius < 0) {
  123.         rectangle.removeEventListener (Event.ENTER_FRAME, moveRectangle);
  124.         removeChild (rectangle);
  125.     }
  126. }
  127.  
  128. //-----------------------------------------------------------
  129. //-----------------------------------------------------------
  130. //-----------------------------------------------------------
  131. //-----------------------------------------------------------
  132.  
  133.  
  134. package {
  135.     import flash.display.Sprite;
  136.     import flash.utils.Timer;
  137.     import flash.events.TimerEvent;
  138.  
  139.     public class Fireworks extends Sprite {
  140.         //Таймер, который каждые пол секунды будет создавать фейерверк
  141.         private var _timer:Timer = new Timer(500,2000);
  142.  
  143.         public function Fireworks() {
  144.             _timer.addEventListener(TimerEvent.TIMER, createFirework);
  145.             _timer.start();
  146.         }
  147.  
  148.         private function createFirework(event:TimerEvent):void {
  149.             //Создаем экземпляр фейерверка и задаем ему нужные координаты
  150.             var firework:Firework = new Firework();
  151.             firework.y = 220;
  152.             firework.x = Math.random() * stage.stageWidth;
  153.             addChild(firework);
  154.         }
  155.     }
  156. }
  157.  
  158.  
  159. package {
  160.     import flash.utils.Timer;
  161.     import flash.events.TimerEvent;
  162.     import flash.display.Sprite;
  163.     import flash.events.Event;
  164.  
  165.     public class Firework extends Sprite {
  166.         //Скорость фейерверка по оси Y
  167.         private var _speedY:Number = 0;
  168.         private var _timer:Timer = null;
  169.  
  170.         public function Firework() {
  171.             _speedY = (-1) * Math.random() * 1 - 1;
  172.             //Рисуем - белый круг
  173.             this.graphics.beginFill(0xFFFFFF);
  174.             this.graphics.drawCircle(0, 0, 2);
  175.             this.graphics.endFill();
  176.             launch();
  177.         }
  178.  
  179.         //Запускает анимацию
  180.         private function launch():void {
  181.             this.addEventListener(Event.ENTER_FRAME, update);
  182.             //Создаем таймер на 2 секунды
  183.             _timer = new Timer(2000,1);
  184.             _timer.start();
  185.             _timer.addEventListener(TimerEvent.TIMER_COMPLETE, explode);
  186.         }
  187.  
  188.         //Движет белый круг вверх по оси Y
  189.         private function update(event:Event):void {
  190.             this.y +=  _speedY;
  191.         }
  192.  
  193.         //Создает анимацию взрыва
  194.         private function explode(event:TimerEvent):void {
  195.             removeEventListener(Event.ENTER_FRAME, update);
  196.             var explosion:Explosion = new Explosion();
  197.             explosion.x = this.x;
  198.             explosion.y = this.y;
  199.             stage.addChild(explosion);
  200.             this.visible = false;
  201.         }
  202.     }
  203. }
  204.  
  205.  
  206. package {
  207.  
  208.     import flash.utils.Timer;
  209.     import flash.events.TimerEvent;
  210.     import flash.display.Sprite;
  211.     import flash.events.*;
  212.     import fl.motion.Color;
  213.     import flash.geom.ColorTransform;
  214.  
  215.     public class Explosion extends Sprite {
  216.         //Массив, в котором будут хранится частицы данного взрыва
  217.         private var _particles:Array = null;
  218.         //Переменная, хранящая число частиц
  219.         private var _number:uint = 0;
  220.  
  221.         public function Explosion() {
  222.             //Создаем новый массив
  223.             _particles = [];
  224.             //Задаем число частиц
  225.             _number = Math.floor(Math.random() * 30) + 10;
  226.             //Задаем цвет
  227.             var ct:Color = new Color();
  228.             ct.setTint(0xFFFFFF * Math.random(),1);
  229.             //Задаем масштаб
  230.             var scale:Number = Math.random();
  231.             //Вычисляем углы
  232.             var angleDifference:Number = 360 / _number;
  233.             var angle = 0;
  234.             //Цикл, в котором создается каждая частица взрыва
  235.             for (var i = 0; i < _number; i++) {
  236.                 var particle:Particle = new Particle();
  237.                 //Задаем скорость
  238.                 particle._speedY = Math.sin(angle * Math.PI / 180) * 3;
  239.                 particle._speedX = Math.cos(angle * Math.PI / 180) * 3;
  240.                 //Применяем масштаб к частице, изменяя ее размер
  241.                 particle.scaleX = scale;
  242.                 particle.scaleY = scale;
  243.                 _particles.push(particle);
  244.                 //Применяем цвет;
  245.                 particle.transform.colorTransform = ct;
  246.                 addChild(particle);
  247.                 //Обновляем угол для следующей частицы
  248.                 angle +=  angleDifference;
  249.             }
  250.             addEventListener(Event.ENTER_FRAME, update);
  251.         }
  252.  
  253.         //Обновляет положение и вид частиц в каждом кадре
  254.         private function update(event:Event):void {
  255.             for (var i = 0; i < _particles.length; i++) {
  256.                 var particle:Particle = _particles[i];
  257.                 particle.y +=  particle._speedY;
  258.                 particle.x +=  particle._speedX;
  259.                 particle.alpha -=  0.02;
  260.                 //если прозрачность частицы меньше -0.1 - удаляем ее
  261.                 if (particle.alpha < -0.1) {
  262.                     removeEventListener(Event.ENTER_FRAME, update);
  263.                     removeChild(particle);
  264.                     particle.clear();
  265.                     particle = null;
  266.                 }
  267.             }
  268.         }
  269.     }
  270. }
  271.  
  272.  
  273. package {
  274.     import flash.display.Shape;
  275.  
  276.     public class Particle extends Shape {
  277.         //Переменные, отвечающие за скорость частицы
  278.         public var _speedY:Number = 0;
  279.         public var _speedX:Number = 0;
  280.  
  281.         public function Particle() {
  282.             //В конструкторе рисуем изображение частицы
  283.             this.graphics.beginFill(0xFFFFFF);
  284.             this.graphics.drawCircle(0,0,4);
  285.             this.graphics.endFill();
  286.         }
  287.  
  288.         //Очищает изображение частицы и "обнуляет" ее параметры
  289.         public function clear():void {
  290.             this.graphics.clear();
  291.             _speedY = NaN;
  292.             _speedX = NaN;
  293.         }
  294.     }
  295. }
  296.  
  297. //-----------------------------------------------------------
  298. //-----------------------------------------------------------
  299. //-----------------------------------------------------------
  300. //-----------------------------------------------------------
  301.  
  302.  
  303. Mouse.hide();//прячем курсор
  304. var a:Number;//катет
  305. var b:Number;//катет
  306. var c:Number;// гипотенуза
  307. var lightPower:Number=5;//сила света
  308. var lightArea:Number=30;//территория света
  309. stage.addEventListener(MouseEvent.MOUSE_MOVE, shadowMove);
  310.  
  311. function shadowMove(e:MouseEvent):void {
  312.                 light.x=mouseX; //устанавливаем координату Х источника света равной Х координате мыщи
  313.                 light.y=mouseY;//тот же процесс, только с координатой Y
  314.                 // $$$ Находим координаты тени, противоположные коордиатам мыщи, относительно text_mc
  315.                 shadow_mc.y = text_mc.y-(mouseY-text_mc.y)/lightPower;
  316.                 shadow_mc.x = text_mc.x-(mouseX-text_mc.x)/lightPower;
  317.                 //$$$
  318. //Геометричесие расчеты
  319.                 b=text_mc.x-mouseX;//Находим кактет b
  320.                 a=text_mc.y-mouseY;//Находим какте a
  321.                 c= Math.sqrt((A*A)+(B*B));//Находим гипотенузу c
  322.                 shadow_mc.alpha =(lightArea/C);//Устанавливаем прозрачность тени, в зависимости от положения мыши
  323. //Обновляем после каждого движения мыши
  324.                 e.updateAfterEvent();
  325. }
  326.  
  327. //-----------------------------------------------------------
  328. //-----------------------------------------------------------
  329. //-----------------------------------------------------------
  330. //-----------------------------------------------------------
  331.  
  332. particle._visible = false;
  333. for (z = 0; z < 200; z++) {
  334. var dupe = particle.duplicateMovieClip("s" + z, z);
  335. dupe._x = Math.random() * 550; dupe._y = Math.random() * 200;
  336. dupe._xscale = dupe._yscale = Math.random() * 50 + 50;
  337. dupe._rotation = Math.random() * 360;
  338. dupe._alpha = Math.random() * 100;
  339. dupe.gotoAndStop(int(Math.random() * dupe._totalframes + 1));
  340. }
  341.  
  342. //-----------------------------------------------------------
  343. //-----------------------------------------------------------
  344. //-----------------------------------------------------------
  345. //-----------------------------------------------------------
  346.  
  347.  
  348. <site>
  349. <links>
  350. <link name="Home"/>
  351. <link name="Works"/>
  352. <link name="About"/>
  353. <link name="Contact"/>
  354. </links>
  355. </site>
  356.  
  357.  
  358. //Импорт необходимых классов.
  359. import fl.transitions.Tween;
  360. import fl.transitions.easing.*;
  361.  
  362. //Путь до XML файла.
  363. //Вы можете прописать любой путь.
  364. var xmlPath:String = "menu.xml";
  365.  
  366. //Данные из XML будут помещены в эту переменную после загрузки.
  367. var settingsXML:XML;
  368.  
  369. //Массив для твин анимаций нужен для того,
  370. //чтобы сборщик мусора не удалял анимации в самое неподходящее время.
  371. var tweensArray:Array = new Array();
  372. //Твин анимации кнопки.
  373. var buttonTween:Tween;
  374.  
  375. // Загружаем XML файл
  376. var loader = new URLLoader();
  377. loader.addEventListener(Event.COMPLETE, xmlLoaded);
  378. loader.load(new URLRequest(xmlPath));
  379.  
  380.  
  381. //Эта функция вызывается, когда XML файл загружен.
  382. function xmlLoaded(e:Event):void
  383. {
  384.  //Проверяем, не равен ли наш загружчик null.
  385.  if ((e.target as URLLoader) != null )
  386.  {
  387.  //Помещаем данные XML файла в переменную.
  388.  settingsXML = new XML(loader.data);
  389.  settingsXML.ignoreWhitespace = true;
  390.  //Вызываем функцию создания меню.
  391.  createMenu();
  392.  }
  393. }
  394.  
  395.  
  396. function createMenu():void
  397. {
  398.  //Локальная переменная для экземпляра класса MenuItem.
  399.  var menuItem:MenuItem;
  400.  //Счетчик.
  401.  var i:uint = 0;
  402.  
  403.  //Цикл по пунктам links, найденых в XML файле.
  404.  for each (var link:XML in settingsXML.links.link)
  405.  {
  406.  
  407.  menuItem = new MenuItem();
  408.  
  409.  //Вставка названия кнопки меню. (link.@name читает атребут "name" в элементе link)
  410.  menuItem.menuLabel.text = link. @ name;
  411.  
  412.  //Если текст больше, чем текстовое поле, то выравниваем размер.
  413.  menuItem.menuLabel.autoSize = TextFieldAutoSize.LEFT;
  414.  
  415.  //Помещаем кнопку меню на сцену.
  416.  menuItem.x = 20;
  417.  menuItem.y = 30 + i * 40;
  418.  
  419.  //Активируем крсор над кнопкой. Отключаем у текстового поля кнопки реакцию на мышь.
  420.  menuItem.buttonMode = true;
  421.  menuItem.mouseChildren = false;
  422.  
  423.  //Назначаем слушатели событий.
  424.  menuItem.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
  425.  menuItem.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
  426.  
  427.  addChild(menuItem);
  428.  
  429.  //Считаем количество кнопок.
  430.  i++;
  431.  }
  432. }
  433.  
  434. //-----------------------------------------------------------
  435. //-----------------------------------------------------------
  436. //-----------------------------------------------------------
  437. //-----------------------------------------------------------
  438.  
  439.  
  440. /*
  441. Главный класс Main.as.
  442.  
  443. Создает таймер и по таймеру создает пузырьки в координатах, зависимых от положения мыши.
  444. */
  445.  
  446. package
  447. {
  448.  //Импорты необходимых классов.
  449.  import flash.display.Sprite;
  450.  import flash.utils.Timer;
  451.  import flash.events.TimerEvent;
  452.  
  453.  public class Main extends Sprite
  454.  {
  455.  //Переменная для таймера.
  456.  private var timer:Timer;
  457.  
  458.  //Конструктор главного класса.
  459.  public function Main()
  460.  {
  461.  //Создаем экземпляр класса Таймер.
  462.  timer = new Timer(50, 0);
  463.  //Назначаем слушатель события тика таймера.
  464.  timer.addEventListener(TimerEvent.TIMER, InTimer);
  465.  //Запускаем таймер.
  466.  timer.start();
  467.  }
  468.  
  469.  //Функция, которая срабатывает по тику таймера.
  470.  private function InTimer(e:TimerEvent):void
  471.  {
  472.  //Создаем пузырек.
  473.  var c:Circle = new Circle(stage);
  474.  }
  475.  }
  476. }
  477.  
  478.  
  479. /*
  480. Класс пузырька.
  481.  
  482. Класс рисует пузырек, добавляет его в список отображения и удаляет по событию.
  483. */
  484.  
  485. package
  486. {
  487.  //Необходимые импорты.
  488.  import flash.display.Sprite;
  489.  import flash.display.Stage;
  490.  import flash.display.GradientType;
  491.  import flash.geom.Matrix;
  492.  import flash.filters.BlurFilter;
  493.  import fl.transitions.Tween;
  494.  import fl.transitions.easing.Strong;
  495.  import fl.transitions.TweenEvent;
  496.  
  497.  public class Circle extends Sprite
  498.  {
  499.  //Контейнер Stage, к которому в список отображения будут добавляться пузырек.
  500.  private var container:Stage;
  501.  //Переменные для будущих твин анимаций.
  502.  private var scaleXTween:Tween;
  503.  private var scaleYTween:Tween;
  504.  private var gravityTween:Tween;
  505.  //Константа разброса пузырьков.
  506.  private const delay:uint = 50;
  507.  
  508.  //Конструктор.
  509.  public function Circle(c:Stage)
  510.  {
  511.  //Кладем в переменную контейнера переданый stage.
  512.  container = c;
  513.  //Добавляем пузырек в список отображения.
  514.  container.addChild(this);
  515.  //Создаем пузырек.
  516.  CreateCircle();
  517.  }
  518.  
  519.  private function CreateCircle():void
  520.  {
  521.  //Задаем фильтр размытия для красоты. :)
  522.  var blur:BlurFilter = new BlurFilter(1.5,1.5,3);
  523.  //Задаем рандомный цвет пузырька в диапазоне от синего до зеленого.
  524.  var color:uint = Math.random() * 0x0000ff + 0x00ff00;
  525.  //Задаем радиус пузырька.
  526.  var radius:Number = Math.random() * 10 + 10;
  527.  //Задаем матрицу для последующей заливки градиентом.
  528.  var matrix:Matrix = new Matrix();
  529.  //Преобразуем матрицу в соответстующий необходимый вид.
  530.  matrix.createGradientBox(2 * radius, 2 * radius, 0, (- radius - radius/2), (- radius - radius/2));
  531.  
  532.  /*
  533.  Рисуем пузырек
  534.  */
  535.  //Задаем градиентный фон заливки.
  536.  this.graphics.beginGradientFill(GradientType.RADIAL,[0xffffff, color],[0.8, 0.3],[0, 200], matrix);
  537.  //Задаем стиль линий.
  538.  this.graphics.lineStyle(1, (color - 0x222222));
  539.  //Рисуем круг.
  540.  this.graphics.drawCircle(0,0,radius);
  541.  //Конец рисования.
  542.  this.graphics.endFill();
  543.  //Назначаем фильтр размытия.
  544.  this.filters = [blur];
  545.  
  546.  //Задаем координаты пузырька.
  547.  this.x = mouseX + Math.random() * delay - delay / 2;
  548.  this.y = mouseY + Math.random() * delay - delay / 2;
  549.  //Анимируем появление пузырька.
  550.  scaleXTween = new Tween(this,"scaleX",Strong.easeOut,0.5,1,1,true);
  551.  scaleYTween = new Tween(this,"scaleY",Strong.easeOut,0.5,1,1,true);
  552.  //Анимируем падение пузырька.
  553.  gravityTween = new Tween(this,"y",Strong.easeIn,this.y,this.y+480,7,true);
  554.  //Назначаем слушатель на событие завершения анимации падения.
  555.  gravityTween.addEventListener(TweenEvent.MOTION_FINISH, Delete);
  556.  }
  557.  
  558.  //Функция вызывается после завершения анимации падения пузырька и удаляет пузырек из списка отображения stage.
  559.  private function Delete(e:TweenEvent):void
  560.  {
  561.  container.removeChild(this);
  562.  /*
  563.  После удаления из списка отображения больше не остается ссылок на экземпляр класса. Поэтому сборщик мусора прекрасно удаляет этот экземпляр из памяти.
  564.  */
  565.  }
  566.  }
  567. }
  568.  
  569. //-----------------------------------------------------------
  570. //-----------------------------------------------------------
  571. //-----------------------------------------------------------
  572. //-----------------------------------------------------------
  573.  
  574.  
  575. /*
  576. Это главный класс. Его имя должно быть прописано в свойствах *.fla файла.
  577. Класс добавляет на сцену некоторе количество бочек.
  578. По клику по одной из бочек можно запустить цепную реакцию.
  579. Для перезарядки бочек можно нажать пробел.
  580. */
  581.  
  582. package
  583. {
  584. //Импорт необходимых классов.
  585. import flash.display.MovieClip;
  586. import flash.events.Event;
  587. import flash.events.KeyboardEvent;
  588. import flash.media.Sound;
  589.  
  590. public class Main extends MovieClip
  591. {
  592. //Массив, в котором будут храниться бочки.
  593. private var bochkaArray:Array = [];
  594. //Массив, в котором будут храниться осколки.
  595. private var splintersArray:Array = [];
  596. //Количество выставляемых бочек.
  597. private var numberOfBochka:uint = 15;
  598. //Звук взрыва из библиотеки.
  599. private var explosionSound:Sound = new ExplosionSound();
  600.  
  601. //Конструктор.
  602. public function Main()
  603.  
  604.  
  605. {
  606. //Расставляем несколько бочек на сцене.
  607. CreateFildOfBochka(numberOfBochka);
  608. //Назначаем слушатель события смены кадра.
  609. stage.addEventListener(Event.ENTER_FRAME, Update);
  610. //Назначаем слушатель события на нажатие клавиш.
  611. stage.addEventListener(KeyboardEvent.KEY_DOWN, Reload);
  612. }
  613.  
  614. //Функция проигрывания звука взрыва.
  615. public function PlayExplosionSound():void
  616. {
  617. //Запускаем звук взрыва.
  618. explosionSound.play();
  619. }
  620.  
  621. //Функция создания нескольких бочек на сцене.
  622. private function CreateFildOfBochka(numberOfBochka:uint):void
  623. {
  624. //Цикл.
  625. for (var i:uint = 0; i < numberOfBochka; i++)
  626. {
  627. //Создаем экземпляр бочки.
  628. var bochka:Bochka = new Bochka(stage,this);
  629. //Добавляем в массив бочек.
  630. bochkaArray.push(bochka);
  631. }
  632. }
  633.  
  634. //Функция добавления новых бочек. Функция срабатывает, когда нажимается какая-либо клавиша.
  635. private function Reload(e:KeyboardEvent):void
  636. {
  637. //Узнаем, какая клавиша была нажата.
  638. switch (e.keyCode)
  639. {
  640. //Если нажата клавиша "ПРОБЕЛ".
  641. case 32 :
  642. //Цикл по массиву бочек.
  643. for (var j:uint = 0; j < bochkaArray.length; j++)
  644. {
  645. //Удаляем старые бочки.
  646. stage.removeChild(bochkaArray[j]);
  647. }
  648.  
  649. //Очищаем массив бочек.
  650. bochkaArray = [];
  651. //Создаем новые бочки.
  652. CreateFildOfBochka(numberOfBochka);
  653. //Завершение условия.
  654. break;
  655. }
  656. }
  657.  
  658. //Функция добавления в массив осколков нового осколка.
  659. public function PushNewSplinter(s:Splinter):void
  660. {
  661. //Добавляем в массив новый осколок.
  662. splintersArray.push(s);
  663. }
  664.  
  665. //Проверка попадания осколка в бочку.
  666. private function CheckColisions(s:Splinter):void
  667. {
  668. //Цикл по массиву бочек.
  669. for(var i:uint = 0; i < bochkaArray.length; i++)
  670. {
  671. //Помещаем бочку из массива в локальную переменную для удобства.
  672. var b:Bochka = bochkaArray[i];
  673. //Определяем расстояние от осколка до бочки.
  674. var distance:Number = Math.sqrt(Math.pow((s.x - b.x),2) + Math.pow((s.y - b.y),2));
  675.  
  676. //Если осколок от бочки на расстоянии меньше, чем половина высоты бочки, то рапускаем реакцию нагрева бочки.
  677. if(distance < b.height/2)
  678. {
  679. //Имитируем клик по бочке, так как функция клика у бочки как раз и запускает нагрев.
  680. b.Click();
  681. }
  682. //Если клип бочки доиграл анимацию взрыва, то удаляем бочку.
  683. if(b.currentLabel == "deleting")
  684. {
  685. //Удаляем из списка отображения.
  686. b.Delete();
  687. //Удаляем из массива.
  688. bochkaArray.splice(i,1);
  689. //По идее, ссылок на этот экземпляр класса бочки больше нет, поэтому сборщик мусора очистит память.
  690. }
  691. }
  692. }
  693.  
  694. //Эта функция запускается каждый кадр и обновляет необходимые данные.
  695. private function Update(e:Event):void
  696. {
  697. //Цикл по массиву осколков.
  698. for (var i:uint = 0; i < splintersArray.length; i++)
  699. {
  700. //Помещаем осколок из массива в локальную переменную для удобства.
  701. var s:Splinter = splintersArray[i];
  702. //Обновляем данные осколка (Анимируем его перемещение).
  703. s.Update();
  704. //Проверяем столкновение с бочками.
  705. CheckColisions(s);
  706. //Проверяем вылет за экран. Если осколок улетел за экран, то удаляем его.
  707. if (s.x < 0 || s.x > 640 || s.y < 0 || s.y > 480)
  708. {
  709. //Удаляем осколок из списка отображения.
  710. s.Delete();
  711. //Удаляем осколок из массива осколков.
  712. splintersArray.splice(i, 1);
  713. //По идее, ссылок на этот осколок больше нет. Поэтому сборщик мусора должен очистить память.
  714. }
  715. }
  716. //Выводим на экран количество бочек и осколков в данный момент.
  717.  //trace_txt.text = String(bochkaArray.length +" || "+ splintersArray.length);
  718. }
  719. }
  720. }
  721.  
  722.  
  723.  
  724. /*
  725. Класс бочки.
  726.  
  727. Бочка взрывается и создает осколки.
  728. */
  729.  
  730. package
  731. {
  732.  //Импорты необходимых классов.
  733.  import flash.display.MovieClip;
  734.  import flash.display.Stage;
  735.  import flash.events.MouseEvent;
  736.  import fl.transitions.Tween;
  737.  import fl.transitions.easing.Strong;
  738.  import fl.transitions.TweenEvent;
  739.  
  740.  public class Bochka extends MovieClip
  741.  {
  742.  /*
  743.  labels:
  744.  1 - "stay"
  745.  2 - "explosion"
  746.  14 - "deleting"
  747.  
  748.  movieclips:
  749.  bochkaHot_mc
  750.  */
  751.  
  752.  //Контейнер для stage.
  753.  private var container:Stage;
  754.  //Контейнер для главного класса.
  755.  private var main:Main;
  756.  //Количество осколков у бочки.
  757.  private var numberOfSplinters:uint = Math.floor(Math.random() * 6) + 10;
  758.  //Переменная для твинанимации нагревания бочки.
  759.  private var heatingTween:Tween;
  760.  //Время нагревания бочки в секундах.
  761.  private var timer:Number = 1;
  762.  //Флаг взрыва бочки.
  763.  private var inBoom:Boolean = false;
  764.  
  765.  //Конструктор.
  766.  public function Bochka(c:Stage, m:Main)
  767.  {
  768.  //Скрываем картинку нагретой бочки, которая будет позже плавно появляться и имитировать нагрев бочки.
  769.  bochkaHot_mc.alpha = 0;
  770.  //Добавляем главный класс в контейнер.
  771.  main = m;
  772.  //Добавляем stage в контейнер.
  773.  container = c;
  774.  //Добавляем бочку в список отображения.
  775.  container.addChild(this);
  776.  //Задаем рандомные бочки координаты на сцене.
  777.  this.x = (Math.random() * 590)+ 25;
  778.  this.y = (Math.random() * 410) + 60;
  779.  //Назначаем слушатель на событие клика по бочке.
  780.  this.addEventListener(MouseEvent.CLICK, Click);
  781.  }
  782.  
  783.  //Функция клика по бочке.
  784.  public function Click(e:MouseEvent = null):void
  785.  {
  786.  //Если бочка еще не взорвалась, то...
  787.  if (! inBoom)
  788.  {
  789.  //Помечаем, что бочка уже взорвана.
  790.  inBoom = true;
  791.  //Анимируем нагрев бочки.
  792.  heatingTween = new Tween(this.bochkaHot_mc,"alpha",Strong.easeOut,0,1,timer,true);
  793.  //Назначаем слушатель на событие завершения анимации нагрева бочки.
  794.  heatingTween.addEventListener(TweenEvent.MOTION_FINISH, Explosion);
  795.  //Удаляем слушатель на клик по бочке - он больше не нужен.
  796.  this.removeEventListener(MouseEvent.CLICK, Click);
  797.  }
  798.  }
  799.  
  800.  //Функция взрыва бочки после полного нагрева.
  801.  private function Explosion(e:TweenEvent):void
  802.  {
  803.  //Запускам звук взрыва.
  804.  main.PlayExplosionSound();
  805.  //Запускаем анимацию взрыва.
  806.  this.gotoAndPlay("explosion");
  807.  //Цикл по количеству осколков.
  808.  for (var i:uint = 0; i < numberOfSplinters; i++)
  809.  {
  810.  //Создаем новый осколок.
  811.  var splinter:Splinter = new Splinter(container,[this.x,this.y + 20]);
  812.  //Помешаем осколок в массив осколков в главном классе.
  813.  main.PushNewSplinter(splinter);
  814.  }
  815.  //Удаляем слушатель завершения анимации нагрева.
  816.  heatingTween.removeEventListener(TweenEvent.MOTION_FINISH, Explosion);
  817.  }
  818.  
  819.  //Функция удаления бочки из списка отображения контейнера stage.
  820.  public function Delete():void
  821.  {
  822.  container.removeChild(this);
  823.  }
  824.  }
  825. }
  826.  
  827.  
  828. /*
  829. Класс осколков.
  830. */
  831.  
  832. package
  833. {
  834.  //Импорт необходимых классов.
  835.  import flash.display.MovieClip;
  836.  import flash.display.Stage;
  837.  
  838.  public class Splinter extends MovieClip
  839.  {
  840.  //Контейнер для stage.
  841.  private var container:Stage;
  842.  //Скорость осколка по х и у.
  843.  private var speedXY:Array = [Math.random()*5 + 0.1,Math.random()*5 + 0.1];
  844.  
  845.  //Конструктор.
  846.  public function Splinter(c:Stage, coords:Array)
  847.  {
  848.  //Помешаем осколок в нужные координаты, которые берутся относительно конкретной бочки.
  849.  this.x = coords[0];
  850.  this.y = coords[1];
  851.  //Добавляем stage в контейнер.
  852.  container = c;
  853.  //Добавляем осколок в список отображения.
  854.  container.addChild(this);
  855.  
  856.  //Рандомно изменяем знак скорости по осям, чтобы осколки летели не только вправо и вниз, но и влево и вверх.
  857.  if(Math.random()*1 < 0.5)
  858.  {
  859.  speedXY[0] = -speedXY[0];
  860.  }
  861.  if(Math.random()*1 < 0.5)
  862.  {
  863.  speedXY[1] = -speedXY[1];
  864.  }
  865.  }
  866.  
  867.  //Функция удаления из списка отображения контейнера.
  868.  public function Delete():void
  869.  {
  870.  container.removeChild(this);
  871.  }
  872.  
  873.  //Функция одновления данных.
  874.  public function Update():void
  875.  {
  876.  //Анимируем перемещение осколка в зависимости от скоростей.
  877.  this.x += speedXY[0];
  878.  this.y += speedXY[1];
  879.  }
  880.  }
  881. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement