Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.03.2015, 17:14
projectx вне форума Посмотреть профиль Отправить личное сообщение для projectx Найти все сообщения от projectx
  № 1  
Ответить с цитированием
projectx

Регистрация: Mar 2015
Сообщений: 12
По умолчанию Вызов предположительно неопределенного метода 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;
		}
	}
}

Старый 18.03.2015, 20:54
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
У class'a нет свойства addChild/ - вы же статик юзаете. public function addButton - вот так будет работать.
А в мейне надо var buttons:Buttons = new Buttons()
buttons.addButton(...))
__________________
Марк Tween

Старый 18.03.2015, 21:05
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 3  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Код 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 как раз говорит о том, что действие происходит на уровне класса, а не экземпляра

Старый 18.03.2015, 21:23
projectx вне форума Посмотреть профиль Отправить личное сообщение для projectx Найти все сообщения от projectx
  № 4  
Ответить с цитированием
projectx

Регистрация: Mar 2015
Сообщений: 12
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;
		}
 
	}
}

Старый 18.03.2015, 21:32
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 5  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Можно сделать статический метод, но он должен лишь генерировать и возвращать кнопку, без всяких 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));
		}
	}
}

Старый 18.03.2015, 21:45
projectx вне форума Посмотреть профиль Отправить личное сообщение для projectx Найти все сообщения от projectx
  № 6  
Ответить с цитированием
projectx

Регистрация: Mar 2015
Сообщений: 12
Спасибо большое, все получилось!

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:18.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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