Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вызов предположительно неопределенного метода addChild (http://www.flasher.ru/forum/showthread.php?t=210464)

projectx 18.03.2015 17:14

Вызов предположительно неопределенного метода addChild
 
Здравствуйте, пишу класс для создания кнопки (пока убрал обработку событий), вылетает ошибка по сабжу, скажите пожалуйста, что я делаю не так?

Главный класс

Код AS3:

package
{
        import flash.display.Sprite;
        //import com.engine.Sounds;
        import com.engine.Buttons;
 
        public class Main extends Sprite
        {
                public function Main()
                {
                        Buttons.addButton(EmbedImages.imgSoundOn, 700, 30);
                }
        }
}

Класс создающий кнопку

Код AS3:

package com.engine
{
        import flash.display.Sprite;
        import flash.display.Bitmap;
 
        public class Buttons extends Sprite
        {
                public static function addButton(bitmap:Bitmap, x:Number, y:Number):Sprite
                {
                        var button:Sprite = new Sprite();
                        button.buttonMode = true;
                        button.x = x;
                        button.y = y;
                        addChild(button);
                        button.addChild(bitmap);
                        return button;
                }
        }
}


in4core 18.03.2015 20:54

У class'a нет свойства addChild/ - вы же статик юзаете. public function addButton - вот так будет работать.
А в мейне надо var buttons:Buttons = new Buttons()
buttons.addButton(...))

caseyryan 18.03.2015 21:05

Код AS3:

package
{
        import flash.display.Sprite;
        //import com.engine.Sounds;
        import com.engine.Buttons;
 
        public class Main extends Sprite
        {
                public function Main()
                {
                        addChild(getButton(EmbedImages.imgSoundOn, 700, 30));
                }
        }
  private function getButton(bitmap:Bitmap, x:Number, y:Number):Sprite
                {
                        var button:Sprite = new Sprite();
                        button.buttonMode = true;
                        button.x = x;
                        button.y = y;
                        addChild(button);
                        button.addChild(bitmap);
                        return button;
                }
}

Объект можно добавить только в экземпляр, класса наследника DisplayObjectContainer, но не в сам класс. Модификатор static как раз говорит о том, что действие происходит на уровне класса, а не экземпляра

projectx 18.03.2015 21:23

in4core, благодарю за отклик, но после изменений в окне изображение не появилось, варнингов компилятор не выдал, Standalone версия проигрывателя ошибок не выдала.

caseyryan, спасибо за помощь, именно так у меня изначально все было и реализовано. Код стал похож на лапшу, захотелось все постепенно оформлять в классы. Получается, что никак не обойтись без создания внутри главного класса?

Вот как у меня было сделано ранее

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.display.Bitmap;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.net.SharedObject;
        import com.engine.Sounds;
 
        [SWF(backgroundColor="#00ccff", width="800", height="730", frameRate="30")]
        public class main extends Sprite
        {
                [Embed(source="data/config.json", mimeType="application/octet-stream")]
                private static const Config:Class;
 
                [Embed(source = "data/sound_on.png", mimeType = "image/png")]
                private static const iSoundOn:Class;
 
                [Embed(source = "data/sound_off.png", mimeType = "image/png")]
                private static const iSoundOff:Class;
 
                [Embed(source="data/click.mp3")]
                private var sndClick:Class;
 
                [Embed(source="data/theme.mp3")]
                private var sndTheme:Class;
 
                public var theme:Object;
                public var startButton:Sprite;
                public var stopButton:Sprite;
 
                public var localData:SharedObject;
 
                public function main()
                {
                        localData = SharedObject.getLocal("localData");
 
                        if(localData.data.music == undefined) localData.data.music = true;
 
                        if(localData.data.music)
                        {
                                theme = Sounds.playSound(sndTheme, 10, true);
                        }
 
                        startButton = addButton(new iSoundOn(), "soundon", 700, 30);
                        stopButton = addButton(new iSoundOff(), "soundoff", 700, 30);
                        startButton.visible = false;
                }
 
                private function addImage(image:Class, x:int, y:int):void
                {
                        var bitmap:Bitmap = new image();
                        bitmap.x = x;
                        bitmap.y = y;
                        addChild(bitmap);
                }
 
                private function addButton(bitmap:Bitmap, name:String, x:int, y:int):Sprite
                {
                        var button:Sprite = new Sprite();
                        button.buttonMode = true;
                        button.x = x;
                        button.y = y;
                        button.addEventListener(MouseEvent.CLICK, mouseClick);
                        button.addEventListener(MouseEvent.MOUSE_OVER, mouseOver);
                        button.addEventListener(MouseEvent.MOUSE_OUT, mouseOut);
                        addChild(button);
                        button.addChild(bitmap);
 
                        function mouseClick():void
                        {
                                switch(name)
                                {
                                        case "soundon":
                                                startButton.visible = false;
                                                stopButton.visible = true;
                                                theme = Sounds.playSound(sndTheme, 10, true);
                                                localData.data.music = true;
                                        break;
 
                                        case "soundoff":
                                                startButton.visible = true;
                                                stopButton.visible = false;
                                                Sounds.stopSound(theme);
                                                localData.data.music = false;
                                        break;
                                }
                        }
 
                        function mouseOver():void
                        {
                                button.alpha = 0.85;
                        }
 
                        function mouseOut():void
                        {
                                button.alpha = 1;
                        }
 
                        return button;
                }
 
        }
}


caseyryan 18.03.2015 21:32

Можно сделать статический метод, но он должен лишь генерировать и возвращать кнопку, без всяких addChild'ов
Код AS3:

package com.engine
{
        import flash.display.Sprite;
        import flash.display.Bitmap;
 
        public class Buttons
        {
                public static function getButton(bitmap:Bitmap, x:int, y:int):Sprite
                {
                        var button:Sprite = new Sprite();
                        button.buttonMode = true;
                        button.addChild(bitmap);
                        button.x = x;
                        button.y = y;
                        return button;
                }
        }
}
 
package
{
        import flash.display.Sprite;
        //import com.engine.Sounds;
        import com.engine.Buttons;
 
        public class Main extends Sprite
        {
                public function Main()
                {
                        addChild(Buttons.getButton(EmbedImages.imgSoundOn, 70, 30));
                }
        }
}


projectx 18.03.2015 21:45

Спасибо большое, все получилось!


Часовой пояс GMT +4, время: 00:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.