Создание своей кнопки

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
Ответить
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Создание своей кнопки

Сообщение Casperovskii »

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

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

package {    import flash.display.*;    import flash.net.*;        public class UpPanel extends Sprite {        private var button:SimpleButton;        private var pictLoader:Loader = new Loader();        private var buttonUpState:DisplayObject;        private var buttonDownState:DisplayObject;        private var buttonOverState:DisplayObject;        private var buttonHitTestState:DisplayObject;                private var urlRequest:URLRequest;                public function UpPanel() {          urlRequest = new URLRequest("upStateButton.jpg");          pictLoader.load(urlRequest);          buttonUpState = pictLoader.content;                  urlRequest = new URLRequest("downStateButton.jpg");          pictLoader.load(urlRequest);          buttonDownState = pictLoader.content;                  urlRequest = new URLRequest("overStateButton.jpg");          pictLoader.load(urlRequest);          buttonOverState = pictLoader.content;          buttonHitTestState = pictLoader.content;                  button = new SimpleButton(buttonUpState, buttonOverState, buttonDownState, buttonHitTestState);          button.x = 50;          button.y = 50;          addChild(button);        }    }}
Тут, конечно, не поисковик моих ошибок в коде, но будьте добры, объясните что не так?
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Создание своей кнопки

Сообщение sanych_dv »

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

 package{    import flash.display.*;    import flash.events.*;    import flash.net.*;        public class UpPanel extends Sprite    {        private var button:SimpleButton;        private var _loc:Object = {};        private var pics:Array = ["upStateButton", "downStateButton", "overStateButton"];        private var cnt:int = 0;                public function UpPanel()        {                        for (var i:int = 0; i < pics.length; i++)            {                _loc["loader" + i] = new Loader;                _loc["loader" + i].name = pics[i];                _loc["loader" + i].contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);                _loc["loader" + i].load(new URLRequest(String(pics[i] + ".jpg")));            }        }                private function onLoadComplete(e:Event):void        {            cnt++;            _loc[e.currentTarget.loader.name] = e.currentTarget.content as Bitmap;            cnt == pics.length ? buildButton() : null;                }                private function buildButton():void        {                        button = new SimpleButton(_loc["upStateButton"], _loc["overStateButton"], _loc["downStateButton"], _loc["overStateButton"]);            button.x = button.y = 50;            addChild(button);        }    }} 
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: Создание своей кнопки

Сообщение Casperovskii »

По образу и подобию попробовал сделать свои кнопки, но уже три штуки. Итог - не выводятся на экран. Кода вроде немного, сам уже закопался. Протяните биты помощи.
Главный класс приложения - MainForm:

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

package {    import flash.display.*;            public class MainForm extends Sprite {        private var rightPanel:RightPanel;                public function MainForm() {            rightPanel = new RightPanel();            addChild(rightPanel);        }            }}
И пользовательский класс RightPanel:

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

package {    import flash.net.*;    import flash.display.*;    import flash.events.*;        public class RightPanel extends Sprite {        private var buildingButton:SimpleButton; // кнопки, размером 98*15 (ширина/высота)        private var armyButton:SimpleButton;        private var warButton:SimpleButton;                private var buttonAndImageLoaders:Object = {}; // загрузчики для картинок кнопок и миникарты                private var count:int = 0; //количество загруженных изображений        private var num:int = 0; //номер загрузки                private var pics:Array = ["upStatebuildingButton", "downStatebuildingButton", "overStatebuildingButton"]; //массив имен кнопок                public function RightPanel() {            for (var i:int = 0; i < pics.length; i++)            {                count++;                count == pics.length ? num++ : null;                buttonAndImageLoaders["loader" + i] = new Loader;                buttonAndImageLoaders["loader" + i].name = pics[i];                buttonAndImageLoaders["loader" + i].contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);                buttonAndImageLoaders["loader" + i].load(new URLRequest(String("Images/" + pics[i] + ".jpg")));            }                        count = 0;            pics = ["upStatearmyButton", "downStatearmyButton", "overStatearmyButton"];                        for (i = 3; i < pics.length+2; i++)            {                count++;                count == pics.length ? num++ : null;                buttonAndImageLoaders["loader" + i] = new Loader;                buttonAndImageLoaders["loader" + i].name = pics[i-3];                buttonAndImageLoaders["loader" + i].contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);                buttonAndImageLoaders["loader" + i].load(new URLRequest(String("Images/" + pics[i-3] + ".jpg")));            }                        count = 0;            pics = ["upStatewarButton", "downStatewarButton", "overStatewarButton"];                        for (i = 6; i < pics.length+5; i++)            {                count++;                count == pics.length ? num++ : null;                buttonAndImageLoaders["loader" + i] = new Loader;                buttonAndImageLoaders["loader" + i].name = pics[i-6];                buttonAndImageLoaders["loader" + i].contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);                buttonAndImageLoaders["loader" + i].load(new URLRequest(String("Images/" + pics[i-6] + ".jpg")));            }                               createBuildingButton();            createArmyButton();            createWarButton();        }                private function onLoadComplete(e:Event):void {            buttonAndImageLoaders[e.currentTarget.loader.name] = e.currentTarget.content as Bitmap;                          }                private function createBuildingButton():void {                       buildingButton = new SimpleButton(buttonAndImageLoaders["upStatebuildingButton"], buttonAndImageLoaders["overStatebuildingButton"], buttonAndImageLoaders["downStatebuildingButton"], buttonAndImageLoaders["overStatebuildingButton"]);            addChild(buildingButton);            buildingButton.x = 0;            buildingButton.y = 0;        }                private function createArmyButton():void {                       armyButton = new SimpleButton(buttonAndImageLoaders["upStatearmyButton"], buttonAndImageLoaders["overStatearmyButton"], buttonAndImageLoaders["downStatearmyButton"], buttonAndImageLoaders["overStatearmyButton"]);            addChild(armyButton);            armyButton.x = 0;            armyButton.y = 15;        }                private function createWarButton():void {                       warButton = new SimpleButton(buttonAndImageLoaders["upStatewarButton"], buttonAndImageLoaders["overStatewarButton"], buttonAndImageLoaders["downStatewarButton"], buttonAndImageLoaders["overStatewarButton"]);            addChild(warButton);            warButton.x = 0;            warButton.y = 30;        }            }}
При запуске приложения ошибок нет, но в итоге - белый экран. Help.
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Создание своей кнопки

Сообщение sanych_dv »

Вы вызываете функции

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

        createBuildingButton();       createArmyButton();       createWarButton(); 
до того, как завершилась загрузка картинок, а надо делать вызов в слушателе onLoadComplete.

Кроме того, все лоадеры у вас работают одновременно и имеют один слушатель COMPLETE. В таком случае в слушателе надо поставить счетчик картинок и запускать билд-функции после того, как загрузились все изображения.

PS. Для мультизагрузок очень удобно использовать LoaderMax из библиотеки com.greensock.loading : http://www.greensock.com/loadermax/
Ответить