Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DanielD2

[Resolvido]Por que o stage no funciona dentro de uma classe

Recommended Posts

Boa Tarde a todos.

 

Me problema é o seguinte toda a classe que eu crio e tenho que inserir o comando stage.addEventListener ou stage.align, eu já sei que não vai funcionar retorna um erro que é o seguinte:

 

TypeError: Error #1009: Cannot access a property or method of a null object reference.

at modulo::AdaptaSite$iinit()

at adapta_fla::MainTimeline/adapta_fla::frame1()

 

A classe que está retornando esse erro é a seguinte:

 

 

package modulo
{
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
    public class AdaptaSite extends MovieClip 
    {
        public function AdaptaSite() 
	{
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.addEventListener(Event.ACTIVATE, mouseAtivo);
            stage.addEventListener(Event.RESIZE, onResize);
        }

        public function mouseAtivo(evento:Event):void 
	{
            trace("evento ativo: " + evento);
        }
        public function onResize(evento:Event):void 
	{
            trace("stageWidth: " + stage.stageWidth + " stageHeight: " + stage.stageHeight);
        }
    }
}

eu chamo ela assim:

 

import modulo.AdaptaSite;
var teste:AdaptaSite = new AdaptaSite();

obviamente o arquivo AdaptaSite.as está na pasta modulo

 

quem puder me ajudar eu agradeço

 

feliz ano novo

 

ate+

 

PessoAll

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Edit:

Quando você está manipulando as propriedades do stage, você nao sabe de quem "stage" eh objeto ou seja você nao sabe a referencia dele por isso da o erro.

Para resolver isso você precisa passar pra essa classe AdaptaSite o palco onde você ta trabalhando.(essa é a primeira maneira de resolver)

 

A segunda é essa aqui abaixo:

 

Ao invés de instanciar a classe pelo frame use o Document Class na barra de propriedades

Compartilhar este post


Link para o post
Compartilhar em outros sites

O objeto não tem nenhuma referência ao stage até que o objeto seja adicionado a algum lugar no stage.

 

Uma outra solução é executar estes comandos somente depois de adicionado a algum lugar no stage.

 

Uma pequena adaptação resolveria isso;

 

package modulo
{
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
	public class AdaptaSite extends MovieClip 
	{
 	public function AdaptaSite() 
 	{
 	// Executar somente quando for adicionado ao stage
			this.addEventListener(Event.ADDED_TO_STAGE,adicionadoAoStage)
 	}
		public function adicionadoAoStage(evento:Event):void
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
 	stage.align = StageAlign.TOP_LEFT;
 	stage.addEventListener(Event.ACTIVATE, mouseAtivo);
 	stage.addEventListener(Event.RESIZE, onresize);
			// Remover depois de adicionado para não executar estes comando novamente.
			this.removeEventListener(Event.ADDED_TO_STAGE,adicionadoAoStage)
		}
 	public function mouseAtivo(evento:Event):void 
 	{
 	trace("evento ativo: " + evento);
 	}
 	public function onresize(evento:Event):void 
 	{
 	trace("stageWidth: " + stage.stageWidth + " stageHeight: " + stage.stageHeight);
 	}
	}
}

import modulo.AdaptaSite;
var teste:AdaptaSite = new AdaptaSite();
this.addChild(teste);

[]'S

Compartilhar este post


Link para o post
Compartilhar em outros sites

O objeto não tem nenhuma referência ao stage até que o objeto seja adicionado a algum lugar no stage.

 

Uma outra solução é executar estes comandos somente depois de adicionado a algum lugar no stage.

 

Uma pequena adaptação resolveria isso;

 

package modulo
{
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
	public class AdaptaSite extends MovieClip 
	{
 	public function AdaptaSite() 
 	{
 	// Executar somente quando for adicionado ao stage
			this.addEventListener(Event.ADDED_TO_STAGE,adicionadoAoStage)
 	}
		public function adicionadoAoStage(evento:Event):void
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
 	stage.align = StageAlign.TOP_LEFT;
 	stage.addEventListener(Event.ACTIVATE, mouseAtivo);
 	stage.addEventListener(Event.RESIZE, onresize);
			// Remover depois de adicionado para não executar estes comando novamente.
			this.removeEventListener(Event.ADDED_TO_STAGE,adicionadoAoStage)
		}
 	public function mouseAtivo(evento:Event):void 
 	{
 	trace("evento ativo: " + evento);
 	}
 	public function onresize(evento:Event):void 
 	{
 	trace("stageWidth: " + stage.stageWidth + " stageHeight: " + stage.stageHeight);
 	}
	}
}

import modulo.AdaptaSite;
var teste:AdaptaSite = new AdaptaSite();
this.addChild(teste);

[]'S

 

 

Não é interessante entregar o código 100% pronto, porque ai não ajuda e sim faz o dever de casa, o intuito seria mais ensinar a pescar.

Voltando ao código essa que você citou é uma maneira realmente de resolver mas "quebra" a orientação a objetos, visto que ele so precisa passar o objeto criado no Main para o construtor sem a necessidade de adicionar o evento.

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

OK! deu certo o que eu fiz foi atrelar o objeto Stage no proprio object corrente.

 

package modulo
{
	import flash.display.Stage;
	import flash.display.MovieClip;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	public class AdaptaSite
	{
		private var mc:MovieClip;
		private var mcStage:Stage;
		private var disparaCall:Function;
		private var propriedade:Object;
		public function AdaptaSite(_mc:MovieClip,_propriedade:Object = null)
		{
			propriedade = {funcao:_propriedade.funcao};
			disparaCall = propriedade.funcao;
			this.mc = _mc; 
			mcStage = _mc.stage; //--> agora faz parte da stage do objeto
			adcionaEvento();
		}
		public function adcionaEvento():void
		{
			mcStage.scaleMode = StageScaleMode.NO_SCALE;
			mcStage.align = StageAlign.TOP_LEFT;
			mcStage.addEventListener(Event.RESIZE, eventoMouse);
		}
		private function eventoMouse(evento:Event):void
		{
			propriedade = {tamW:mcStage.stageWidth,tamH:mcStage.stageHeight}
			disparaCall();
		}
		public function get propriedades():Object
		{
			return propriedade;
		}
	}
}

não sei se foi a maneira mais "cristã", funcionou mto bem... rsrsrs

 

obrigado pessoal mais uma vez

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiquei curioso, Kisuke. Pq isso quebra a orientação a objetos e como passo o objeto sem adicionar um evento?

 

Idem.

 

 

 

A água que alivia a sede é sempre bem vinda, é fruto da inteligência saber ofertá-la.

 

Apenas falar da fonte sem demonstrar o caminho é apenas uma miragem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O kisuke está certo, não é a maneira correta de se fazer, o que ensinei a fazer é mais uma adaptação técnica (popular gambiarra) para resolver o problema, tendo em vista que, para aqueles que estão começando, as vezes fica dificil forçar o usuário a seguir uma OOP mais adeguada, então nem sempre me apego a esses detalhes.

 

Posso dar vários motivos para não fazer isso, mas vou passar um que é bem fácil de entender. Vejamos as cofigurações que ele quis mudar: scaleMode e align.

Vocês concordam comigo que nem tanto o align, mas principalmente o scaleMode interfere muito no projeto?

 

Este tipo de mudança se refere como toda a aplicação vai se comportar, interferindo totalmente como os outro elementos vão se comportar no sistema. Não é uma boa pratica você fazer isso por uma classe que pode vir a ser usada em outro lugar, esse tipo de mudança cabe a classe Main do seu projeto.

 

Imagine se você pegar a API do youtube para colocar no seu site e quando você executa um Fullscreen ele mude a escala, alinhamento entre outras coisas no swf e ai? mesmo que quando ele saia do Fullscreen será que sua aplicação ainda vai estar 100% como estava antes? É bem provavel que não.

 

Como eu disse, esse é apenas um dos motivos, poderia listar uma série de razões "conceituais" ou "técnicas", mas por que complicar se eu posso simplificar neste caso.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigada Foxn, melhor impossível.

 

 

Conhecer outras possibilidades e discernir o momento oportuno para usá-las é para quem domina o assunto.

 

Compartilhar a sua experiência enriquece o nosso aprendizado.

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isso ai que o foxn citou e outros motivos tb.Uma maneira bem simples dele resolver isso seria passar o objeto stage para a classe via construtor e la no construtor ele setaria as propriedades que ele quisesse.

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou perguntar de novo pq esqueceram da minha pergunta. http://forum.imasters.com.br/public/style_emoticons/default/natal_ohmy.gif

 

Pq o Kisuke disse que fazer com ADDED_TO_STAGE quebra a orientação a objetos?

 

 

Please, me respondam. Fiquei muito curioso com isso.

 

Abraços,

 

 

Ô brother, a gente entrou aqui de gaiato (demos sorte de não levar pedradas, rsrsrs).

 

A fila anda, o autor já resolveu a sua necessidade.

 

Para maiores esclarecimentos, adicione um novo tópico.

 

http://forum.imasters.com.br/public/style_emoticons/default/natal_tongue.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Elektra, eu não criei o tópico. Também "entrei de gaiato" e vi um comentário que o Kisuki fez.

Vou perguntar de novo: Ele disse que usar ADDED_TO_STAGE quebra a orientação a objetos. Pq quebra?

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

linoart o que o Event.ADDED_TO_STAGE faz? Ele garante que objetos visuais foram de fato adicionado ao palco, mas no nosso exemplo acima eu não preciso usá-lo, pois eu não quero nada disso eu apenas quero que a minha classe saiba quem eh meu stage, pra saber onde adicionar as coisas. Claro que se eu não preciso usar o event então se eu usa-lo é porque to querendo de uma certa forma driblar o paradigma, pois pra eu conseguir o que eu quero, como já falei mil vezes so preciso passar o stage para o construtor da classe e pimba problema resolvido.Por isso eu disse que "quebra" a oop.

Lógico que eu não disse pra você nunca usar, claro que é pra usar sempre que for servir.

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Elektra, eu não criei o tópico. Também "entrei de gaiato" e vi um comentário que o Kisuki fez.

Vou perguntar de novo: Ele disse que usar ADDED_TO_STAGE quebra a orientação a objetos. Pq quebra?

 

Abraços,

 

Bem tranquilo, foi só pra furungar com o kisuke.

 

Se puxou, gostei de ver. Grande baiano.

 

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.