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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 07.06.2012, 12:30
dark256 вне форума Посмотреть профиль Отправить личное сообщение для dark256 Посетить домашнюю страницу dark256 Найти все сообщения от dark256
  № 1  
Ответить с цитированием
dark256
 
Аватар для dark256

блогер
Регистрация: Apr 2008
Адрес: SPb
Сообщений: 3,718
Записей в блоге: 5
Отправить сообщение для dark256 с помощью ICQ Отправить сообщение для dark256 с помощью Skype™
По умолчанию Переопределение свойства visible в MovieClip

В одном большом, большом, старом страшном монстроообразном проекте сложилась следующая ситуация:
элементы главного пользовательского интерфейса ( будем называть его HUD) стали мешать низлежащему объекту под названием ПОЛЯНА. Условно говоря, если ставишь на Поляну "домик", а он в момент отпускания клавиши мышки находится над эл-том HUD с visible=false , то МВЦ игры считает, что домик ставится НЕ на поляну, а на этот невидимый элемент.

Соответственно, могучим коллективом программистов на посвященном этой проблеме брифинге, плавно перешедшим в фуршет, было принято волевое решение изменять видимость элементов HUD посредством
HUD.removeChild(Clip) и HUD.addChild(Clip).

В результате родился следующий код:
Код AS3:
private var itemActionsPanel : MovieClip;
private var _itemActionsVisible : Boolean;
 
override protected function init():void {
	itemActionsPanel = graphics.topPanel.itemActions;
}
 
private function set itemActionsVisible(value : Boolean) : void {
	_itemActionsVisible=value;
	if(!itemActionsPanel){
		return;
	}
	if(!_itemActionsVisible){
		if(itemActionsPanel.parent){
			itemActionsPanel.parent.removeChild(itemActionsPanel);
		}
	}else{
		graphics.topPanel.addChild(itemActionsPanel);
	}
}
private function get itemActionsVisible() : Boolean {
	return _itemActionsVisible;
}
Как легко можно заметить, далее по коду мы пишем уже
не graphics.topPanel.itemActions.visible = false,
а itemActionsVisible=false

Легко, удобно, просто, красиво, элегантно.

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

Я и решил обратиться к великому могучему ООП, с целью переопределить акцессоры MovieClip.
В результате долгого плодотворного общения с коллегами, наряду с выслушиванием кучи матюгов рекомендаций по ООП и АС3 был сотворен следующий класс:
Код AS3:
package Utils
{
	import flash.display.DisplayObjectContainer;
	import flash.display.MovieClip;
 
	public class Revisible extends MovieClip
	{
		protected var _parent : DisplayObjectContainer;
		protected var _clip:MovieClip;
 
		public function Revisible(){
			trace("Revisible Class Start", this, this.parent);
			super();
			_clip = this;
			_parent = this.parent;
		}
 
		override public function get visible () : Boolean{
			return super.visible;
		}
 
		override public function set visible (value:Boolean) : void{
			if ( value ){
				_parent.addChild( _clip );			// SHOW
			} else {
				_parent.removeChild( _clip );		// HIDE
			}
			super.visible = value;
		}
	}
}
Полная нативная оригинальная версия тут: http://pastebin.com/BwZvY1aA

Красиво, удобно, вообще все гут. За исключением мелких неточностей ( он так и не запустился, отладить не удалось пока ).
В чем возникла проблема.

В HUD лежит мувиклип прогресс-бара, для которого я хочу сделать САБЖ.
После загрузки и инициализации в классе HUD dызов конструктора:
Код AS3:
bonusProgressBar = new BonusProgressBar( HUD.bonus_proigress);
Класс прогресс-бара, частично:

Код AS3:
package GUI
{
	import Utils.Revisible;
 
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.MovieClip;
 
	public class BonusProgressBar 
	{
		private var _bar : MovieClip;
		private var scene:DisplayObjectContainer;
 
		public function BonusProgressBar(barDisplayObject : Revisible)
		{
			_bar = barDisplayObject;
		}
	}
}
По идее, barDisplayObject должен стать уже клипом с переопределнными акцессорами, и далее bonusProgressBar .visible = false должен работать как removeChild.

И тут, при вызове конструктора BonusProgressBar компилятор выдает ошибку о невозможности преобразования обьекта со стэйджа ( мувиклипа прогресс-бара ) к типу Revisible.

И тут моя мысль потерялась. Соотв вопрос к знатокам - что не так и какого ему еще надо?

Исходник прогресс-бара, вторнутого в HUD прилагается. Сорри, коллеги, это CS5.0
Вложения
Тип файла: rar HUD.rar (9.9 Кб, 35 просмотров)
__________________
FLASHER.MAP SOUNDSTAGE / CS3 / AS2


Последний раз редактировалось dark256; 07.06.2012 в 12:35.
Создать новую тему   Часовой пояс GMT +4, время: 03:34.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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