Ir para conteúdo

POWERED BY:

Arquivado

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

ahsc

[Resolvido] array multidimensional

Recommended Posts

Olá a todos. Estou com um probleminha aqui e não consigo resolvê-lo. Estou montando um sisteminha em flash e preciso que os mc's sejam dragáveis. Até aí não tem problema, foi fácil. Porém, eu gostaria de desabilitar o drag quando esse mc fizesse o evento do hitTest(); ou seja, assim que ele bater em algo o mc pára de ser dragável e só volta quando um determinado botão for pressionado. Até esse ponto jóia, utilizei uma flag para identificar cada objeto e à medida que o objeto efetuava o evento de hitTest(); ele alterava a flag daquele objeto.

 

Só que como se tratam de vários mcs(objeto), a quantidade de variáveis ficaria muito grande de forma que eu resolvi criar funções e dessas funções passar parâmetros que habilitariam ou não o drag().

 

O que eu preciso:

 

quando o clipe é executado os mcs presiam estar liberados para o drag(); e isso eu fiz usando uma função que insere em uma array a estância do mc que eu quero manipular e um número boleano (1 ou 0) para liberar ou não o drag(). No mc que seria arrastado eu chamo uma outra função que vai checar a array que os dados foram inseridos para saber se ele pode ou não ser arrastado.

 

desta forma o estrutura que eu gostaria que fosse executada seria a seguinte:

 

uma array multi dimensional

 

arraychecagem[] = arrayatributos_do_objeto[estância do objeto, boleano];

 

eu tentei criar essa arry dinâmica mais não deu certo. fiz assim:

 

//função para habilitar um objeto para ser arrastado
function habilitaDrag(objeto, valor)
{
	
    /*a idéia aqui é criar uma array multidimensional do tipo:
     
      dragaveis[0] = ["objeto", "valor"];
      dragaveis[1] = ["objeto", "valor"];
      só que dessa forma não funciona e eu não consegui achar uma solução. Aqui é o meu problema.
     
    */
    dragaveis.push(valida.push(objeto),valida.push(objeto));
	

}


quando o filme inicia (evento load) eu chamo a função e passo para ela qual objeto quero que seja arrastado. o evento está no mc que está no palco

eis o código.

 


onClipEvent(load){

	_root.posicaoObjetos(this,110, 23);
	
	/*quando carregar, habilita o objeto para ser arrastado*/
	_root.habilitaDrag(this,1);
	
	
	
}


após habilitado para o drag, quando o usuário clica (press) no objeto ele chama outra função para verificar se ele pode ou não ser arrastado. Eis o código:

 


on (press) {
	
    _root.arrastar(this);
	
}

e aqui a função que faz o objeto se arrastado conforme sua situação dentro da array dragáveis.

 


function arrastar(objeto, valor)
{
	//looping para verificar quantos itens há na array
	looping = dragaveis.length;
	for(i=0; i<looping; i++)
	{
		//se a posição [0][1] tiver um boleano 1 (pode arrastar)
                if(dragaveis[i][1] == 1)
		{
			//se o objeto da posição 0 da array for igual a instância passada pode arrastar
                        if(dragaveis[i][0] == objeto)
			{
				objeto.startDrag();
				//trace(dragaveis[i][0]);
				//trace(dragaveis[i][1]);
			}
			else
			{
				trace("o objeto não pode ser arrastado");
				//trace(dragaveis[i][0]);
				//trace(dragaveis[i][1])
			}
		}
	}
	
	
}

não sei se é algum problema de lógica ou se está errado a função que cria a array multidimensional mais o fato é que para um objeto funciona, para vários não.

 

Pelo que pude ver aqui o problema maior está na criação da array multidimensional se alguém puder me dar uma forcinha.....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá a todos. Estou com um probleminha aqui e não consigo resolvê-lo. Estou montando um sisteminha em flash e preciso que os mc's sejam dragáveis. Até aí não tem problema, foi fácil. Porém, eu gostaria de desabilitar o drag quando esse mc fizesse o evento do hitTest(); ou seja, assim que ele bater em algo o mc pára de ser dragável e só volta quando um determinado botão for pressionado. Até esse ponto jóia, utilizei uma flag para identificar cada objeto e à medida que o objeto efetuava o evento de hitTest(); ele alterava a flag daquele objeto.

 

Só que como se tratam de vários mcs(objeto), a quantidade de variáveis ficaria muito grande de forma que eu resolvi criar funções e dessas funções passar parâmetros que habilitariam ou não o drag().

 

O que eu preciso:

 

quando o clipe é executado os mcs presiam estar liberados para o drag(); e isso eu fiz usando uma função que insere em uma array a estância do mc que eu quero manipular e um número boleano (1 ou 0) para liberar ou não o drag(). No mc que seria arrastado eu chamo uma outra função que vai checar a array que os dados foram inseridos para saber se ele pode ou não ser arrastado.

 

desta forma o estrutura que eu gostaria que fosse executada seria a seguinte:

 

uma array multi dimensional

 

arraychecagem[] = arrayatributos_do_objeto[estância do objeto, boleano];

 

eu tentei criar essa arry dinâmica mais não deu certo. fiz assim:

 

//função para habilitar um objeto para ser arrastado
function habilitaDrag(objeto, valor)
{
	
    /*a idéia aqui é criar uma array multidimensional do tipo:
     
      dragaveis[0] = ["objeto", "valor"];
      dragaveis[1] = ["objeto", "valor"];
      só que dessa forma não funciona e eu não consegui achar uma solução. Aqui é o meu problema.
     
    */
    dragaveis.push(valida.push(objeto),valida.push(objeto));
	

}


quando o filme inicia (evento load) eu chamo a função e passo para ela qual objeto quero que seja arrastado. o evento está no mc que está no palco

eis o código.

 


onClipEvent(load){

	_root.posicaoObjetos(this,110, 23);
	
	/*quando carregar, habilita o objeto para ser arrastado*/
	_root.habilitaDrag(this,1);
	
	
	
}


após habilitado para o drag, quando o usuário clica (press) no objeto ele chama outra função para verificar se ele pode ou não ser arrastado. Eis o código:

 


on (press) {
	
    _root.arrastar(this);
	
}

e aqui a função que faz o objeto se arrastado conforme sua situação dentro da array dragáveis.

 


function arrastar(objeto, valor)
{
	//looping para verificar quantos itens há na array
	looping = dragaveis.length;
	for(i=0; i<looping; i++)
	{
		//se a posição [0][1] tiver um boleano 1 (pode arrastar)
                if(dragaveis[i][1] == 1)
		{
			//se o objeto da posição 0 da array for igual a instância passada pode arrastar
                        if(dragaveis[i][0] == objeto)
			{
				objeto.startDrag();
				//trace(dragaveis[i][0]);
				//trace(dragaveis[i][1]);
			}
			else
			{
				trace("o objeto não pode ser arrastado");
				//trace(dragaveis[i][0]);
				//trace(dragaveis[i][1])
			}
		}
	}
	
	
}

não sei se é algum problema de lógica ou se está errado a função que cria a array multidimensional mais o fato é que para um objeto funciona, para vários não.

 

Pelo que pude ver aqui o problema maior está na criação da array multidimensional se alguém puder me dar uma forcinha.....

 

Porque você não deixa o array de lado e tenta fazer com variáveis boolean simples dentro do movieClip, ao bater em algum lugar essa variável chaveia, e quando você clicar no tal determinado botao a variavel volta, será que não fica mais simples?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim eu até já fiz, mais vai ter uma quantidade enorme de variáveis devido ao grande número de objetos que serão mostrados. O sistema é daquele tipo de "monte seu produto" daí você imagina quantas possibilidades são.

 

Da forma que você sugeriu eu fiz e até aí não tem problema. O maior problema disso é na manutenção. Muitas variáveis dificulta a vida. Se usar funções aí sim fica fácil.

 

você sabe criar array's multidimensionais dinâmicas? O meu problema tá justo na criação dela.

 

vlw

 

Olá a todos. Estou com um probleminha aqui e não consigo resolvê-lo. Estou montando um sisteminha em flash e preciso que os mc's sejam dragáveis. Até aí não tem problema, foi fácil. Porém, eu gostaria de desabilitar o drag quando esse mc fizesse o evento do hitTest(); ou seja, assim que ele bater em algo o mc pára de ser dragável e só volta quando um determinado botão for pressionado. Até esse ponto jóia, utilizei uma flag para identificar cada objeto e à medida que o objeto efetuava o evento de hitTest(); ele alterava a flag daquele objeto.

 

Só que como se tratam de vários mcs(objeto), a quantidade de variáveis ficaria muito grande de forma que eu resolvi criar funções e dessas funções passar parâmetros que habilitariam ou não o drag().

 

O que eu preciso:

 

quando o clipe é executado os mcs presiam estar liberados para o drag(); e isso eu fiz usando uma função que insere em uma array a estância do mc que eu quero manipular e um número boleano (1 ou 0) para liberar ou não o drag(). No mc que seria arrastado eu chamo uma outra função que vai checar a array que os dados foram inseridos para saber se ele pode ou não ser arrastado.

 

desta forma o estrutura que eu gostaria que fosse executada seria a seguinte:

 

uma array multi dimensional

 

arraychecagem[] = arrayatributos_do_objeto[estância do objeto, boleano];

 

eu tentei criar essa arry dinâmica mais não deu certo. fiz assim:

 

//função para habilitar um objeto para ser arrastado
function habilitaDrag(objeto, valor)
{
	
    /*a idéia aqui é criar uma array multidimensional do tipo:
     
      dragaveis[0] = ["objeto", "valor"];
      dragaveis[1] = ["objeto", "valor"];
      só que dessa forma não funciona e eu não consegui achar uma solução. Aqui é o meu problema.
     
    */
    dragaveis.push(valida.push(objeto),valida.push(objeto));
	

}


quando o filme inicia (evento load) eu chamo a função e passo para ela qual objeto quero que seja arrastado. o evento está no mc que está no palco

eis o código.

 


onClipEvent(load){

	_root.posicaoObjetos(this,110, 23);
	
	/*quando carregar, habilita o objeto para ser arrastado*/
	_root.habilitaDrag(this,1);
	
	
	
}


após habilitado para o drag, quando o usuário clica (press) no objeto ele chama outra função para verificar se ele pode ou não ser arrastado. Eis o código:

 


on (press) {
	
    _root.arrastar(this);
	
}

e aqui a função que faz o objeto se arrastado conforme sua situação dentro da array dragáveis.

 


function arrastar(objeto, valor)
{
	//looping para verificar quantos itens há na array
	looping = dragaveis.length;
	for(i=0; i<looping; i++)
	{
		//se a posição [0][1] tiver um boleano 1 (pode arrastar)
                if(dragaveis[i][1] == 1)
		{
			//se o objeto da posição 0 da array for igual a instância passada pode arrastar
                        if(dragaveis[i][0] == objeto)
			{
				objeto.startDrag();
				//trace(dragaveis[i][0]);
				//trace(dragaveis[i][1]);
			}
			else
			{
				trace("o objeto não pode ser arrastado");
				//trace(dragaveis[i][0]);
				//trace(dragaveis[i][1])
			}
		}
	}
	
	
}

não sei se é algum problema de lógica ou se está errado a função que cria a array multidimensional mais o fato é que para um objeto funciona, para vários não.

 

Pelo que pude ver aqui o problema maior está na criação da array multidimensional se alguém puder me dar uma forcinha.....

 

Porque você não deixa o array de lado e tenta fazer com variáveis boolean simples dentro do movieClip, ao bater em algum lugar essa variável chaveia, e quando você clicar no tal determinado botao a variavel volta, será que não fica mais simples?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

tirei o "valida" da função, não sei para que ele estava ali, tenta fazer dessa forma:

 


//função para habilitar um objeto para ser arrastado
function habilitaDrag(objeto, valor)
{

    dragaveis.push([objeto, valor]);

}
só para constar, você esta declarando a "dragaveis" fora dessa função né?

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi.

 

Bom, a idéia era criar uma função que eu pudesse utilizar independente do número de objetos a serem utilizados(arrastados). seguem as funções.

 

1º função para inicializar o objeto que será dragável.

 


function habilitaDrag(objeto, valor)
{
	
        /*inicializa as arrays. a outerArray será multidimensional que vai armazenar quem será arrastado e um boleano 0 ou 1 de false ou true que servirá de parâmetro para que o objeto seja ou não dragavel*/

        var outerArray:Array = new Array
        //array que vai armazenar o objeto que será dragavel e seu valor (0 ou 1)
        var subArray1 = new Array(objeto, valor);
        //outerArray será a array multidimensional
	outerArray.push(subArray1);

	//se o valor passado para o objeto for 0 o objeto vai ficar com alpha = 65 e a "mãozinha" do mouse será escondida
	if(valor == 0)
	{
		objeto._alpha = 65;
		objeto.useHandCursor = false;
	}
		
	
	//trace(outerArray);
	
}

Agora vem a chamda da função. Lembrando que eu utilizei essa função num mc.

 

onClipEvent(load){

	/*quando carregar, habilita o objeto para ser arrastado onde "this" é a referência do próprio objeto*/
	_root.habilitaDrag(this,0);
	
	
}

no mesmo mc ainda, ponha esse código para que ao pressionar a função que faz o drag seja invocada. daí ela vai verificar se esse objeto pode ou não ser dragado. o drag é definido por você no momento do onload.

 


on (press) {
	//onde arrastar e a função que faz o drag. Repare que apenas um parâmetro é passado, ou seja, o próprio mc
	_root.arrastar(this);
}

agora a função que faz o drag

 


function arrastar(objeto)
{
		
		//looping para verificar a quantidade de elemento na array
                for(j=0; j<outerArray.length; j++)
		{
			
                        //agora o looping para verificar a quantidade de itens da segunda array (subArray1)
                        for(k=0; k<outerArray[j].length; k++)
			{
				/*agora vamos verificar o seguinte: uma array multidimensional é formada assim: array[n] = ["objeto0", "objeto1"] onde o objeto0 é o nosso objeto(mc) e o objeto1 é o valor boleano(0 ou 1) e a array[n] é a array outerArray.
se o objeto1 == 1 (outerArray[j][1]) e o objeto0 == ao objeto passado na função então o drag é iniciado*/
				if(outerArray[j][1] == 1 and outerArray[j][0]==objeto)
				{
					objeto.startDrag();
					objeto._alpha = 100;
					objeto.useHandCursor = true;
				}

                                /*se o valor do objeto1 == 0 (não pode arrastar) e o objeto0 == o objeto então não arrasta */
				if(outerArray[j][1] == 0 and outerArray[j][0] == objeto)
				{
					objeto.stopDrag();
					objeto.useHandCursor = false;
				}
			
			}
		}

}

Se quiser parar o drag para um determinado evento basta colocar esso código. utilizarei o evento hitTest() que tb está no mc

 

        if (this.hitTest(this._parent.objetoMontar_mc)) 
	{
		 
		
		_root.habilitaDrag(this,0);

	}

é isso. obrigado a quem tentou me ajudar.

 

Isso. O meu problema estava em como montar a array multidimensional. mais consegui resolver e funfa que é uma beleza. Pus om post com todas a funções utilizadas e como utilizá-las. Acho que vai ajudar.

 

vlw

 

tirei o "valida" da função, não sei para que ele estava ali, tenta fazer dessa forma:

 


//função para habilitar um objeto para ser arrastado
function habilitaDrag(objeto, valor)
{

    dragaveis.push([objeto, valor]);

}
só para constar, você esta declarando a "dragaveis" fora dessa função né?

 

 

[]´s

 

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.