Ir para conteúdo

Arquivado

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

haunter

problemas de animação em ActionScript3.0

Recommended Posts

 

Olá, sou novo aqui no fórum e estou desenvolvendo uma animação em flash sobre segmentação de memória.

 

Decidi fazer OO, mas estou tendo alguns problemas na criação de classes:

 

package
{
import flash.display.MovieClip;
import flash.geom.Rectangle;
import flash.display.Shape;

public class Segmento extends MovieClip
{
 var prioridade:uint;
 var retangulo:Shape;
 public function Segmento(pontoX:uint, pontoY:uint)
 {
  this.retangulo = new Shape();
  this.retangulo.graphics.beginFill(Math.random() * 0xFFFFFF, 1);
  this.retangulo.graphics.drawRect(pontoX, pontoY, 100, (10 * (int) (4 + (Math.random() * 5))));
  this.retangulo.graphics.endFill();
  this.prioridade = ((int) (Math.random() * 5));
 }
}
}

 

Criei esta classe para mais tarde, instânciar os segmentos (pequenos retangulos de altura e cor aleatorio) para que possam ser movimentados por meio de um objeto Tween.

 

Mas um dos meu problemas é que aparece um erro quando vou executar:

 

ArgumentError: Error #1063: Incompatibilidade de contagem do argumento Segmento(). Esperado 2, obtido 0.

 

Sendo que eu nem instaciei esta classe Segmento.

 

Outra dúvida é como eu faria para colocar um texto no meio de um segmento como mostrado na imagem abaixo:

 

segmentaodememoria.png

 

Obrigado a todos que puder me ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você criou um construtor na sua classe que recebe dois parametros, então o erro que está acontecendo é que você precisa mandar os dois parametros de x e y para que ele execute o script, ficando assim a chamada:

 

var mc: Segmento = new Segmento([color="#FF0000"]100[/color],[color="#FF0000"]100[/color]);
addChild(mc);

 

O que você pode fazer tambem é definir um parametro padrão pro construtor, assim se nada for passado, ele ja tem um valor padrão, como no exemplo:

 

public function Segmento(pontoX:uint = 0, pontoY:uint = 0)

 

Assim se chamar somente como new Segmento(); seria o mesmo que chamar como new Segmento(0, 0);

 

Por fim, você tambem esqueceu de dar um addChild do retangulo dentro da classe após o endFill();, para que você veja o retangulo na tela você precisa colocar um addChild(retangulo); abaixo de this.prioridade.

 

Para colocar um campo de texto, use a classe TextField.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@carneirinho - Obrigado por responder, o estranho é que eu não criei um objeto no ActionScript da classe Segmento. Como ele da esse erro se eu nem o instanciei?

 

E mais uma dúvida, tem algum comando para que eu possa centralizar o TextField dentro de cada objeto segmento?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode ser que o erro venha de outro pacote então. Sobre a centralização, você pode criar um texto com a largura toda do movieclip e setar o alinhamento dele ao centro, ou se quiser deixar o textfield com autoSize, dai você pode centralizar usando propriedades de x e width

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se estou errado, mas não tem alguma classe do tipo Label?

 

Não conheço bem o flash, mas para mim TextField não seria campo para entrada de texto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

label no flash é rótulo, é como uma instancia de um certo ponto da timeline. textfield é para qquer tipo de texto, tanto dinamico como de entrada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O label(ou rótulo) que o carneirinho se referiu é uma 'marcação' na timeline.

 

Por exemplo, você pode usar:

mc.gotoAndPlay(10);

ou, criar uma animação que inicie a partir do frame 10 e definir um 'nome' qualquer, no painel Properties, isso cria um ícone com uma banderinha vermelha no frame.

 

Então, você pode chamar o mesmo frame que contém o início da animação pelo nome do label (como uma String, entre aspas):

mc.gotoAndPlay("anima");

 

Há também o componente nativo do Flash, menu Window > Components > Label.

Particularmente, não aprecio usar componentes.

 

... mas no seu caso, até onde meu conhecimento alcance, é melhor mesmo trabalhar com a classe TextField criado pelo Action.

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Elektra - Ata obrigado, não imaginava que era isso que o carneirinho queria dizer. Mas agora ficou claro a utilização da label no flash, diferentemente do componente label. Vou seguir as dicas que você e o carneirinho me deram.

 

Obridado pela ajuda de vocês. Mas com certeza terei outros problemas no decorrer do meu trabalho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora tenho dúvidas quanto a esses erros:

 

Scene 1, Layer 'Layer 1', Frame 1, Line 1 1172: Definition Segmentos:Segmento could not be found.

Scene 1, Layer 'Layer 1', Frame 1, Line 1 1172: Definition Segmentos:Segmento could not be found.

Scene 1, Layer 'Layer 1', Frame 1, Line 3 1137: Incorrect number of arguments. Expected no more than 0.

 

O primeiro erro aparece duas vezes por isso eu o coloquei do jeito que apareceram quando eu executei.

 

O código da classe Segmento:

 

package Segmentos
{

import flash.display.MovieClip;
import flash.geom.Rectangle;
import flash.display.Shape;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;

public class Segmento extends MovieClip
{

	var prioridade:uint;
	var nomeRetangulo:TextField;
	var retangulo:Shape;

	public function Segmento(pontoX:uint, pontoY:uint, numeroSeg:uint)
	{
		this.retangulo = new Shape();
		configureLabel();

		this.retangulo.graphics.beginFill(Math.random() * 0xFFFFFF, 1);
		this.retangulo.graphics.drawRect(pontoX, pontoY, 100, (10 * (int) (4 + (Math.random() * 5))));
		this.retangulo.graphics.endFill();

		nomeRetangulo = new TextField();
		nomeRetangulo.text = "Segmento " + numeroSeg + "\n" + "(" + (this.retangulo.height / 10) + "K)";
		nomeRetangulo.autoSize = TextFieldAutoSize.CENTER;
		nomeRetangulo.x = this.retangulo.x;
		nomeRetangulo.width = this.retangulo.width;

		this.prioridade = ((int) (Math.random() * 5));
	}
}

}

 

Código do arquivo .fla:

 

import Segmentos.Segmento;

var seg:Segmento = new Segmento(10,10,10);
addChild(seg);

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.