Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    73

    limitare l'area di spostamento di un Movieclip

    Buongiorno a tutti,
    sto facendo una solita mappa panoramica in cui il movieclip dove c'è la mappa subisce dinamicamente ( controllo._x e ._y )lo spostamento in alto, basso, dx e sx attraverso delle freccie ( bottoni ) e controllo attraverso ._xcale e ._yscale la percentuale di ingrandimento o riduzione tramite altri bottoni lente. Fin qui tutto bene.
    La mappa è grande al 100% quanto lo stage.
    Problema. Non riesco a controllare lo spostamento ed il drag in maniera dinamica.
    Cioè quando mi sposto con le freccie non riesco a costruire lo script in cui dico che le freccie non siano più attive appena i bordi della mappa ( nelle varie percentuali ) entra nello stage. Cioè voglio poter delimitare lo spostamento all'interno dello stage senza che si vedano i bordi. e questo vale anche per il drag
    Ho pubblicato la mia mappa al seguente indirizzo.

    http://beta.xtend.it/mappa_kronplatz/mappa_2.html

    se vi può essere di aiuto scrivo sotto
    l'esempio di script messo su di una freccia (DX)

    on (release) {
    setProperty(btnSx, _visible, true);
    var mcWidth:Number;
    mcWidth.valueOf(mcMappa._width);
    var x_position:Number;
    x_position.valueOf(mcMappa._x);
    getProperty(mcMappa, _xscale);
    trace(mcMappa._x);
    setProperty(mcMappa, _x, (mcMappa._x)+5);

    }
    mcMappa è il movie dove c'è la mappa

    bel grattacapo... il metodo hitTest mi potrebbe aiutare? se sì come???
    Consuelo O_o

  2. #2
    incredibile!!!
    ho creato proprio ieri una classe che fa al caso tuo!!!

    allora, dovresti:

    1) creare un filmato vuoto
    2) mettici il tuo disegno e chiamalo 'montagne'
    3) crei un simbolo con i tastini
    ZOOM +
    ZOOM -
    ZOOM minimo
    ZOOM massimo
    ZOOM normale

    poi fai tre frame:
    'inout' dove ci sono tutti questi tasti
    'out' dove manca il tasto ZOOM -
    'in' dove manca il tasto ZOOM +

    poi, per l'on(press) di ogni rispettivo tasto fai eseguire questi rispettivi metodi:
    this.zoom_in();
    this.zoom_out();
    this.zoom_min();
    this.zoom_max();
    this.zoom_normal();

    4) metti il tuo simbolo nel filmato, chiamandolo 'controller'. mi raccomando che sia concatenabile alla classe AS rmc
    5) salvi il codice che ti do in un file rmc.as, lo metti nella stessa cartella del tuo filmato
    6) vai nel tuo filmato e nel frame principale scrivi

    _root.controller.control(_root.montagne);
    _root.controller.zoom_set(50,200,10);

    dove i tre parametri sono lo zoom minimo, quello massimo e la velocità di scalatura dello zoom

    ECCO IL CODICE

    codice:
    class rmc extends MovieClip 
    {
    	var _tg:MovieClip;
    	var _maskname:String;
    	var _min:Number;
    	var _max:Number;
    	var _vel:Number;	
    	var _nx:Number;
    	var _ny:Number;
    	var _nw:Number;
    	var _nh:Number;
    	var _azv:Number;			// Actual Zoom Value
    	
    	function control (_tg:MovieClip)
    	{
    		this._tg		= _tg;
    		this._maskname	= this._tg._name+"_machera";		
    		
    		// creo una maschera 
    		_root.createEmptyMovieClip(this._maskname,_root.getNextHighestDepth());
    		
    		// posiziono l'area e la maschera		
    		_root[this._maskname]._x = this._nw = this._tg._x ;
    		_root[this._maskname]._y = this._nh = this._tg._y ;
    		
    		// disegno la maschera e la applico
    		this.draw_mask();
    		this._tg.setMask(_root[this._maskname]);				
    		
    	}
    	
    	function draw_mask()
    	{
    		with(_root[this._maskname]){
    		    lineStyle(1,0x000000,100);
    			beginFill( 0xFF0000 );
        		moveTo(0		, 0);			
    		 	lineTo(this._tg._width	, 0);
    		    lineTo(this._tg._width	, this._tg._height);
    		    lineTo(0		, this._tg._height);
    		    lineTo(0	, 0);			
    			endFill();			
    		}
    	}
    	
    	function zoom_set(_min:Number,_max:Number,_vel:Number)
    	{
    		this._min		= _min;
    		this._max		= _max;
    		this._vel		= _vel;
    		this._azv		= 100;
    		this._nw		= this._tg._width;
    		this._nh		= this._tg._height;
    		this._nx		= this._tg._x;
    		this._ny		= this._tg._y;
    	}
    	
    	function zoom_in()
    	{		
    		this.gotoAndStop('inout');
    		this._tg._width		= (this._nw/100)*(this._azv+this._vel);
    		this._tg._height	= (this._nh/100)*(this._azv+this._vel);		
    		if (this._azv+this._vel >= this._max)
    		{
    			this._tg._width		= (this._nw/100)*(this._max);
    			this._tg._height	= (this._nh/100)*(this._max);
    			this._azv = this._max;
    			this.gotoAndStop('out');
    		}
    		else
    		{
    			this._azv +=this._vel;
    		}		
    		if (this._azv > 100)	this.start_drag();			
    	}
    	
    	function zoom_out()
    	{
    		this.gotoAndStop('inout');
    		this._tg._width		= (this._nw/100)*(this._azv-this._vel);
    		this._tg._height	= (this._nh/100)*(this._azv-this._vel);	
    		if (this._azv-this._vel <= this._min)
    		{
    			this._tg._width		= (this._nw/100)*(this._min);
    			this._tg._height	= (this._nh/100)*(this._min);
    			this._azv = this._min;
    			this.gotoAndStop('in');
    		}
    		else
    		{
    			this._azv -=this._vel;
    			var t = this._tg;
    			if (t._x + t._width < this._nx + this._nw) t._x = this._nx + this._nw - t._width ;
    			if (t._y + t._height < this._ny + this._nh) t._y = this._ny + this._nh - t._height ;
    			if (t._x > this._nx ) t._x = this._nx ;
    			if (t._y > this._ny ) t._y = this._ny ;
    		}				
    		if (this._azv <= 100) 
    		{
    			this.stop_drag();
    			this._tg._x = this._nx ;
    			this._tg._y = this._ny ;
    		}
    	}
    	
    	function zoom_min()
    	{
    		this._tg._width		= (this._nw/100)*(this._min);
    		this._tg._height	= (this._nh/100)*(this._min);
    		this.center();		
    		this._azv = this._min;
    		stop_drag();
    		this.gotoAndStop('in');
    	}
    	
    	function zoom_max()
    	{
    		this._tg._width		= (this._nw/100)*(this._max);
    		this._tg._height	= (this._nh/100)*(this._max);
    		this.center();
    		this._azv = this._max;
    		start_drag();
    		this.gotoAndStop('out');
    	}
    	
    	function zoom_normal()
    	{
    		this._tg._width		= this._nw;
    		this._tg._height	= this._nh;
    		this.center();
    		this._azv = 100;
    		this.gotoAndStop('inout');
    	}
    	
    	function center()
    	{
    		this._tg._x = (2*this._nx + this._nw - this._tg._width)/2;
    		this._tg._y = (2*this._ny + this._nh - this._tg._height)/2;
    	}
    	
    	function start_drag()
    	{		
    		var a = this._nx + this._nw - this._tg._width;
    		var b = this._ny + this._nh - this._tg._height;
    		var c = this._nx; 
    		var d = this._ny; 
    		this._tg.onPress = function () { 
    			this.startDrag( false, a , b , c , d );
    		}
    		this._tg.onRelease = function () { 
    			stopDrag();
    		}
    	}
    	
    	function stop_drag()
    	{
    		this._tg.onPress = this._tg.onRelease = function () {}
    	}
    	
    	
    	
    }
    si vivono molte vite e si muore una volta sola

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    73
    a parte che dovrei rifare tutto,.. bella storia!!
    ma il mio problema è sulle freccie. non riesco a far capire al mio fla
    quando a il movieclip entra nello stage e mi fa vedere i bordi.
    So che potrei comandarlo lavorando sulle variabili x e y
    ma non so trovare l'espressione che mi calcoli la posizione
    delle x e delle y del mio movie clip a seconda dello zoom e a seconda dello spostamento.
    Cioè io dovrei dire ad ogni bottone di spostamento
    che si calcoli la poszione delle x o delle y, secondo la posizione attuale di esse e secondo la scala ( x_scale.)
    sono dati che riesco sempre a ricavare ( ho porvato con i trace ) ma non riesco a trovare la formula matematica.
    Mi chiedevo quindi se la variabile hitTest applicata al mio movieclip
    in collisione con un movie(trasparente) che corrisponda alla dimensione dello stage
    potesse funzionare... ma non so come...
    mi sono spiegata?.. spero di si...
    Consuelo O_o

  4. #4
    in un'ora avresti la tua soluzione se non ti fai spaventare dalle istruzioni.

    comunque,
    per gestire il tuo problema, devi innnanzitutto distinguere fra le coordinate e dimensioni del filmato interno e dello schermo all'interno del quale lo fai scrollare e zoomare.
    a questo punto hai tutti i dati sottomano per controllare la situazione.

    ad esempio, puoi disabilitare il tasto di spostamento a destra quando x_schermo + width_schermo >= x_filmato + width_filmato
    (ossia quando il bordo destro del filmato indietreggia sull'asse delle x rispetto al bordo destro dello schermo)

    Per limitare il draggaggio del tuo filmato interno con il mouse puoi utilizzare tutti i parametri di startDrag
    http://www.macromedia.com/support/fl...ionary681.html

    Per trovare le formule matematiche disegna un piano cartesiano (attenzione, le y crescono scendendo in basso) e mettici dentro il tuo filmato e il tuo schermo. poi individua ogni coordinata che conosci ed ecco che la situazione ti si farà più chiara
    si vivono molte vite e si muore una volta sola

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    73
    mh... sarà che non è giornata ma non ci riesco proprio..
    ci provo a ragionare un altro giorno.
    Grazie intanto..
    se ci riesco o no ti faccio sapere
    buona serata
    Elo
    Consuelo O_o

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    73
    Ciao dogeht,
    forse mi sarò complicata inutilmente la vita
    ma ho trovato la soluzione...
    cioè sulla freccia sx per esempio ho messo questo script:

    on (release) {
    btnDx._visible = true;
    var posX:Number = this._parent.mcMappa._x;
    var xScale:Number =this._parent.mcMappa._xscale;
    setProperty(this._parent.mcMappa, _x, posX-5);
    trace(xScale);
    trace(posX);
    if (this._parent.mcMappa._xscale == 110 && this._parent.mcMappa._x == -55 ||
    this._parent.mcMappa._xscale == 120 && this._parent.mcMappa._x == -110 ||
    this._parent.mcMappa._xscale == 130 && this._parent.mcMappa._x == -165 ||
    this._parent.mcMappa._xscale == 140 && this._parent.mcMappa._x == -220 ||
    this._parent.mcMappa._xscale == 150 && this._parent.mcMappa._x == -275 ||
    this._parent.mcMappa._xscale == 160 && this._parent.mcMappa._x == -330 ||
    this._parent.mcMappa._xscale == 170 && this._parent.mcMappa._x == -385 ||
    this._parent.mcMappa._xscale == 180 && this._parent.mcMappa._x == -440 ||
    this._parent.mcMappa._xscale == 190 && this._parent.mcMappa._x == -495 ||
    this._parent.mcMappa._xscale == 200 && this._parent.mcMappa._x == -550 ||
    this._parent.mcMappa._xscale == 210 && this._parent.mcMappa._x == -605 ||
    this._parent.mcMappa._xscale == 220 && this._parent.mcMappa._x == -660 ||
    this._parent.mcMappa._xscale == 230 && this._parent.mcMappa._x == -715 ||
    this._parent.mcMappa._xscale == 240 && this._parent.mcMappa._x == -770 ||
    this._parent.mcMappa._xscale == 250 && this._parent.mcMappa._x == -825 ||
    this._parent.mcMappa._xscale >= 250
    ) {
    btnSx._visible = false;
    }
    nella freccia su uguale, solo ho cambiato le coordinate dell y
    mentre su quella Dx e Down, ho dato come unico valore lo 0 ovviamente.
    ho pubblicato sulla beta la nuova
    versione.http://beta.xtend.it/mappa_kronplatz/mappa.html

    sai come potrei però trovare una formula che mi riassuma lo script sopra?...
    Consuelo O_o

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.