Вывод на сцену, используя ООП

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.

Вывод на сцену, используя ООП

Сообщение Agiliter » 06 мар 2014, 20:14

Доброе время суток! Пытаюсь более-менее грамотно построить архитектуру приложения, используя подход ООП.
В общем схема такая: Есть главный класс
  1.  
  2. package  
  3. {
  4.     import flash.display.Sprite;
  5.     import flash.events.*;
  6.    
  7.     public class Main extends Sprite
  8.     {
  9.         private var myGame:MyGame;
  10.         private var myGameView:MyGameView;
  11. //===================================================================================================================== 
  12.         public function Main()
  13.         {
  14.             trace("Запущен класс Main");
  15.             newGame();
  16.             newGameView()
  17.         }
  18. //=====================================================================================================================    
  19.         public function newGame():void
  20.         {
  21.             myGame = new MyGame();
  22.         }
  23. //===================================================================================================================== 
  24.         public function newGameView():void
  25.         {
  26.             myGameView = new MyGameView();
  27.             //myGameView.addEventListener(Event.ENTER_FRAME, newGameViewCompleteListener);
  28.             myGameView.addEventListener(Event.COMPLETE, newGameViewCompleteListener);
  29.         }
  30. //=====================================================================================================================    
  31.         public function newGameViewCompleteListener (e:Event):void
  32.         {
  33.             addChild(myGameView);  // Добавляем представление в список отображения
  34.         }
  35.  
  36.     }
  37. //===================================================================================================================== 
  38. }
  39.  

Он использует два других класса MyGame и MyGameView, которые реализуют саму игру и отображение игры на сцене соответственно.
  1. package  
  2. {
  3.     import flash.events.EventDispatcher;
  4.     import flash.events.IEventDispatcher;
  5.     import flash.utils.*;
  6.  
  7.     public class MyGame
  8.     {
  9.        
  10.         public function MyGame()
  11.         {
  12.             trace("Запущен класс MyGame");
  13.         }
  14.        
  15.     }
  16.  
  17. }

и
  1.  
  2. package  
  3. {
  4.     import flash.display.Sprite;
  5.  
  6.     public class MyGameView extends Sprite
  7.     {
  8.         private var myWindow:MyWindow;
  9.        
  10.         public function MyGameView()
  11.         {
  12.             trace("Запущен класс MyGameView");
  13.             paintWindow();
  14.         }
  15.        
  16.         public function paintWindow():void
  17.         {
  18.             trace("Вызван метод paintWindow");
  19.             myWindow = new MyWindow();
  20.             myWindow.paint();
  21.             //this.addChild(myWindow);
  22.         }
  23.        
  24.     }
  25.  
  26. }
  27.  


Класс MyGameView использует другой класс MyWindow для построения различных окошек

  1. package  
  2. {
  3. //===================================================================================================================== 
  4.     import flash.display.Sprite;
  5.     import flash.display.*;
  6.     import flash.events.*;
  7.     import flash.net.*;
  8. //===================================================================================================================== 
  9.     public class MyWindow extends Sprite
  10.     {
  11.         private var myGraphicsContainer:Sprite; // Контейнер для изображений
  12.         private var myImage:MyImage;                // Изображение
  13. //=====================================================================================================================        
  14.         public function MyWindow(x:int = 0, y:int = 0, height:int = 1200, width:int = 700)// х,y, высота, ширина
  15.         {
  16.             trace("Запущен класс MyWindow");
  17.             createGraphicsContainer();
  18.             //paint(x,y,height,width);
  19.            
  20.         }
  21. //===================================================================================================================== 
  22.         // Создает контейнер, в который будут помещены изображения
  23.         public function createGraphicsContainer():void
  24.         {
  25.             trace("Создан myGraphicsContainer");
  26.             myGraphicsContainer = new Sprite();
  27.             addChild(myGraphicsContainer);
  28.         }
  29. //===================================================================================================================== 
  30.         public function paint(x:int = 0, y:int = 0, height:int = 1200, width:int = 700):void
  31.         {
  32.             trace("Рисует: х = " + x + ", y = " + y + ", height = " + height + ", width = " + width);
  33.  
  34.             myImage = new MyImage();
  35.             myImage.createImage();
  36.             myGraphicsContainer.addChild(myImage);
  37.         }
  38. //=====================================================================================================================    
  39.     }
  40. //===================================================================================================================== 
  41. }

Загрузка изображений вынесена в отдельный класс
  1. package  
  2. {
  3. //===================================================================================================================== 
  4.     import flash.display.Sprite;
  5.     import flash.display.*;
  6.     import flash.events.*;
  7.     import flash.net.*;
  8. //===================================================================================================================== 
  9.     public class MyImage extends Sprite
  10.     {
  11.         private var myImage:Loader;             // Изображение
  12. //===================================================================================================================== 
  13.         public function MyImage()
  14.         {
  15.             trace("Запущен класс MyImage");
  16.         }
  17. //===================================================================================================================== 
  18.         public function createImage(name:String = "defaultImage.jpg"):void
  19.         {
  20.             myImage = new Loader();
  21.             myImage.load(new URLRequest(name));
  22.             //myImage.alpha = 0.30;             // Прозрачен на 1-0.N%
  23.             myImage.contentLoaderInfo.addEventListener(Event.COMPLETE, completeListener);
  24.             myImage.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorListener);
  25.             this.addChild(myImage)
  26.             trace("Image loaded");
  27.         }
  28. //===================================================================================================================== 
  29.         // Вызывается при завершении процесса загрузки изображений
  30.         private function completeListener (e:Event):void
  31.         {
  32.             trace("Image loaded completeListener");
  33.             // рассылаем событие Event.COMPLETE, которое обозначает, что данный объект готов к использованию.
  34.             dispatchEvent(new Event(Event.COMPLETE));
  35.         }
  36. //===================================================================================================================== 
  37.         // Вызывается при невозможности загрузки изображения
  38.         private function ioErrorListener (e:IOErrorEvent):void
  39.         {
  40.             trace("Load error: " + e);
  41.         }
  42. //===================================================================================================================== 
  43.     }
  44. //===================================================================================================================== 
  45. }


Запускаю. Трейсами выдает:
Запущен класс Main
Запущен класс MyGame
Запущен класс MyGameView
Вызван метод paintWindow
Запущен класс MyWindow
Создан myGraphicsContainer
Рисует: х = 0, y = 0, height = 1200, width = 700
Запущен класс MyImage
Image loaded
Image loaded completeListener

Однако на сцене изображения defaultImage.jpg (поместил в папку с кодом) таки нет. Если напрямую в мэйне загружать и добавлять адчайлдом, то всё нормально отображается. Да и трейсы показывают, что все методы отрабатывают. Где я накосячил?))
С уважением,
М.Ф.
Agiliter

 
Автор темы
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46
Благодарил (а): 29 раз.
Поблагодарили: 0 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



Re: Вывод на сцену, используя ООП

Сообщение XELAD » 06 мар 2014, 23:20

У вас не происходит

так как вы добавляете событие
  1. myGameView.addEventListener(Event.COMPLETE, newGameViewCompleteListener);

которое никогда не произойдёт, так как myGameView это Sprite.
XELAD

 
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25
Благодарил (а): 13 раз.
Поблагодарили: 24 раз.

Re: Вывод на сцену, используя ООП

Сообщение Agiliter » 07 мар 2014, 07:34

XELAD писал(а):которое никогда не произойдёт, так как myGameView это Sprite.

убрал слушатель. Функцию переписал на
  1. public function newGameView():void
  2.         {
  3.             myGameView = new MyGameView();
  4.             addChild(myGameView);  // Добавляем представление в список отображения
  5.             //myGameView.addEventListener(Event.ENTER_FRAME, newGameViewCompleteListener);
  6.             //myGameView.addEventListener(Event.COMPLETE, newGameViewCompleteListener);
  7.         }

Всё равно. Если же ставить слушатель
  1. myGameView.addEventListener(Event.ENTER_FRAME, newGameViewCompleteListener);
, в котором
  1.         public function newGameViewCompleteListener (e:Event):void
  2.         {
  3.             trace("newGameViewCompleteListener!");
  4.             addChild(myGameView);  // Добавляем представление в список отображения
  5.         }

То трейсы показывают
Запущен класс Main
Запущен класс MyGame
Запущен класс MyGameView
Вызван метод paintWindow
Запущен класс MyWindow
Создан myGraphicsContainer
Рисует: х = 0, y = 0, height = 1200, width = 700
Запущен класс MyImage
Image loaded
newGameViewCompleteListener!
newGameViewCompleteListener!
newGameViewCompleteListener!
Image loaded completeListener
newGameViewCompleteListener!
...
newGameViewCompleteListener!

А изображения так и нет
С уважением,
М.Ф.
Agiliter

 
Автор темы
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46
Благодарил (а): 29 раз.
Поблагодарили: 0 раз.

Re: Вывод на сцену, используя ООП

Сообщение XELAD » 07 мар 2014, 11:04

Вероятно нужно добавить и myWindow в список отображения в классе MyGameView
addChild(myWindow);

За это сообщение автора XELAD поблагодарил:
Agiliter
XELAD

 
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25
Благодарил (а): 13 раз.
Поблагодарили: 24 раз.

Re: Вывод на сцену, используя ООП

Сообщение Agiliter » 07 мар 2014, 11:10

Спасибо. Помогло
С уважением,
М.Ф.
Agiliter

 
Автор темы
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46
Благодарил (а): 29 раз.
Поблагодарили: 0 раз.

Re: Вывод на сцену, используя ООП

Сообщение Agiliter » 09 мар 2014, 07:40

Помочь-то помогло, да вот косяк другой всплыл. Трейсом хоть и выводится: Рисует: х = 0, y = 0, height = 1200, width = 700
Но как только рисунок вывожу или текст в этом же методе, то координаты не равны вводимым. Точнее трейсом он мне выводит те же координаты, что я задаю, а на экране они совсем другие.
С уважением,
М.Ф.
Agiliter

 
Автор темы
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46
Благодарил (а): 29 раз.
Поблагодарили: 0 раз.

Re: Вывод на сцену, используя ООП

Сообщение Alazaur » 09 мар 2014, 08:15

Вы же здесь координаты забыли задать:
  1.  
  2.         public function paint(x:int = 0, y:int = 0, height:int = 1200, width:int = 700):void
  3.         {
  4.             trace("Рисует: х = " + x + ", y = " + y + ", height = " + height + ", width = " + width);
  5.  
  6.             myImage = new MyImage();
  7.             myImage.createImage();
  8.             myGraphicsContainer.addChild(myImage);
  9.         }
  10.  


нужно как-то так сделать:
  1.  
  2. public function paint(x:int = 0, y:int = 0, height:int = 1200, width:int = 700):void
  3. {
  4.     trace("Рисует: х = " + x + ", y = " + y + ", height = " + height + ", width = " + width);
  5.  
  6.     myImage = new MyImage();
  7.     myImage.createImage();
  8.     myImage.x = x;
  9.     myImage.y = y;
  10.     myImage.height = height;
  11.     myImage.width = width;
  12.     myGraphicsContainer.addChild(myImage);
  13. }
  14.  
Alazaur
Разработчик
Разработчик
 
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25
Благодарил (а): 24 раз.
Поблагодарили: 121 раз.

Re: Вывод на сцену, используя ООП

Сообщение Agiliter » 09 мар 2014, 08:20

Alazaur писал(а):нужно как-то так сделать:

Я точно так и сделал. Потому и не понимаю откуда проблема. Ведь координаты жестко заданы.
С уважением,
М.Ф.
Agiliter

 
Автор темы
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46
Благодарил (а): 29 раз.
Поблагодарили: 0 раз.

Re: Вывод на сцену, используя ООП

Сообщение Alazaur » 09 мар 2014, 08:23

Agiliter, ну раз код в первом посте устарел, покажите его текущую версию. Мы ж не телепаты чтоб знать что вы сделали, а что нет :D
Alazaur
Разработчик
Разработчик
 
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25
Благодарил (а): 24 раз.
Поблагодарили: 121 раз.

Re: Вывод на сцену, используя ООП

Сообщение Agiliter » 09 мар 2014, 08:34

Да-да, конечно) Скидываю только обновленные классы. Остальные без изменений. Класс MyGameView:
  1. package  
  2. {
  3.     import flash.display.Loader;
  4.     import flash.display.Sprite;
  5.     import flash.display.*;
  6.     import flash.events.*;
  7.     import flash.net.*;
  8.  
  9.     public class MyGameView extends Sprite
  10.     {
  11.         private var myWindow:MyWindow;
  12.        
  13.         public function MyGameView()
  14.         {
  15.             trace("Запущен класс MyGameView");
  16.             paintWindow();
  17.         }
  18.        
  19.         public function paintWindow():void
  20.         {
  21.             trace("Вызван метод paintWindow");
  22.             myWindow = new MyWindow();
  23.             myWindow.x = 0;
  24.             myWindow.y = 0;
  25.             //myWindow.insertText("Я текст", 100, 100);
  26.             addChild(myWindow);
  27.         }
  28.        
  29.     }
  30.  
  31. }

В нем MyWindow
  1. package  
  2. {
  3. //===================================================================================================================== 
  4.     import flash.display.Sprite;
  5.     import flash.display.*;
  6.     import flash.events.*;
  7.     import flash.net.*;
  8.     import flash.text.TextField;
  9.     import flash.text.TextFormat;
  10. //===================================================================================================================== 
  11.     public class MyWindow extends Sprite
  12.     {
  13.         private var myGraphicsContainer:Sprite; // Контейнер для изображений
  14.         private var myImage:MyImage;            // Изображение
  15.         private var myText:MyText;              // Текст
  16. //=====================================================================================================================        
  17.         public function MyWindow(x:int = 0, y:int = 0/*, myHeight:int = 1200, myWidth:int = 750*/)// х,y, высота, ширина
  18.         {
  19.             trace("Запущен класс MyWindow");       
  20.             createGraphicsContainer();
  21.             infuseGraphicsContainer();
  22.         }
  23. //===================================================================================================================== 
  24.         // Создаем окно-контейнер, в который будут помещены изображения
  25.         public function createGraphicsContainer(x:int = 0, y:int = 0/*, myHeight:int = 1200, myWidth:int = 750*/):void
  26.         {
  27.             trace("Создан myGraphicsContainer");
  28.             myGraphicsContainer = new Sprite();
  29.             myGraphicsContainer.x = x;
  30.             myGraphicsContainer.y = y;
  31.             //myGraphicsContainer.height = myHeight;
  32.             //myGraphicsContainer.width = myWidth;
  33.             addChild(myGraphicsContainer);
  34.         }
  35. //=====================================================================================================================
  36.         // Заполняем контейнер. Вставляем изображения. Тексты. Кнопки
  37.         public function infuseGraphicsContainer():void
  38.         {
  39.             trace("Начали заполнять myGraphicsContainer");
  40.             insertImage();
  41.             insertText("Я текст",10,0);
  42.             trace("Заполнили myGraphicsContainer");
  43.         }
  44. //=====================================================================================================================
  45.         public function insertText(str:String = "Hello, I'm metod insertText",x:int = 0, y:int = 0/*, myHeight:int = 1200, myWidth:int = 750 /*, format:TextFormat*/):void
  46.         {
  47.             trace("Вызван метод insertText");
  48.             myText = new MyText();
  49.             myText.createText(str,x,y);
  50.             myGraphicsContainer.addChild(myText);
  51.         }
  52. //===================================================================================================================== 
  53.         public function insertImage(str:String = "defaultImage.jpg", x:int = 0, y:int = 0/*, myHeight:int = 1200, myWidth:int = 750*/):void
  54.         {
  55.             trace("Вызван метод insertImage");
  56.             myImage = new MyImage();
  57.             myImage.createImage(str);
  58.             myImage.x = x;
  59.             myImage.x = y;
  60.             myGraphicsContainer.addChild(myImage);
  61.         }
  62. //=====================================================================================================================    
  63.     }
  64. //===================================================================================================================== 
  65. }

Создан новый класс MyText, отвечающий за текст
  1. package  
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.text.TextField;
  5.     import flash.text.TextFormat;
  6.  
  7.     public class MyText extends Sprite
  8.     {
  9.         private var txt:TextField;
  10.         private var format:TextFormat;
  11.        
  12.         public function MyText()
  13.         {
  14.             trace("Запущен класс MyText");         
  15.         }
  16.        
  17.         public function createText(str:String = "Hello, I'm metod createText",x:int = 0, y:int = 0):void
  18.         {
  19.             trace("Начали вставлять текст");
  20.            
  21.             txt= new TextField();
  22.             format = new TextFormat();
  23.            
  24.             format.color = 0xCC0000;        // Цвет
  25.             format.size = 26;               // Размер
  26.             format.font = "FuturaBookC";    // Шрифт
  27.             format.align = "center";
  28.            
  29.             txt = new TextField();
  30.             txt.text = str;
  31.             //txt.width = myWidth;
  32.             //txt.height = myHeight;
  33.             txt.x = x;
  34.             txt.y = y;
  35.             txt.multiline = true;           // Многострочный
  36.             txt.wordWrap = true;            // Перенос по словам
  37.             txt.selectable = false;     // Выделяемость
  38.             txt.setTextFormat(format)// Задаем формат
  39.             this.addChild(txt)
  40.             trace("Вставлен текст: " + str);
  41.         }      
  42.     }
  43. }
С уважением,
М.Ф.
Agiliter

 
Автор темы
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46
Благодарил (а): 29 раз.
Поблагодарили: 0 раз.

След.

Вернуться в Программирование на Flash



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron