Главная > Анимация, Графика > Использование символов из библиотеки

Использование символов из библиотеки

Некоторые программисты напрочь отвергают использование Flash IDE за неудобный редактор кода, который на самом деле не очень подходит для написания больших приложений с использованием элементов пользовательского интерфейса (GUI).

Тем не менее рано или поздно каждому программисту приходится работать с SWF файлами ( с так называемым "дизайном", который так не любят программисты 🙂 ), которые были созданы именно во Flash CS3 IDE. И очень часто возникают трудности в работе с такими флэшками из-за их несовместимости с "правильным" кодом.

Итак. Постановка задачи: Нужно создать два символа фигур (квадрат и круг) в библиотеке и назначить им одинаковую модель поведения. То есть любой из этих символов, добавленный на сцену, должен при нажатии на них кнопкой мышки переместиться на передний план и "прилипнуть" к курсору. При отпускании мышки - "отлипнуть" от курсора. Короче говоря, когда посмотрите результат - поймете что я имел в виду 😀

Первое, что мы сделаем, это создадим класс, описывающий поведение наших фигур.

  1. package {
  2. import flash.display.MovieClip;
  3. import flash.events.Event;
  4. import flash.events.MouseEvent;
  5.  
  6. class Figure extends MovieClip {
  7. public function Figure() {
  8. addEventListener(MouseEvent.MOUSE_DOWN, StartDrag);
  9. addEventListener(MouseEvent.MOUSE_UP, StopDrag);
  10. }
  11. private function StartDrag(e:Event) {
  12. var trgt = e.target
  13. var mc_parent = trgt.parent
  14. mc_parent.removeChild(trgt)
  15. mc_parent.addChild(trgt)
  16. trgt.startDrag();
  17. }
  18. private function StopDrag(e:Event) {
  19. e.target.stopDrag();
  20. }
  21. }
  22. }

Разберемся по порядку

импортируем необходимые библиотеки:

  1. package {
  2. import flash.display.MovieClip;
  3. import flash.events.Event;
  4. import flash.events.MouseEvent;

Объявляем класс и инициирующий метод. При создании экземпляра класса к нему добавляются два слушателя событий, реагирующих на нажатие и отпускание левой кнопки мыши:

  1. class Figure extends MovieClip {
  2. public function Figure() {
  3. addEventListener(MouseEvent.MOUSE_DOWN, StartDrag);
  4. addEventListener(MouseEvent.MOUSE_UP, StopDrag);
  5. }

При нажатии левой кнопки мыши вызывается функция StartDrag (не путать с методом startDrag) в которой мувик удаляется со сцены, потом снова добавляется на нее (таким образом перемещается наверх) и включается startDrag()
При отпускании левой кнопки мыши вызывается функция StopDrag

  1. private function StartDrag(e:Event) {
  2. var trgt = e.target
  3. var mc_parent = trgt.parent
  4. mc_parent.removeChild(trgt)
  5. mc_parent.addChild(trgt)
  6. trgt.startDrag();
  7. }
  8. private function StopDrag(e:Event) {
  9. e.target.stopDrag();
  10. }
  11. }
  12. }

Теперь нужно создать два символа и присвоить им класс Figure в роли базового. Для этого рисуем на сцене круг, и превращаем его в символ нажатием клавиши [F8]

Теперь подобным же образом создаем квадрат.

Следующий шаг - создаем базовый класс мувика в котором берем символы из библиотеки и помещаем их на сцену:

  1. package {
  2. import flash.display.Sprite;
  3.  
  4. public class Main extends Sprite {
  5. public function Main() {
  6. var a:Square = new Square();
  7. var b:Circle = new Circle();
  8. addChild(a);
  9. addChild(b);
  10. }
  11. }
  12. }
  1. jut
    20 октября 2007 в 13:47 | #1

    Что делать, если конструктору класса Figure нужно передать параметры? И вообще здесь Display object экземпляры классов Square и Circle. Почему они ввели необходимость базового класса при связывании?

  2. 20 октября 2007 в 21:46 | #2

    Что делать, если конструктору класса Figure нужно передать параметры? И вообще здесь Display object экземпляры классов Square и Circle. Почему они ввели необходимость базового класса при связывании?

    1. Так как Square и Circle являются потомками класса Figure, то они наследуют все его методы. Следовательно, если есть необходимость передачи параметров, передавать их можно при создании экземпляров Square или Circle.

    2. По умолчанию базовым классом для связанных элементов библиотеки по понятным причинам является flash.display.MovieClip, но при необходимости есть возможность его переназначить (как в нашем случае)

  3. jut
    21 октября 2007 в 15:03 | #3

    Скажите, пожалуйста, что здесь неправильно. Ошибка: 1203: No default constructor found in base class Figure.

    package {
    	import flash.display.MovieClip;
    	import flash.events.Event;
    	import flash.events.MouseEvent;
    
    	class Figure extends MovieClip {
    		private var widthRect:Number;
    		public function Figure(w:Number) {
    			this.widthRect=w;
    			trace(this.widthRect);
    			addEventListener(MouseEvent.MOUSE_DOWN, StartDrag);
    			addEventListener(MouseEvent.MOUSE_UP, StopDrag);
    		}
    		private function StartDrag(e:Event) {
    			var trgt = e.target;
    			var mc_parent = trgt.parent;
    			trgt.startDrag();
    			trgt.width+=this.widthRect;
    		}
    		private function StopDrag(e:Event) {
    			e.target.stopDrag();
    		}
    	}
    }

  4. 22 октября 2007 в 00:03 | #4

    Скажите, пожалуйста, что здесь неправильно. Ошибка: 1203: No default constructor found in base class Figure.

    Ошибка в том, что Вы попытались передать параметр конструктору класса. А у конструктора MovieClip нет параметров. Это и вызвало ошибку.

  5. Евгений
    1 февраля 2008 в 13:42 | #5

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

  6. 1 февраля 2008 в 14:11 | #6

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

    Могу. Качайте здесь

  7. Alexei
    17 апреля 2014 в 17:32 | #7

    Michael :

    Что делать, если конструктору класса Figure нужно передать параметры? И вообще здесь Display object экземпляры классов Square и Circle. Почему они ввели необходимость базового класса при связывании?

    1. Так как Square и Circle являются потомками класса Figure, то они наследуют все его методы. Следовательно, если есть необходимость передачи параметров, передавать их можно при создании экземпляров Square или Circle.

    Скажите пожалуйста, а как сделать так, что бы при добавлении круга и квадрата на сцену можно было указать их начальное положение по оси х и у? Самый простой вариант использовать:
    а.х = 20;
    а.у = 30;
    Но если таких квадратов будет 20 то сложно будет для каждого писать. Как можно передать в конструктор класса Figure параметры, что бы при добавлении объектов можно было указать их положение? Заранее спасибо Вам! Очень надеюсь услышать ответ!

  8. aaaaaaaaa
    5 марта 2016 в 07:36 | #8

    @Michael
    в конструктор не передаются параметры

  1. 28 октября 2007 в 22:37 | #1