sapete ragazzi alle volte il forum di AS mi sembra un po' arido. pero' la comunità rimane uno strumento preziosissimo che vorrei arricchire. così ho fatto questa classe (e poi magari in giro c'e' roba meglio eheheheh)
chissà che non possa essere utile a qualcuno o che si possa migliorare e soprattutto ragazzi, diamoci da fare! non dobbiamo essere tirchi di risposte! il dialogo qui dentro ci fa comodo a tutti, forza forza forza ...

-------------------------------------

gli oggetti della classe AREA sono dei contenitori dove movieclip possono essere impilati, in senso verticale od orizzontale. siccome le aree sono di dimensione definita, viene gestito anche lo scroll per poter visualizzare tutto il contenuto dell'area.

-------------------------------------

per iniziare (come prova) occorre:

* creare un clip filmato consistente in un semplice rettangolino (grafica a vostro piacimento) e chiamarlo 'scroll_btn', attivarne l'esportazione per AS

* creare degli elementi grafici rettangolari grandi 120X30
fatene uno giallo, uno verde e chiamateli 'uno' e 'due'

* copiate la classe dentro un file di nome area.as e mettelo nella stessa directory del filmato che andrete a creare

-------------------------------------

fate un nuovo filmato, salvatelo nella cartella sopracitata, e scrivete nel frame principale:

miarea=new area(_root,"menu",40,40,300,40,1,5);
opzione1 = miarea.add_inside("uno");
miarea.add_inside("due");

in sostanza avete creato un'area, e avete aggiunto a questa i due movieclip. potete continuare ad aggiungerli. se superate le dimensioni dell'area, sarà gestito lo scroll.

ecco cosa significano i parametri:
_root e' dove viene attaccata l'area
"menu" e' il nome che gli daro'
40 posizione x
40 posizione y
300 dimensione x
40 dimensione y
1 area in senso orizzontale (0 e' verticale)
5 spazio tra i movieclip messi dentro

come metodi abbiamo:
add_inside (<nome del movieclip>) - mette dentro un movieclip; restituisce l'id dell'oggetto
clear_insides () - cancella il contenuto
del_inside (<id dell'oggetto>) - cancella un movieclip

-------------------------------------

fatemi sapere chene pensate!



codice:
class area 
{
	
	/*************************************************************
					PARAMETRI E COSTRUTTORE
	**************************************************************/
		
	var _type:Number;
	var _spacing:Number;
	var _anchor:Object;
	var _nome:String;
	var _insides:Array;
	var _posx:Number;
	var _posy:Number;
	var _dimx:Number;
	var _dimy:Number;
	var _fully:Number;
	var _scroll_amount:Number;
	
	function area (_anchor:Object, _nome:String, _posx:Number, _posy:Number, _dimx:Number, _dimy:Number, _type:Number, _spacing:Number)
	{
		// inizializzo la mia area
		this._insides 		= new Array();
		this._type 			= _type; 
		this._spacing	 	= _spacing;
		this._anchor		= _anchor;
		this._nome			= _nome;
		this._dimx			= _dimx;
		this._dimy			= _dimy;
		this._posx			= _posx;
		this._posy			= _posy;
		this._fully			= 0;
		this._scroll_amount	= (_type==1)?40:10;
		
		// creo l'area, la maschera e la function
		_root[_anchor].createEmptyMovieClip(_nome,_root[_anchor].getNextHighestDepth());
		_root[_anchor].createEmptyMovieClip(_nome+"_maschera",_root[_anchor].getNextHighestDepth());
		_root[_anchor].createEmptyMovieClip(_nome+"_function",_root[_anchor].getNextHighestDepth());
		
		// posiziono l'area e la maschera		
		_anchor[_nome]._x = _anchor[_nome+"_maschera"]._x = _anchor[_nome+"_function"]._x = _posx;
		_anchor[_nome]._y = _anchor[_nome+"_maschera"]._y = _anchor[_nome+"_function"]._y = _posy;
		
		// disegno la maschera e la applico
		this.draw_mask();
		_anchor[_nome].setMask(_anchor[_nome+"_maschera"]);		
	}

	function draw_mask()
	{
		with(this._anchor[this._nome+"_maschera"]){
		    lineStyle(1,0x000000,100);
			beginFill( 0xFF0000 );
    		moveTo(0,0);			
		 	lineTo(this._dimx,0);
		    lineTo(this._dimx,this._dimy);
		    lineTo(0,this._dimy);
		    lineTo(0,0);			
			endFill();			
		}
	}

	/*************************************************************
				ISTANZE
	*************************************************************/
	
	function destroy ()
	{
		this._anchor[this._nome].removeMovieClip();
	}
	
	/*************************************************************
				INSIDES
	*************************************************************/
	
	function add_inside (idObj:String)
	{		
		// individuo la mia area, ricavo l'id e il nome del mio inside
		var tg = _anchor[this._nome];		
		var id = this._insides.length;		
		var nm = "ins_"+id;
		
		// attacco l'inside
		tg.attachMovie(idObj, nm, tg.getNextHighestDepth());		
		
		// registro l'inside dentro l'array dell'area
		this._insides[id]=nm;
		
		// posiziono correttamente l'inside
		switch (this._type)
		{
			case 0:			//	VERTICALE
				tg[nm]._x	=  (this._dimx-tg[nm]._width)/2
				tg[nm]._y	=  this._fully+this._spacing;
				this._fully += tg[nm]._height+this._spacing;
			break;
			case 1:			//	ORIZZONTALE
				tg[nm]._x	= this._fully+this._spacing;
				tg[nm]._y	= (this._dimy-tg[nm]._height)/2
				this._fully += tg[nm]._width+this._spacing;
			break;
		}		 
		
		// controllo ed eventuale inserimento del sistema di scrolling
		if (this._fully>this[((this._type==1)?'_dimx':'_dimy')] and !this._anchor[this._nome+"_function"]["btn_"+((this._type==1)?'1':'2')]) 
		{ 
			scroll_btn_add (((this._type==0)?2:1));
		}

		
		// ritorna l'inside come oggetto
		return tg[nm];
	}
	
	function del_inside (obj:Object)
	{
		removeMovieClip(obj);
	}
	
	function clear_insides ()
	{
		for(var scan in this._insides)
		{
			removeMovieClip(_root[this._anchor][this._nome][this._insides[scan]]);
		}
	}
	
	/************************************************************
					SCROLL 
	************************************************************/
	
	function scroll_go (where:Number)
	{		
		// punto all'area
		var tg = this._anchor[this._nome];
		
		// effettuo lo scroll
		switch (where)
		{
			case 0:
				tg._y +=  this._scroll_amount;	
				if (tg._y > this._posy) 
				{
					scroll_btn_del (where);
					tg._y = this._posy;
				}
			break;
			case 1:
				tg._x -=  this._scroll_amount;
				if (Math.abs(tg._x)>(tg._width-this._dimx)-this._posx+this._scroll_amount) 
				{	
					scroll_btn_del (where)
					tg._x = tg._x + this._posx;
				}
			break;			
			case 2:
				tg._y -=  this._scroll_amount;
				if (tg._y+this._fully < this._posy + this._dimy)
				{	
					scroll_btn_del (where)
					tg._y < this._posy + this._dimy - this._fully
				}
			break;
			case 3:
				tg._x +=  this._scroll_amount;	
				if (tg._x>0) 
				{
					scroll_btn_del (where);
					tg._x = this._posx;
				}
			break;
		}
		
		// aggiungo il tasto complementare
		var comp = (where+2)%4;
		if (!this._anchor[this._nome+"_function"]["btn_"+comp]) scroll_btn_add(comp); 
		
	}	
	
	function scroll_btn_add (where:Number)
	{				
	
		// imposto l'altezza del mio tasto 
		var spessore = (this[(where==0 or where==2)?'_dimy':'_dimx']/100)*7	
		
		// miro alla function
		var tg = this._anchor[this._nome+"_function"];
		
		// attacco il tasto all'area
		tg.attachMovie("scroll_btn","btn_"+where,tg.getNextHighestDepth());
		
		// posiziono e dimensiono il tasto
		with(tg["btn_"+where]){			
			switch (where){
				case 0:
					_y = 2; _x = 2; _width = this._dimx-4; _height = spessore;
				break;
				case 1:		
					_y = 2; _x = this._dimx-spessore-2; _width = spessore; _height = this._dimy-4;
				break;
				case 2:
					_y = this._dimy-spessore-2; _x = 2; _width = this._dimx-4; _height = spessore;
				break;
				case 3:
					_y = 2; _x = 2; _width = spessore ; _height = this._dimy-4;
				break;
			} 
			
			// assegno al tasto la funzione di scroll			
			var reference=this;
			tg["btn_"+where].onEnterFrame = function ()
			{			
				if (hitTest(_root._xmouse,_root._ymouse,true)) reference.scroll_go(where);
			}
		}
		
	}
	
	function scroll_btn_del (where:Number)
	{
		removeMovieClip(this._anchor[this._nome+"_function"]["btn_"+where]);
	}	
}