Ну, например, можно что-то вроде такого написать:

Код:
var mapClipName:String = "map";
var hintClipName:String = "hint";
var XMLPath:String = "locations.xml";
var topNodeName:String = "locations";
var locationNodeName:String = "location";
var locationNameAttributeName:String = "name";
var locationLinkAttributeName:String = "link";
var locationTargetAttributeName:String = "target";
var locationXAttributeName:String = "x";
var locationYAttributeName:String = "y";
var locationRadiusAttributeName:String = "radius";
var locationFillColorAttributeName:String = "fill_color";
var locationFillAlphaAttributeName:String = "fill_alpha";
var locationLineColorAttributeName:String = "line_color";
var locationLineAlphaAttributeName:String = "line_alpha";
var locationLineWidthAttributeName:String = "line_width";
var locationClipBaseName:String = "locations";
var locations:Array = new Array();
var locationsXML:XML = new XML();
locationsXML.onLoad = XMLLoaded;
locationsXML.ignoreWhite = true;
locationsXML.load(XMLPath);
var mapClip:MovieClip = this.attachMovie(mapClipName, mapClipName, this.getNextHighestDepth());
locationsXML.onLoad = function(success:Boolean)
{
if (success)
{
var topNode:XMLNode = this.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 == locationNodeName)
{
var locationObject:Object = new Object();
locationObject.name = secondLevelNode.attributes[locationNameAttributeName];
locationObject.link = secondLevelNode.attributes[locationLinkAttributeName];
locationObject.target = secondLevelNode.attributes[locationTargetAttributeName];
locationObject.x = secondLevelNode.attributes[locationXAttributeName];
locationObject.y = secondLevelNode.attributes[locationYAttributeName];
locationObject.radius = secondLevelNode.attributes[locationRadiusAttributeName];
locationObject.fillColor = secondLevelNode.attributes[locationFillColorAttributeName];
locationObject.fillAlpha = secondLevelNode.attributes[locationFillAlphaAttributeName];
locationObject.lineColor = secondLevelNode.attributes[locationLineColorAttributeName];
locationObject.lineAlpha = secondLevelNode.attributes[locationLineAlphaAttributeName];
locationObject.lineWidth = secondLevelNode.attributes[locationLineWidthAttributeName];
locations.push(locationObject);
}
}
drawLocations();
}
else
{
trace("Error loading " + XMLPath + " - invalid top node name!");
}
}
else
{
trace("Error loading " + XMLPath + "!");
}
}
function drawLocations()
{
var locationsNumber:Number = locations.length;
for (var index:Number = 0; index < locationsNumber; index++)
{
var locationObject:Object = locations[index];
var newLocationClipName:String = locationClipBaseName + index;
var newLocationClip:MovieClip = createCircleMovieClip(newLocationClipName, this, this.getNextHighestDepth(), locationObject.x, locationObject.y, locationObject.radius, locationObject.fillColor, locationObject.fillAlpha, locationObject.lineColor, locationObject.lineAlpha, locationObject.lineWidth);
newLocationClip.id = index;
newLocationClip.onRollOver = function()
{
var hintClip:MovieClip = this.attachMovie(hintClipName, hintClipName, this.getNextHighestDepth(), {_x:locations[this.id].radius, _y:locations[this.id].radius});
hintClip.caption.text = locations[this.id].name;
};
newLocationClip.onRollOut = newLocationClip.onReleaseOutside = function()
{
this[hintClipName].removeMovieClip();
};
newLocationClip.onRelease = function()
{
getURL(locations[this.id].link, locations[this.id].target);
};
}
}
function createCircleMovieClip(circleName:String, parentClip:MovieClip, parentClipDepth:Number, circleX:Number, circleY:Number, circleRadius:Number, circleFillColor:Number, circleFillAlpha:Number, circleLineColor:Number, circleLineAlpha:Number, circleLineWidth:Number):MovieClip
{
var newCircleClip:MovieClip = parentClip.createEmptyMovieClip(circleName, parentClipDepth);
newCircleClip._x = circleX - circleRadius;
newCircleClip._y = circleY - circleRadius;
newCircleClip.lineStyle(circleLineWidth, circleLineColor, circleLineAlpha);
newCircleClip.beginFill(circleFillColor, circleFillAlpha);
var tanPI8:Number = Math.tan(Math.PI / 8);
var sinPI4:Number = Math.sin(Math.PI / 4);
newCircleClip.moveTo(2 * circleRadius, circleRadius);
newCircleClip.curveTo(2 * circleRadius, (tanPI8 + 1) * circleRadius, (sinPI4 + 1) * circleRadius, (sinPI4 + 1) * circleRadius);
newCircleClip.curveTo((tanPI8 + 1) * circleRadius, 2 * circleRadius, circleRadius, 2 * circleRadius);
newCircleClip.curveTo((1 - tanPI8) * circleRadius, 2 * circleRadius, (1 - sinPI4) * circleRadius, (sinPI4 + 1) * circleRadius);
newCircleClip.curveTo(0, (tanPI8 + 1) * circleRadius, 0, circleRadius);
newCircleClip.curveTo(0, (1 - tanPI8) * circleRadius, (1 - sinPI4) * circleRadius, (1 - sinPI4) * circleRadius);
newCircleClip.curveTo((1 - tanPI8) * circleRadius, 0, circleRadius, 0);
newCircleClip.curveTo((tanPI8 + 1) * circleRadius, 0, (sinPI4 + 1) * circleRadius, (1 - sinPI4) * circleRadius);
newCircleClip.curveTo(2 * circleRadius, (1 - tanPI8) * circleRadius, 2 * circleRadius, circleRadius);
newCircleClip.endFill();
return newCircleClip;
}
С XML'ем такого вида:

Код:
<locations>
<location name="Киев, мой город ^_^" link="http://flasher.ru" target="_blank" x="190" y="70" radius="4" fill_color="0xff0000" fill_alpha="100" line_color="0x000000" line_alpha="100" line_width="1" />
</locations>
Исходник прикрепляю...
Будут вопросы, пишите. Я не уделял много внимания всплывающей подсказке, поэтому сделана она очень просто. Для примера...
PS:
XML сохранять следует в кодировке UTF-8.