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

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

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

Сообщение Agiliter »

Доброе время суток! Пытаюсь более-менее грамотно построить архитектуру приложения, используя подход ООП.
В общем схема такая: Есть главный класс

Код: Выделить всё

 package  {    import flash.display.Sprite;    import flash.events.*;        public class Main extends Sprite     {        private var myGame:MyGame;        private var myGameView:MyGameView;//=====================================================================================================================         public function Main()         {            trace("Запущен класс Main");            newGame();            newGameView();          }//=====================================================================================================================             public function newGame():void        {            myGame = new MyGame();        }//=====================================================================================================================         public function newGameView():void        {            myGameView = new MyGameView();            //myGameView.addEventListener(Event.ENTER_FRAME, newGameViewCompleteListener);            myGameView.addEventListener(Event.COMPLETE, newGameViewCompleteListener);        }//=====================================================================================================================             public function newGameViewCompleteListener (e:Event):void        {            addChild(myGameView);  // Добавляем представление в список отображения        }     }//===================================================================================================================== } 
Он использует два других класса MyGame и MyGameView, которые реализуют саму игру и отображение игры на сцене соответственно.

Код: Выделить всё

package  {    import flash.events.EventDispatcher;    import flash.events.IEventDispatcher;    import flash.utils.*;     public class MyGame    {                public function MyGame()         {            trace("Запущен класс MyGame");        }            } }
и

Код: Выделить всё

 package  {    import flash.display.Sprite;     public class MyGameView extends Sprite     {        private var myWindow:MyWindow;                public function MyGameView()         {            trace("Запущен класс MyGameView");            paintWindow();        }                public function paintWindow():void        {            trace("Вызван метод paintWindow");            myWindow = new MyWindow();            myWindow.paint();            //this.addChild(myWindow);        }            } } 
Класс MyGameView использует другой класс MyWindow для построения различных окошек

Код: Выделить всё

package  {//=====================================================================================================================     import flash.display.Sprite;    import flash.display.*;    import flash.events.*;    import flash.net.*;//=====================================================================================================================     public class MyWindow extends Sprite     {        private var myGraphicsContainer:Sprite; // Контейнер для изображений         private var myImage:MyImage;                // Изображение//=====================================================================================================================                 public function MyWindow(x:int = 0, y:int = 0, height:int = 1200, width:int = 700)// х,y, высота, ширина         {            trace("Запущен класс MyWindow");            createGraphicsContainer();            //paint(x,y,height,width);                    }//=====================================================================================================================         // Создает контейнер, в который будут помещены изображения         public function createGraphicsContainer():void        {            trace("Создан myGraphicsContainer");            myGraphicsContainer = new Sprite();            addChild(myGraphicsContainer);        }//=====================================================================================================================         public function paint(x:int = 0, y:int = 0, height:int = 1200, width:int = 700):void        {            trace("Рисует: х = " + x + ", y = " + y + ", height = " + height + ", width = " + width);             myImage = new MyImage();            myImage.createImage();            myGraphicsContainer.addChild(myImage);        }//=====================================================================================================================         }//===================================================================================================================== }
Загрузка изображений вынесена в отдельный класс

Код: Выделить всё

package  {//=====================================================================================================================     import flash.display.Sprite;    import flash.display.*;    import flash.events.*;    import flash.net.*;//=====================================================================================================================     public class MyImage extends Sprite     {        private var myImage:Loader;             // Изображение//=====================================================================================================================         public function MyImage()         {            trace("Запущен класс MyImage");        }//=====================================================================================================================         public function createImage(name:String = "defaultImage.jpg"):void        {            myImage = new Loader();            myImage.load(new URLRequest(name));            //myImage.alpha = 0.30;             // Прозрачен на 1-0.N%            myImage.contentLoaderInfo.addEventListener(Event.COMPLETE, completeListener);            myImage.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorListener);            this.addChild(myImage);             trace("Image loaded");        }//=====================================================================================================================         // Вызывается при завершении процесса загрузки изображений        private function completeListener (e:Event):void        {            trace("Image loaded completeListener");            // рассылаем событие Event.COMPLETE, которое обозначает, что данный объект готов к использованию.            dispatchEvent(new Event(Event.COMPLETE));        }//=====================================================================================================================         // Вызывается при невозможности загрузки изображения        private function ioErrorListener (e:IOErrorEvent):void        {            trace("Load error: " + e);        }//=====================================================================================================================     }//===================================================================================================================== }
Запускаю. Трейсами выдает:
Запущен класс Main
Запущен класс MyGame
Запущен класс MyGameView
Вызван метод paintWindow
Запущен класс MyWindow
Создан myGraphicsContainer
Рисует: х = 0, y = 0, height = 1200, width = 700
Запущен класс MyImage
Image loaded
Image loaded completeListener

Однако на сцене изображения defaultImage.jpg (поместил в папку с кодом) таки нет. Если напрямую в мэйне загружать и добавлять адчайлдом, то всё нормально отображается. Да и трейсы показывают, что все методы отрабатывают. Где я накосячил?))
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

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

Сообщение XELAD »

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

Код: Выделить всё

addChild(myGameView);
так как вы добавляете событие

Код: Выделить всё

myGameView.addEventListener(Event.COMPLETE, newGameViewCompleteListener);
которое никогда не произойдёт, так как myGameView это Sprite.
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

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

Сообщение Agiliter »

XELAD писал(а):которое никогда не произойдёт, так как myGameView это Sprite.
убрал слушатель. Функцию переписал на

Код: Выделить всё

public function newGameView():void        {            myGameView = new MyGameView();            addChild(myGameView);  // Добавляем представление в список отображения            //myGameView.addEventListener(Event.ENTER_FRAME, newGameViewCompleteListener);            //myGameView.addEventListener(Event.COMPLETE, newGameViewCompleteListener);        }
Всё равно. Если же ставить слушатель

Код: Выделить всё

myGameView.addEventListener(Event.ENTER_FRAME, newGameViewCompleteListener);
, в котором

Код: Выделить всё

        public function newGameViewCompleteListener (e:Event):void        {            trace("newGameViewCompleteListener!");            addChild(myGameView);  // Добавляем представление в список отображения        }
То трейсы показывают
Запущен класс Main
Запущен класс MyGame
Запущен класс MyGameView
Вызван метод paintWindow
Запущен класс MyWindow
Создан myGraphicsContainer
Рисует: х = 0, y = 0, height = 1200, width = 700
Запущен класс MyImage
Image loaded
newGameViewCompleteListener!
newGameViewCompleteListener!
newGameViewCompleteListener!
Image loaded completeListener
newGameViewCompleteListener!
...
newGameViewCompleteListener!

А изображения так и нет
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

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

Сообщение XELAD »

Вероятно нужно добавить и myWindow в список отображения в классе MyGameView
addChild(myWindow);
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

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

Сообщение Agiliter »

Спасибо. Помогло
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

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

Сообщение Agiliter »

Помочь-то помогло, да вот косяк другой всплыл. Трейсом хоть и выводится: Рисует: х = 0, y = 0, height = 1200, width = 700
Но как только рисунок вывожу или текст в этом же методе, то координаты не равны вводимым. Точнее трейсом он мне выводит те же координаты, что я задаю, а на экране они совсем другие.
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

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

Сообщение Alazaur »

Вы же здесь координаты забыли задать:

Код: Выделить всё

         public function paint(x:int = 0, y:int = 0, height:int = 1200, width:int = 700):void        {            trace("Рисует: х = " + x + ", y = " + y + ", height = " + height + ", width = " + width);             myImage = new MyImage();            myImage.createImage();            myGraphicsContainer.addChild(myImage);        } 
нужно как-то так сделать:

Код: Выделить всё

 public function paint(x:int = 0, y:int = 0, height:int = 1200, width:int = 700):void{    trace("Рисует: х = " + x + ", y = " + y + ", height = " + height + ", width = " + width);     myImage = new MyImage();    myImage.createImage();    myImage.x = x;    myImage.y = y;    myImage.height = height;    myImage.width = width;    myGraphicsContainer.addChild(myImage);} 
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

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

Сообщение Agiliter »

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

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

Сообщение Alazaur »

Agiliter, ну раз код в первом посте устарел, покажите его текущую версию. Мы ж не телепаты чтоб знать что вы сделали, а что нет :D
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

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

Сообщение Agiliter »

Да-да, конечно) Скидываю только обновленные классы. Остальные без изменений. Класс MyGameView:

Код: Выделить всё

package  {    import flash.display.Loader;    import flash.display.Sprite;    import flash.display.*;    import flash.events.*;    import flash.net.*;     public class MyGameView extends Sprite     {        private var myWindow:MyWindow;                public function MyGameView()         {            trace("Запущен класс MyGameView");            paintWindow();        }                public function paintWindow():void        {            trace("Вызван метод paintWindow");            myWindow = new MyWindow();            myWindow.x = 0;            myWindow.y = 0;            //myWindow.insertText("Я текст", 100, 100);            addChild(myWindow);        }            } }
В нем MyWindow

Код: Выделить всё

package  {//=====================================================================================================================     import flash.display.Sprite;    import flash.display.*;    import flash.events.*;    import flash.net.*;    import flash.text.TextField;    import flash.text.TextFormat;//=====================================================================================================================     public class MyWindow extends Sprite     {        private var myGraphicsContainer:Sprite; // Контейнер для изображений         private var myImage:MyImage;            // Изображение        private var myText:MyText;              // Текст//=====================================================================================================================                 public function MyWindow(x:int = 0, y:int = 0/*, myHeight:int = 1200, myWidth:int = 750*/)// х,y, высота, ширина         {            trace("Запущен класс MyWindow");                    createGraphicsContainer();            infuseGraphicsContainer();        }//=====================================================================================================================         // Создаем окно-контейнер, в который будут помещены изображения         public function createGraphicsContainer(x:int = 0, y:int = 0/*, myHeight:int = 1200, myWidth:int = 750*/):void        {            trace("Создан myGraphicsContainer");            myGraphicsContainer = new Sprite();            myGraphicsContainer.x = x;            myGraphicsContainer.y = y;            //myGraphicsContainer.height = myHeight;            //myGraphicsContainer.width = myWidth;            addChild(myGraphicsContainer);        }//=====================================================================================================================        // Заполняем контейнер. Вставляем изображения. Тексты. Кнопки        public function infuseGraphicsContainer():void        {            trace("Начали заполнять myGraphicsContainer");            insertImage();            insertText("Я текст",10,0);            trace("Заполнили myGraphicsContainer");        }//=====================================================================================================================        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        {            trace("Вызван метод insertText");            myText = new MyText();            myText.createText(str,x,y);            myGraphicsContainer.addChild(myText);        }//=====================================================================================================================         public function insertImage(str:String = "defaultImage.jpg", x:int = 0, y:int = 0/*, myHeight:int = 1200, myWidth:int = 750*/):void        {            trace("Вызван метод insertImage");            myImage = new MyImage();            myImage.createImage(str);            myImage.x = x;            myImage.x = y;            myGraphicsContainer.addChild(myImage);        }//=====================================================================================================================         }//===================================================================================================================== }
Создан новый класс MyText, отвечающий за текст

Код: Выделить всё

package  {    import flash.display.Sprite;    import flash.text.TextField;    import flash.text.TextFormat;     public class MyText extends Sprite     {        private var txt:TextField;        private var format:TextFormat;                public function MyText()         {            trace("Запущен класс MyText");                  }                public function createText(str:String = "Hello, I'm metod createText",x:int = 0, y:int = 0):void        {            trace("Начали вставлять текст");                        txt= new TextField();            format = new TextFormat();                         format.color = 0xCC0000;        // Цвет            format.size = 26;               // Размер            format.font = "FuturaBookC";    // Шрифт            format.align = "center";                        txt = new TextField();            txt.text = str;            //txt.width = myWidth;            //txt.height = myHeight;            txt.x = x;            txt.y = y;            txt.multiline = true;           // Многострочный            txt.wordWrap = true;            // Перенос по словам            txt.selectable = false;     // Выделяемость            txt.setTextFormat(format);  // Задаем формат            this.addChild(txt);             trace("Вставлен текст: " + str);        }           }}
Ответить