Показать сообщение отдельно
Старый 09.10.2006, 01:00
Хемуль вне форума Посмотреть профиль Отправить личное сообщение для Хемуль Найти все сообщения от Хемуль
  № 27  
Ответить с цитированием
Хемуль
Квач
 
Аватар для Хемуль

Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
Ок, значит XML...
Код изменился:
Код:
var XMLPath:String = "map.xml";

var topNodeName:String = "map";
var regionsSectionNodeName:String = "regions";
var regionNodeName:String = "region";
var regionIdAttributeName:String = "id";
var regionNameAttributeName:String = "name";
var regionDescriptionAttributeName:String = "description";
var regionPatientsCountAttributeName:String = "count";
var regionPatientsGroup1CountAttributeName:String = "value1";
var regionPatientsGroup2CountAttributeName:String = "value2";
var regionPatientsGroup3CountAttributeName:String = "value3";

var maxScale:Number = 120;
var defaultScale:Number = 100;

var regionClipBaseName:String = "region";
var regionCaptionClipBaseName:String = "regionCaption";
var regionCaptionClipHitSuffix:String = "_hit";

var winX:Number = 16;
var winY:Number = 160;
var winOpened:Boolean = false;

var regionsNamesX:Number = 240;
var regionsNamesY:Number = 20;
var regionsNamesWidth:Number = 60;
var regionsNamesHeight:Number = 20;
var regionsNamesInterval:Number = 20;
var regionsNamesColor:Number = 0x000000;
var regionsNamesHoverColor:Number = 0xff0000;
var regionsNamesFont:String = "Tahoma";
var regionsNamesSize:Number = 10;

var regionsFillHoverColor:Number = 0xff0000;
var regionsFillColor:Number = 0x94CBD1;
var regionsLineHoverColor:Number = 0x000000;
var regionsLineColor:Number = 0x000000;

var regions:Array = new Array();
var _id_:Number = 0;
var _name_:Number = 1;
var _description_:Number = 2;
var _patientsCount_:Number = 3;
var _patientsGroup1Count_:Number = 4;
var _patientsGroup2Count_:Number = 5;
var _patientsGroup3Count_:Number = 6;

var mapXML:XML = new XML();
mapXML.onLoad = XMLLoaded;
mapXML.ignoreWhite = true;
mapXML.load(XMLPath);

function XMLLoaded(success:Boolean)
{
	if (success)
	{
		var topNode:XMLNode = mapXML.firstChild;
		if (topNode.nodeName == topNodeName)
		{
			var secondLevelNodes:Array = topNode.childNodes;
			var secondLevelNodesNumber:Number = secondLevelNodes.length;
			for (var secondLevelNodesIndex:Number = 0; secondLevelNodesIndex < secondLevelNodesNumber; ++secondLevelNodesIndex)
			{
				var secondLevelNode:XMLNode = secondLevelNodes[secondLevelNodesIndex];
				if (secondLevelNode.nodeName == regionsSectionNodeName)
				{
					var thirdLevelNodes:Array = secondLevelNode.childNodes;
					var thirdLevelNodesNumber:Number = thirdLevelNodes.length;
					for (var thirdLevelNodesIndex:Number = 0; thirdLevelNodesIndex < thirdLevelNodesNumber; ++thirdLevelNodesIndex)
					{
						var thirdLevelNode:XMLNode = thirdLevelNodes[thirdLevelNodesIndex];
						if (thirdLevelNode.nodeName == regionNodeName)
						{
							var currentRegionParameters:Array = new Array();
							currentRegionParameters[_id_] = Number(thirdLevelNode.attributes[regionIdAttributeName]);
							currentRegionParameters[_name_] = thirdLevelNode.attributes[regionNameAttributeName];							
							currentRegionParameters[_description_] = thirdLevelNode.attributes[regionDescriptionAttributeName];
							currentRegionParameters[_patientsCount_] = Number(thirdLevelNode.attributes[regionPatientsCountAttributeName]);
							currentRegionParameters[_patientsGroup1Count_] = Number(thirdLevelNode.attributes[regionPatientsGroup1CountAttributeName]);
							currentRegionParameters[_patientsGroup2Count_] = Number(thirdLevelNode.attributes[regionPatientsGroup2CountAttributeName]);
							currentRegionParameters[_patientsGroup3Count_] = Number(thirdLevelNode.attributes[regionPatientsGroup3CountAttributeName]);
							regions.push(currentRegionParameters);
						}
					}
				}
			}
			initClips();
		}
		else
		{
			trace("Error loading " + XMLPath + " - invalid top node name!");
		}
	}
	else
	{
		trace("Error loading " + XMLPath + "!");
	}
}

function initClips()
{
	var regionsNumber:Number = regions.length;
	for (var index:Number = 0; index < regionsNumber; index++)
	{
		var currentRegion:Array = regions[index];
		var regionName:String = regionClipBaseName + currentRegion[_id_];
		var regionCaptionName:String = regionCaptionClipBaseName + currentRegion[_id_];
		var regionCaptionHitAreaName:String = regionCaptionName + regionCaptionClipHitSuffix;
		this[regionName].speedFactor = defaultScale;
		this[regionName].speed = 0;
		this[regionName].id = index;
		setColor(this[regionName].fill, regionsFillColor);
		setColor(this[regionName].line, regionsLineColor);
		this[regionName].onRollOver = this[regionNameText].onRollOver = function()
		{
			this.speedFactor = maxScale;
			setColor(this.fill, regionsFillHoverColor);
			setColor(this.line, regionsLineHoverColor);
			this.swapDepths(this._parent.getNextHighestDepth());
		};
		this[regionName].onRollOut = this[regionName].onReleaseOutside = function()
		{
			this.speedFactor = defaultScale;
			setColor(this.fill, regionsFillColor);
			setColor(this.line, regionsLineColor);		
		};
		this[regionName].onRelease = this[regionNameText].onRelease = function()
		{
			if (!winOpened)
			{
				var windowClip:MovieClip = this._parent.attachMovie("window", "window", this._parent.getNextHighestDepth(), {_x:winX, _y:winY});
				windowClip.description.text = regions[this.id][_description_];
				winOpened = true;
				windowClip.closeButton.onRelease = function()
				{
					this._parent.removeMovieClip();
					winOpened = false;
				};
			}
			else 
			{
				this._parent.window.removeMovieClip();
				winOpened = false;
			}
		};
		var regionCaption:MovieClip = this.createEmptyMovieClip(regionCaptionName, this.getNextHighestDepth());
		regionCaption._x = regionsNamesX;
		regionCaption._y = regionsNamesY + index * regionsNamesInterval;
		regionCaption.id = index;	
		regionCaption.createTextField("textCaption", regionCaption.getNextHighestDepth(), 0, 0, regionsNamesWidth, regionsNamesHeight);
		regionCaption.textCaption.autoSize = true;
		regionCaption.textCaption.multiline = false;
		var regionCaptionTextFormat:TextFormat = new TextFormat();
		regionCaptionTextFormat.font = regionsNamesFont;
		regionCaptionTextFormat.size = regionsNamesSize;
		regionCaption.textCaption.setNewTextFormat(regionCaptionTextFormat);
		regionCaption.textCaption.text = currentRegion[_name_];
		var regionCaptionHitArea:MovieClip = regionCaption.createEmptyMovieClip(regionCaptionHitAreaName, regionCaption.getNextHighestDepth());
		regionCaptionHitArea.beginFill(0x000000);
		regionCaptionHitArea.moveTo(0, 0);
		regionCaptionHitArea.lineTo(regionCaption._width, 0);
		regionCaptionHitArea.lineTo(regionCaption._width, regionCaption._height);
		regionCaptionHitArea.lineTo(0, regionCaption._height);	
		regionCaptionHitArea.lineTo(0, 0);	
		regionCaptionHitArea.endFill();
		regionCaptionHitArea._visible = false;
		regionCaption.hitArea = regionCaptionHitArea;
		setColor(regionCaption, regionsNamesColor);
		regionCaption.onRollOver = function()
		{
			setColor(this, regionsNamesHoverColor);
			this._parent[regionClipBaseName + regions[this.id][_id_]].onRollOver();
		};
		regionCaption.onRollOut = regionCaption.onReleaseOutside = function()
		{
			setColor(this, regionsNamesColor);		
			this._parent[regionClipBaseName + regions[this.id][_id_]].onRollOut();
		};
		regionCaption.onRelease = function()
		{
			this._parent[regionClipBaseName + regions[this.id][_id_]].onRelease();
		};
	}
	this.onEnterFrame = function()
	{
		for (var regionId:Number = 0; regionId < regionsNumber; regionId++)
		{
			var regionToUpdate:String = regionClipBaseName + regions[regionId][_id_];
			updateRegion.apply(this[regionToUpdate]);
		}
	};
}
	
function updateRegion()
{
	this.speed = (this.speed * 0.8) + ((this.speedFactor - this._xscale) * 0.2);
	this._xscale += this.speed;
	this._yscale = this._xscale;
}

function setColor(MC:MovieClip, colorToSet:Number)
{
	var newColor:Color = new Color(MC);
	newColor.setRGB(colorToSet);	
}
В коде выше id, который загружается из тэга XML'я и id, который устанавливается для мувиклипов регионов (и мувиклипов кнопок справа ) - разные числа. Дело в том, что вы можете в XML'е устанавливать данные не для всех регионов. То есть, если у вас, например, 76 регионов, то вам не обязательно нужно иметь 76 тэгов region. Те регионы, для которых будет отсутствовать тэг region в файле map.xml, будут просто неактивными и их имена не будут выводиться справа в списке. Данные, которые грузятся из XML'я, помещаются в массив regions. Также я сделал так, чтобы можно было гибко настраивать "парсер". Как видите, сверху определяются имена соответствующих тэгов и атрибутов. То есть, например, если ваш клиент захочет поменять атрибут count на какой-то другой, например, patientsNum, то сделать это будет очень просто.

XML (map.xml):
Код:
<?xml version="1.0" encoding="UTF-8"?>
<map>
	<regions>
		<region id="1" name="Регион 1" description="Описание первого региона, каким бы он первым ни был..." count="10" value1="2" value2="3" value3="4" />
		<region id="2" name="Регион 2" description="Описание второго региона, который по сути ничем не хуже первого." count="12" value1="5" value2="6" value3="7" />
	</regions>
</map>
Сохранять XML следует с кодировкой UTF-8. Иначе с русскими буквами будут проблемы. id региона соответствует числу, которое присоединяется к строке "region" для получения имени мувиклипа. То есть, тэг region с атрибутом id="1" будет устанавливать данные для региона с мувиклипом region1.
Исходник прикрепляю...
Вложения
Тип файла: zip mapXML.zip (14.5 Кб, 70 просмотров)
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого


Последний раз редактировалось Хемуль; 09.10.2006 в 01:02.