Jump to content
Sign in to follow this  
carcleo

Carregando swf em um frame específico

Recommended Posts

carcleo

Como faço para carregar swf em um frame específico?

Tipo. Frame 80. É nele que tenho um mc vazio que quero carregar um mc Externo nele de forma tal que os demais frames não possam ver.

Como fazer isso?

Share this post


Link to post
Share on other sites
clera

boas, podes meter o codigo para o carregar nesse frame.. e ai indicas o movieClip em que o queres pôr (o movieClip em questão tambem tem de estar no frame 80)

ou então para o carregares ao inicio o movieClip em questão tem de estar no frame do codigo e podes torná-lo invisivel. mostrando-o apenas no frame 80  ;)

Share this post


Link to post
Share on other sites
carcleo

Boas.

Esse problema me tem sido resolvido.

Porem. Agora estou a ter outro problema:

O swf esterno que estou a carregar, tem um barra de scroll (scrollbar) que, em seu painel de propriedades(a partir do library) esta a chamar um arquivo .as(scrollbar.as) com a Classe Scrollbar.

E, a partir do swf pai, não esta sendo reconhecida.

Veja os erros:

TypeError: Error #1009: Não é possível acessar uma propriedade ou um método de uma referência de objeto nula.
at Scrollbar/setupEvents()
at Scrollbar()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at treinamento_fla::treinamento_1()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
TypeError: Error #1009: Não é possível acessar uma propriedade ou um método de uma referência de objeto nula.
at treinamento_fla::treinamento_1/frame1()
TypeError: Error #1009: Não é possível acessar uma propriedade ou um método de uma referência de objeto nula.
at treinamento_fla::treinamento_1/imageLoaded()

Rodando o swf externo sozinho, tudo funciona bem. Mas, rodado ele através do swdf pai, ai dá o erro.

Segue a classe(consegui aqui no forum:

package  {
        import flash.display.*;
        import flash.events.*;
        
     public class Scrollbar extends MovieClip 
 {
                
        private var yOffset:Number;
        private var yMin:Number;
        private var yMax:Number;
        private var content:Object;

        public function setContent(h:Number, ctn:Object):void 
	{
          track.height = h;
          content = ctn;
          yMin = 0; //definicao do limite minimo da posicao y do MC thumb
          yMax = track.height - thumb.height; // definicao do limite maximo da posicao y do MC  thumb
        }		
        private function setupEvents():void 
	{
          this.buttonMode = true; //mostra o cursor do rato sempre que se faz rollover
          thumb.addEventListener(MouseEvent.MOUSE_DOWN, thumbDown);
          stage.addEventListener(MouseEvent.MOUSE_UP, thumbUp);                   
        }		
        public function Scrollbar() 
	{
          //setScrollbarProperties();			
          setupEvents();
        }
        private function thumbDown(e:MouseEvent):void 
	{
          stage.addEventListener(MouseEvent.MOUSE_MOVE, thumbMove);
          yOffset = mouseY - thumb.y;
        }
        private function thumbUp(e:MouseEvent):void 
	{
          stage.removeEventListener(MouseEvent.MOUSE_MOVE, thumbMove);
        }	
        private function thumbMove(e:MouseEvent):void 
	{
          thumb.y = mouseY - yOffset;
          if(thumb.y < yMin) thumb.y = yMin;
          if(thumb.y > yMax) thumb.y = yMax;
          var sp:Number = thumb.y / yMax; // criei esta var so para facilitar a formula escrita a seguir...
          content.y = -sp * (content.height - track.height); //formula para "scrollar" o conteudo (MC imagesContainer)
        }		

    }
}

Share this post


Link to post
Share on other sites
coxosclassic

Boas!

esse problema poderá estar aqui (na funcao setupEvents()):

stage.addEventListener(MouseEvent.MOUSE_UP, thumbUp);

provavelmente o objecto "stage" esta a dar nulo pois a scrollbar ainda nao foi adiiconada ao stage...

para poderes testar faz o seguinte, na funcao setupEvents(), adiciona o trace:

private function setupEvents():void
{
        trace(stage);// deve dar null...

this.buttonMode = true;//mostra o cursor do rato sempre que se faz rollover
thumb.addEventListener(MouseEvent.MOUSE_DOWN, thumbDown);
stage.addEventListener(MouseEvent.MOUSE_UP, thumbUp);
}

se o trace retornar null, muda o construtor Scrollbar para:

public function Scrollbar()
{
//setScrollbarProperties();
this.addEventListener(Event.ADDED_TO_STAGE, setupEvents);
}

e a funcao setupEvents para:

private function setupEvents(e:Event):void
{
this.buttonMode = true;//mostra o cursor do rato sempre que se faz rollover
thumb.addEventListener(MouseEvent.MOUSE_DOWN, thumbDown);
stage.addEventListener(MouseEvent.MOUSE_UP, thumbUp);
}

desta maneira, iras "inicializar" a scrollbar apenas quando esta estiver no stage (Event.ADDED_TO_STAGE)

espero que ajude,

cc


Cumps,

cc

Share this post


Link to post
Share on other sites
carcleo

Isto resolveu.

Estou com mais outro problema:

Estou a carregar imagens ao stage por xml.

Então, como as imagems são grandes, gostaria de fazer um preloader para o carregamento das imagens.

meu codigo é esse:

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.Loader;
import flash.display.Sprite;

var imagesData:XML;
var imgCounter:int = 0;

var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, dataLoadedHandler);
loader.load(new URLRequest("treinamento.xml"));

imagesContainer.visible = false;
scrollbar.visible = false;

function dataLoadedHandler(e:Event):void {

imagesData = new XML(e.target.data);

var imageLoader:Loader;

for(var i:uint; i < imagesData.img.length(); i++)
{
	imageLoader = new Loader();
	imagesContainer.addChild(imageLoader);
	imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
	imageLoader.load(new URLRequest(imagesData.img[i].@path));
}
}

function imageLoaded(e:Event):void {

imgCounter++;

if(imgCounter == imagesData.img.length()) {		

	for( var i:uint; i < imagesData.img.length(); i++) {

		if(i > 0){
                                
			imagesContainer.getChildAt(i).y = imagesContainer.getChildAt(i-1).y + imagesContainer.getChildAt(i-1).height;
		}
	}

	scrollbar.setContent(maskMC.height, imagesContainer);

	imagesContainer.visible = true;
	scrollbar.visible = true;
}
}

Será que se eu fizer um preloader para o objeto imageLoader, eu estaria fazendo o preloader para as imagens? Se não, como fazer esse preloade?

Share this post


Link to post
Share on other sites
carcleo

Fiz da foma abaixo mas o carregador ficou maluco.

Onde será que errei?

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.Loader;
import flash.display.Sprite;

var imagesData:XML;
var imgCounter:int = 0;

var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, dataLoadedHandler);
loader.load(new URLRequest("treinamento.xml"));

imagesContainer.visible = false;
scrollbar.visible = false;


function dataLoadedHandler(e:Event):void {
        
        imagesData = new XML(e.target.data);
        
        var imageLoader:Loader;

        totalpaginas.text="Este treinamento possui "+imagesData.img.length()+" Páginas.";
        aguarde.text="Por favor, aguarde o carregamento de todas elas!";
        
        for(var i:uint; i < imagesData.img.length(); i++)
        {
                imageLoader = new Loader();
                imagesContainer.addChild(imageLoader);
                imageLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, carregando);
                imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
                imageLoader.load(new URLRequest(imagesData.img[i].@path));
        }
}

function carregando(evt:ProgressEvent):void {
var perc:Number=evt.bytesLoaded/evt.bytesTotal;
barra_treina.scaleX=perc;
percentual.text=Math.floor(perc*100)+"%";
}

function imageLoaded(e:Event):void {
        
        imgCounter++;
        
        if(imgCounter == imagesData.img.length()) {             
                
                for( var i:uint; i < imagesData.img.length(); i++) {
                        
                        if(i > 0){
                                
                                imagesContainer.getChildAt(i).y = imagesContainer.getChildAt(i-1).y + imagesContainer.getChildAt(i-1).height;
                        }
                }
                
                scrollbar.setContent(maskMC.height, imagesContainer);
                
                imagesContainer.visible = true;
                scrollbar.visible = true;
                totalpaginas.visible=false;
                aguarde.visible=false;
                percentual.visible=false;
                barra_treina.visible=false;
			fundo_barra.visible=false;
        }
}

Veja em: http://www.bateriasadvance.com.br/

depois vá no menu Informações Úteis

depois vá em Treinamento Técnico.

Share this post


Link to post
Share on other sites
coxosclassic

:cheesygrin:

Pois! Mas o carregador nao ficou maluco! até ta a ter o comportamento correcto  :cheesygrin:

Repara que tas a mandar carregar 33 imagens ao mesmo tempo através do teu for() loop...

os valores de e.bytesLoaded e de e.bytesTotal, sao referentes ao tamanho (em bytes) de cada imagem que está a ser carregada, e não de todas as imagens que estão a ser carregadas... Logo o teu carregador estar a ter um comportamento maluco (mas certo)

Tenta isto:

cria 4 novas variaveis:

var totalBytes:Number = 0; //valor dos bytes total de TODAS as imagens
var loadedBytes:Number = 0; //valor actual dos bytes carregados de TODAS as imagens
var prevLoadedBytes:Number = 0; //ira servir para determinar o valor de loadedBytes
var loaderCounter:Number = 0;  //referencia para determinar o valor de totalBytes

Agora na tua funcao carregando():

function carregando(evt:ProgressEvent):void {
        
        loaderCounter++;

if(loaderCounter <= imagesData.img.length()) {
	totalBytes += e.bytesTotal;
                return;
}

loadedBytes += (e.bytesLoaded - prevLoadedBytes);

if(e.bytesLoaded == e.bytesTotal) prevLoadedBytes = 0;
else prevLoadedBytes = e.bytesLoaded;

        var perc:Number = loadedBytes / totalBytes;
        barra_treina.scaleX=perc;
        percentual.text=Math.floor(perc*100)+"%";
}

Agora o calculo da variavel perc, está a ser feito num todo (todas as imagens) e nao individualmente (por imagem)

Se calhar existem formas mais simples de fazer isto, se alguem tiver outra abordagem, diga!

cumps,

cc


Cumps,

cc

Share this post


Link to post
Share on other sites
carcleo

Fui orientado pelo moderador daqui do forum a usar caurina transitions na minha scrollbar.

Mas acontece o seguinte:

O conteudo do Movie Clipe recipiente(que carrega o que será rolado), inicia todo alinhado acima. Porem, após a primeira rolagem do objeto scroll, quando puxo ele novamente até acima, o conteudo do recipiente não sobe todo.

Onde será que esta esse erro?

Segue o código;

(Não arrepare pois coloquei tudo numa função para usar em varios frames):

function CarregaScroll(scrollbar:MovieClip,barra_scroll:MovieClip,scroller:MovieClip,especificacoes:MovieClip,mascara:MovieClip)
{
  
var yscroller:Number;
var yMin:Number = 0;
var yMax:Number = barra_scroll.height - scroller.height;

scroller.addEventListener(MouseEvent.MOUSE_DOWN, Rolar);
stage.addEventListener(MouseEvent.MOUSE_UP, Parar);

function Rolar(e:MouseEvent):void
{
stage.addEventListener(MouseEvent.MOUSE_MOVE, scrollerMove);
yscroller = mouseY - scroller.y;
}

function Parar(e:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_MOVE, scrollerMove);
}

function scrollerMove(e:MouseEvent):void
{
scroller.y = mouseY - yscroller;
if(scroller.y <= yMin)
	scroller.y = yMin;
if(scroller.y >= yMax)
	scroller.y = yMax;
var scrollerpercent:Number = scroller.y / yMax;
Tweener.addTween(especificacoes, {y:(-scrollerpercent*(especificacoes.height-mascara.height)),
						   time:1});
e.updateAfterEvent();
}
}

Share this post


Link to post
Share on other sites
coxosclassic

B)

Tens o mesmo problema da outra thread que abriste? (pensei que tinha ficado resolvido):

http://www.portugal-a-programar.pt/index.php?showtopic=51052

Os teus MCs nao estao alinhados correctamente (em y). Da uma vista de olhos e coloca-os todos com y = 0.0.

Por experiencia propria, quando se trabalha em flash (e nao so) convem ter TUDO o mais organizado possivel! (nomes das layers, nomes do MCs, posicionamento dos MCs, etc), caso contrario iremos ter sempre problemas!!

...

Fui orientado pelo moderador daqui do forum a usar caurina transitions na minha scrollbar.

...

Nao necessariamente... O tutorial que indiquei faz uso dessa class (Tweener), mas no mini-tutorial que te fiz, nao usei nenhuma class de tween (acho que nao faz sentido usar tweens para uma scrollbar...).

Quanto ao estares a criar a mesma funcao (carregaScroll()) em varias frames... isso nao é preciso para nada... basta usares 1 so vez a scrollbar e ires chamando a funcao setContent() cada vez que queiras alterar o conteudo da "scrollar"...

Se puderes envia-me o .fla que assim que eu tiver tempo, tento dar uma "geral" nisso.

cumps,

cc

Tenta prestar mais atencao ao que se diz por aqui... tas a complicar muito para uma coisa simples  ;)


Cumps,

cc

Share this post


Link to post
Share on other sites
coxosclassic

Boas,

Estive entao a ver os teus swfs, e deduzi que o problema estava no infuteis.swf.

tinhas varias chamadas a varias scrollbars, isso nao é necessario visto que uma so scrllbar faz o trabalho todo... (escusas de ter tanto codigo para a mesma coisa) basta apenas chamar a funcao setContent() da scrollbar de cada vez que mudas de conteudo.

Uma outra coisa que tb reparei foi que puseste o conteudo "treinamento" num swf aparte... (?) nao precisas!, basta colocar o codigo na ultima frame do teu swf... escusas de estar a carregar mais 1 swf...

Fiz isso um bocado a pressa pois nao tou com muito tempo disponivel, ainda ha muita coisa que podes melhorar, mas o que importa é que esta a funcionar correctamente.

Apenas mudei o swf infuteis, e nao precisas mais do swf treinamento:

http://www.brunoperry.net/stuff/as3/infuteis.fla

alguam duvida avisa,

cumps,

cc


Cumps,

cc

Share this post


Link to post
Share on other sites
carcleo

Ai compilou direito?

Aqui deu os seguintes erros quando cliko nos menus:

TypeError: Error #1006: setContent não é uma função.
at infuteis_fla::MainTimeline/frame20()
at flash.display::MovieClip/gotoAndStop()
at infuteis_fla::MainTimeline/clique()
TypeError: Error #1006: setContent não é uma função.
at infuteis_fla::MainTimeline/frame40()
at flash.display::MovieClip/gotoAndStop()
at infuteis_fla::MainTimeline/clique()
TypeError: Error #1006: setContent não é uma função.
at infuteis_fla::MainTimeline/frame60()
at flash.display::MovieClip/gotoAndStop()
at infuteis_fla::MainTimeline/clique()
TypeError: Error #1006: setContent não é uma função.
at infuteis_fla::MainTimeline/frame80()
at flash.display::MovieClip/gotoAndStop()
at infuteis_fla::MainTimeline/clique()

E as scrollbars não rolam.

Alguma orientação?

Share this post


Link to post
Share on other sites
coxosclassic

boas,

certifica-te que tens a class Scrollbar.as na mesma pasta do infuteis.fla. Pode ser que esteja ai o prob.


Cumps,

cc

Share this post


Link to post
Share on other sites
carcleo

Realmente a classe não estava na pasta para onde fiz o download e aqueles erros se foram.

Mas, faz me um favor?

Rode novamente o swf e clike no menu dicas de uso por exemplo.

Verifica que o texto começa em "Para melhor conservação...."

Bom, observado isso, mecha com  scrollbar para baixo e depois sobe ela toda.

Verifica novamento onde o texto começa.

Obsrve que foram "Engolidas" as duas primeiras linhas do texto

Esse é o problema que estou tendo.

Isso tambem ocorre com os ítens; "o que é alernador"  e  "Especicações Técnicas"

No aguardo.

Outra dificuldade que estou a ter é que preciso arranjar uma forma de alterar o tamanho das imagens carregadas pelo xml uma vez que não consigo, na hora de esportar do .pdf para imagem, informar tamanhos. O proprio pdf dita o tamanho que ele quer exportar.

Share this post


Link to post
Share on other sites
coxosclassic

Boas,

tenho estado ocupado por isso nao tem dado para vir aqui.

para solucionar isso de uma vez por todas, cria uma nova variavel na class Scrollbar.as:

private var originalY:Number;

agora na funcao setContent():

public function setContent(h:Number, ctn:Object):void {

track.height = h;
content = ctn;
originalY = content.y;
reset();
}

por fim, na funcao thumbMove():

private function thumbMove(e:MouseEvent):void {

thumb.y = mouseY - yOffset;

if(thumb.y < yMin) thumb.y = yMin;
if(thumb.y > yMax) thumb.y = yMax;

var sp:Number = thumb.y / yMax;

content.y = -sp * (content.height - track.height) + originalY;
}


Cumps,

cc

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.