Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [AS3] Help bloccato su preload

    Vi prego gentilmente di aiutarmi con l'as3 perchè solo da pochi giorni ho deciso di passare a questo tipo di codice.

    In questo sito qui tutto funziona, ma non riesco a modificare la classe associata per inserire un preload iniziale, si tratta di 300kb di swf ma per evitare disagi alle connessioni lente vorrei fare come facevo in as2.

    Questo è il codice as della classe che controlla il menu:

    codice:
    package
    {
    	import flash.display.MovieClip;
    	import flash.events.MouseEvent;
    	
    	public class Main extends MovieClip
    	{
    		private var menu_array:Array;
    		private var section_array:Array;
    		
    		private var currentSection:int=0;
    		private var nextSection:int;
    		
    		public function Main()
    		{
    			init();
    		}
    		
    		private function init():void
    		{
    			menu_array=new Array(menu_mc.menu1_mc,menu_mc.menu2_mc,menu_mc.menu3_mc,menu_mc.menu4_mc,menu_mc.menu5_mc);
    			section_array=new Array(section1_mc,section2_mc,section3_mc,section4_mc,section5_mc);
    			
    			stage.frameRate=31;
    			
    			stopAll();
    			
    			addMenuEvents();
    			
    			hideCurrentSection();
    		}
    		
    		private function stopAll():void
    		{
    			for(var i:int=0;i < menu_array.length;i++)
    			{
    				menu_array[i].stop();
    				section_array[i].stop();
    			}
    		}
    		
    		private function addMenuEvents():void
    		{
    			for(var i:int=0;i < menu_array.length;i++)
    			{
    				menu_array[i].mouseChildren=false;
    				menu_array[i].buttonMode=true;
    				
    				menu_array[i].id=i;
    				menu_array[i].isPressed=false;
    				
    				menu_array[i].addEventListener(MouseEvent.MOUSE_OVER,setOver);
    				menu_array[i].addEventListener(MouseEvent.MOUSE_OUT,setOut);
    				menu_array[i].addEventListener(MouseEvent.MOUSE_DOWN,setDown);
    				menu_array[i].addEventListener(MouseEvent.MOUSE_UP,setUp);
    			}
    		}
    		
    		private function setOver(evt:MouseEvent):void
    		{
    			if(evt.target.isPressed==false)
    				evt.target.gotoAndStop(2);
    		}
    		
    		private function setOut(evt:MouseEvent):void
    		{
    			if(evt.target.isPressed==false)
    				evt.target.gotoAndStop(1);
    		}
    		
    		private function setDown(evt:MouseEvent):void
    		{
    			nextSection=evt.target.id;
    			checkState(evt.target.id);
    			
    			evt.target.gotoAndStop(3);
    			hideCurrentSection();
    			
    			currentSection=evt.target.id;
    		}
    		private function setUp(evt:MouseEvent):void
    		{
    			if(evt.target.isPressed==false)
    				evt.target.gotoAndStop(1);
    		}
    		
    		private function checkState(n:int):void
    		{
    			for(var i:int=0;i < menu_array.length;i++)
    			{
    				if(i==n)
    					menu_array[i].isPressed=true;
    				else
    				{
    					menu_array[i].isPressed=false;
    					menu_array[i].gotoAndStop(1);
    				}
    			}
    		}
    		
    		private function hideCurrentSection():void
    		{
    			section_array[currentSection].gotoAndPlay(31);
    			showSection();
    		}
    		
    		private function showSection():void
    		{
    			section_array[nextSection].gotoAndPlay(2);
    		}
    	}
    }
    Il sito è tutto su un keyframe, ora se provo a spostare il contenuto sul keyframe 2, e su un unico keyframe vuoto (il primo), metto questo codice:

    codice:
    stop();
    //stage.frameRate=31;
    this.addEventListener(Event.ENTER_FRAME,checkProgress);
    
    function checkProgress(_progress:Event):void
    {
    	var bytes_loaded:Number=_progress.target.loaderInfo.bytesLoaded;
    	var bytes_total:Number=_progress.target.loaderInfo.bytesTotal;
    	var percent:Number=Math.round(bytes_loaded/bytes_total*100);
    	info_txt.text=percent.toString()+' %';
    	if(percent>=100)
    	{
    		this.removeEventListener(Event.ENTER_FRAME,checkProgress);
    		this.gotoAndPlay(2);
    		lets_go();
    	}
    }
    
    function lets_go():void
    {
    	trace('ready to start');
    }
    il filmato rimane in stop sul fotogramma 1 non andando al 2, ma non solo, anche se provo a non mettere il preload spostando tutto sul fotogramma 2 e lasciando il primo vuoto, il menu va di nuovo in loop senza poterlo selezionare.

    Mi spiegate cosa devo fare per mettere il maledetto preload e come evitare il blocco del menu?


  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Ho testato il tuo codice e mi fa lo stesso giochetto che hai constatato, per il lopp comunque basta che al posto di gotoAndPlay metti gotoAndStop e quello lo risolvi, non si risolve invece il problema del progresso del preload che sembra bloccato finchè non arriva al 100%.
    Ho provato a fare un filmato nuovo con un'immagine di 650kb sul secondo frame e sul primo frame questo codice:

    Codice PHP:
    addEventListener(Event.ENTER_FRAMEenterframe);
    function 
    enterframe (evt:Event) {
        var 
    bl:uint stage.loaderInfo.bytesLoaded;
        var 
    bt:uint stage.loaderInfo.bytesTotal;
        var 
    pr:uint Math.floor((bl/bt)*100);
        if (!
    isNaN(pr)) {
            
    trace(pr+"%");
        }
        if (
    bl >= bt && bt pr && pr == 100) {
            
    removeEventListener(Event.ENTER_FRAMEenterframe);
            
    gotoAndStop(2);
        }
    }
    stop(); 
    Testato così funziona correttamente e mi fa vedere la percentuale corretta.

    Ti consiglio comunque un approccio diverso per il preload generale, ossia l'uso di un filmato "caricante" che carichi il tuo filmato principale inizialmente dentro ad un Loader e a fine preload lo sostituisca alla timeline principale:

    Codice PHP:
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESSprogressHandler);
    loader.contentLoaderInfo.addEventListener(Event.INITinitHandler);
    loader.load(new URLRequest("filmato_principale.swf"));
    function 
    progressHandler (evt:ProgressEvent):void {
        
    trace ((Math.floor((evt.bytesLoaded/evt.bytesTotal)*100))+"%");
    }
    function 
    initHandler (evt:Event):void {
        
    stage.addChildAt(loader.contentstage.numChildren-1);
        
    stage.removeChild(this);


  3. #3
    adesso provo a vedere e ti faccio sapere.
    grazie

  4. #4

    Ti consiglio comunque un approccio diverso per il preload generale, ossia l'uso di un filmato "caricante" che carichi il tuo filmato principale inizialmente dentro ad un Loader e a fine preload lo sostituisca alla timeline principale:

    Codice PHP:
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESSprogressHandler);
    loader.contentLoaderInfo.addEventListener(Event.INITinitHandler);
    loader.load(new URLRequest("filmato_principale.swf"));
    function 
    progressHandler (evt:ProgressEvent):void {
        
    trace ((Math.floor((evt.bytesLoaded/evt.bytesTotal)*100))+"%");
    }
    function 
    initHandler (evt:Event):void {
        
    stage.addChildAt(loader.contentstage.numChildren-1);
        
    stage.removeChild(this);

    non mi funziona, ho creato un file swf con nel primo key il codice ma quando lo avvio non carica nulla..

    questo è l'errore:

    codice:
    0%
    22%
    44%
    66%
    88%
    100%
    TypeError: Error #1009: Impossibile accedere a una proprietà o a un metodo di un riferimento oggetto null.
    	at Main/init()
    	at Main()
    per la prima soluzione non va, si funziona con l'immagine ma avendo un menu con class nella main non mi funziona piu il meno, praticamente vedo il menu andare in loop continuo sui pulsanti, c'è qualcosa che va in conflitto, se mi puoi aiutare, io carico il sorgente sul mio spazio web e ti posto qui il link per scaricarlo.

    Dimmi tu.

  5. #5
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Prova a commentare nella funzione init() la riga dello stage.frameRate.

  6. #6
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Originariamente inviato da Malestorm

    per la prima soluzione non va, si funziona con l'immagine ma avendo un menu con class nella main non mi funziona piu il meno, praticamente vedo il menu andare in loop continuo sui pulsanti, c'è qualcosa che va in conflitto, se mi puoi aiutare, io carico il sorgente sul mio spazio web e ti posto qui il link per scaricarlo.
    Puoi caricarlo in ogni caso, così se qualcun altro vuole, potrà comunque aiutarti senza aspettare me.

  7. #7
    non cambia nulla

    possibile che con questo tipo di classe non si riesce a mettere un preload?

    qui il sorgente: download

  8. #8

  9. #9

  10. #10
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Ok, l'errore c'è perchè le azioni vengono compiute prima che Main venga aggiunto allo stage, ma se modifichi la classe in questa maniera, funziona (almeno a me funziona):

    Codice PHP:
    package code
    {
        
    import flash.display.MovieClip;
        
    import flash.events.Event;
        
    import flash.events.MouseEvent;
        
        public class 
    Main extends MovieClip
        
    {
            private var 
    menu_array:Array;
            private var 
    section_array:Array;
            
            private var 
    currentSection:int=0;
            private var 
    nextSection:int;
            
            public function 
    Main()
            {
                
    init();
            }
            
            private function 
    init():void
            
    {
                
    addEventListener(Event.ADDED_TO_STAGEadded);
            }
            private function 
    added(evt:Event):void
            
    {
                
    removeEventListener(Event.ADDED_TO_STAGEadded);
                
    menu_array=new Array(menu_mc.menu1_mc,menu_mc.menu2_mc,menu_mc.menu3_mc,menu_mc.menu4_mc,menu_mc.menu5_mc);
                
    section_array=new Array(section1_mc,section2_mc,section3_mc,section4_mc,section5_mc);
                
                
    stage.frameRate=31;
                
                
    stopAll();
                
                
    addMenuEvents();
                
                
    hideCurrentSection();
            }
            
            private function 
    stopAll():void
            
    {
                for(var 
    i:int=0;menu_array.length;i++)
                {
                    
    menu_array[i].gotoAndStop(1);
                    
    section_array[i].stop();
                }
            }
            
            private function 
    addMenuEvents():void
            
    {
                for(var 
    i:int=0;menu_array.length;i++)
                {
                    
    menu_array[i].mouseChildren=false;
                    
    menu_array[i].buttonMode=true;
                    
                    
    menu_array[i].id=i;
                    
    menu_array[i].isPressed=false;
                    
                    
    menu_array[i].addEventListener(MouseEvent.MOUSE_OVER,setOver);
                    
    menu_array[i].addEventListener(MouseEvent.MOUSE_OUT,setOut);
                    
    menu_array[i].addEventListener(MouseEvent.MOUSE_DOWN,setDown);
                    
    menu_array[i].addEventListener(MouseEvent.MOUSE_UP,setUp);
                }
            }
            
            private function 
    setOver(evt:MouseEvent):void
            
    {
                if(
    evt.target.isPressed==false)
                    
    evt.target.gotoAndStop(2);
            }
            
            private function 
    setOut(evt:MouseEvent):void
            
    {
                if(
    evt.target.isPressed==false)
                    
    evt.target.gotoAndStop(1);
            }
            
            private function 
    setDown(evt:MouseEvent):void
            
    {
                
    nextSection=evt.target.id;
                
    checkState(evt.target.id);
                
                
    evt.target.gotoAndStop(3);
                
    hideCurrentSection();
                
                
    currentSection=evt.target.id;
            }
            private function 
    setUp(evt:MouseEvent):void
            
    {
                if(
    evt.target.isPressed==false)
                    
    evt.target.gotoAndStop(1);
            }
            
            private function 
    checkState(n:int):void
            
    {
                for(var 
    i:int=0;menu_array.length;i++)
                {
                    if(
    i==n)
                        
    menu_array[i].isPressed=true;
                    else
                    {
                        
    menu_array[i].isPressed=false;
                        
    menu_array[i].gotoAndStop(1);
                    }
                }
            }
            
            private function 
    hideCurrentSection():void
            
    {
                
    section_array[currentSection].gotoAndPlay(31);
                
    showSection();
            }
            
            private function 
    showSection():void
            
    {
                
    section_array[nextSection].gotoAndPlay(2);
            }
        }


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.