Просмотр полной версии : Вызов предположительно неопределенного метода addChild
projectx
18.03.2015, 17:14
Здравствуйте, пишу класс для создания кнопки (пока убрал обработку событий), вылетает ошибка по сабжу, скажите пожалуйста, что я делаю не так?
Главный класс
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);
}
}
}
Класс создающий кнопку
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;
}
}
}
У class'a нет свойства addChild/ - вы же статик юзаете. public function addButton - вот так будет работать.
А в мейне надо var buttons:Buttons = new Buttons()
buttons.addButton(...))
caseyryan
18.03.2015, 21:05
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, спасибо за помощь, именно так у меня изначально все было и реализовано. Код стал похож на лапшу, захотелось все постепенно оформлять в классы. Получается, что никак не обойтись без создания внутри главного класса?
Вот как у меня было сделано ранее
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'ов
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
Спасибо большое, все получилось!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.