• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

p3tr0s

AS3 criar carios objectos Timer

12 mensagens neste tópico

Boas, gostaria de saber se alguém sabe como criar um array de Timer.

Preciso de usar a class Timer mas dentro de um ciclo que se repete várias vezes, mas não gostaria de parar o Timer que já existe.

Se não perceberam a dúvida avisem  :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se não perceberam a dúvida avisem  :-[

Queres ter vários Timer's activos simultâneamente, independentes? Com listeners diferentes? Qual a situação em que isto se aplica?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a situação é aseguinte:

tenho um efeito que quero que se realize a cada 2 segundos, essa parte já tenho feito e uso 2 Timer's (um para os 2 segundos e outro no efeito), no entanto quero que o mesmo efeito se repita (várias vezes) noutro ponto qualquer sem que o primeiro (anteriores) efeitos parem, ou seja:

na "tela" tenho um efeito a ocorrer num ponto que requer 2 Timer's, quero clicar noutro ponto e o mesmo efeito ocorrer sem que o efeito anterior termine.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei se compreendi bem, mas não facilitaria utilizar uma biblioteca de tween?

(e.g. TweenMax, Twenner, gTween)

Uma maneira de fazer o que pretendes sem utilizar nenhuma das bibliotecas acima, será criares uma classe que contenha os Timer's internamente e a lógica do efeito.

Depois será só criar um objecto dessa classe e passar como parâmetro o respectivo DisplayObject sobre o qual o efeito irá ser realizado. Podes também criar métodos adicionais que permitam iniciar/parar o efeito ou passar parâmetros, etc.

exemplo de utilização:

var myFx:CustomEffect = new CustomEffect(myDisplayObject);
myFx.start();

Era isto?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A classe que criei é a seguinte:

package {
import flash.events.Event;
import flash.media.Sound;
import fl.motion.Color;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.Event;
import flash.display.MovieClip;
import flash.media.SoundChannel;
import flash.media.SoundTransform;
import flash.net.navigateToURL;
import flash.net.URLRequest;
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;


class Efeitos extends Timer {

	var myTimer:Timer = new Timer(50,10);
	var myTime:Timer = new Timer(3000);

	var particleArray:Array = new Array();
	var colorArray:Array = new Array();
	var maxParticles:Number = 10;

	var counter:int = 0;
	var lastColor:int = 0;
	var lastMusic:int = 0;

	var up:int = 0;
	var upC:int = 0;
	var valueX:int = 0;
	var valueY:int = 0;
	var cor:int = 0;
	var musica:int = 0;

	var musicArray:Array = new Array();
	var totalParticles:int = 0;

	var volumeControl:SoundTransform = new SoundTransform;


	var myLabels:Array = new Array(0x00ff00, 0x66FFCC, 0xCC6633,
	  0xFFFF66, 0xFF66FF, 0xCCFF33,
	  0x996600, 0x6633CC, 0x333300);

	var myMusic:Array = new Array("Sounds/01.mp3", "Sounds/02.mp3",
	  "Sounds/03.mp3", "Sounds/04.mp3", "Sounds/05.mp3");

	var c:Color=new Color();
	//c.setTint(0xff0000, 0.8);

	//initTimer();

	public function Efeitos(newX:Number, newY:Number, colorValue:Number, musicValue:Number) {

		this.valueX = newX;
		this.valueY = newY;

		this.cor = colorValue;
		this.musica = musicValue;

		initTimer();

	}
	public function initTimer() {

		myTimer.addEventListener(TimerEvent.TIMER, addParticle);
		myTimer.addEventListener(TimerEvent.TIMER, playSound);
		myTimer.start();

		myTime.addEventListener(TimerEvent.TIMER, startEffect);
		myTime.start();

	}

	public function startEffect(e:Event) {
		myTimer.reset();
		myTimer.addEventListener(TimerEvent.TIMER, addParticle);
		myTimer.addEventListener(TimerEvent.TIMER, playSound);
		myTimer.start();

	}

	public function addParticle(e:Event) {

		var dot:Particles = new Particles();

		c.setTint(myLabels[cor], 0.8);
		dot.transform.colorTransform=c;

		dot.x = valueX;
		dot.y = valueY;

		dot.alpha = Math.random() * .8 + .2;
		dot.scaleX = dot.scaleY = Math.random() * .8 + .2;
		dot.xMovement = Math.random() * 10 - 5;
		dot.yMovement = Math.random() * 10 - 5;
		particleArray.push(dot);
		//addChild(dot);
		dot.cacheAsBitmap = true;

		if (particleArray.length >= maxParticles) {
			//removeChild(particleArray[i].shift());
		}
		dot.addEventListener(Event.ENTER_FRAME,moveParticle);

	}

	public function moveParticle(e:Event) {
		e.currentTarget.x += e.currentTarget.xMovement;
		e.currentTarget.y += e.currentTarget.yMovement;
	}

	public function playSound(e:Event) {

		var soundControl:SoundChannel = new SoundChannel();

		soundControl.stop();
		soundControl = null;

		var soundReq:URLRequest = new URLRequest(myMusic[musica]);

		var sound:Sound = new Sound();
		sound.load(soundReq);
		var resumeTime:Number = 0;
		var isPlaying:Boolean = false;
		volumeControl.volume = 1;

		soundControl = sound.play();//0, 500 --> tem a ver com os loop

	}
}
}

Mas sempre que tento evocar a classe esta sempre a dar o mesmo erro:

1046: Type was not found or was not a compile-time constant: Efeitos.
1180: Call to a possibly undefined method Efeitos.

Como não percebo muito de flash, gostaria de saber se me podiam ajudar. Como é que consigo evocar esta classe e o que me está a faltar??

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podias colocar o código onde estás a utilizar/criar os objectos dessa classe, para perceber de onde vem o erro?

  • A classe Efeitos não é para ser uma subclasse da Timer, não queres que esta herde as funcionalidades mas sim que contenha um (ou mais) objectos Timer internamente.
  • Não cries objectos no corpo da classe, mais tarde ou mais cedo vais ter problemas (sem certeza, penso que estes são criados quando a declaração da classe é carregada em memória). Se queres que eles sejam criados quando um objecto o for, referencia-os no construtor da classe.
  • A função playSound é chamada a cada 50ms e carrega um ficheiro mp3 para dentro do flash player, não me parece boa opção.


O exemplo simples que falei no post anterior, era qq coisa do género.

//O display object ("a") pisca alternando o alpha entre 0 e 1 a cada 100ms
var myFx:CustomEffect = new CustomEffect(a,100);
myFx.start();

package{
import flash.display.DisplayObject;
import flash.events.TimerEvent;
import flash.utils.Timer;

public class CustomEffect
{
	private var _target:DisplayObject;
	private var _timer:Timer;

	public function CustomEffect(target:DisplayObject, freq:uint):void
	{
		_target = target;
		_timer = new Timer(freq);
		_timer.addEventListener(TimerEvent.TIMER, timerHandler);
	}

	public function start():void
	{
		_timer.start();
	}

	public function stop():void
	{
		_timer.stop();
	}

	private function timerHandler(evt:TimerEvent):void
	{
		_target.alpha = !_target.alpha ? 1 : 0; 
	}

}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu crio os objectos sempre que ocorre um click, e preciso que o centro do efeito seja na posição do click.

O efeito é uma particula a andar aleatóriamente com um determinado som de fundo e esse efeito repete-se a cada 3s. No entanto preciso que, por exemplo, no segundo click o efeito do primeiro click não pare e continue independente do tempo do segundo click, se o segundo clik acontecer aos 2s do primeiro click deverá ser sempre assim, ou seja, o segundo efeito ocorrer de 3s em 3s e sempre 2s depois do primeiro efeito.

PS: quanto aos sons não há problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Voltando ao erro,

1046: Type was not found or was not a compile-time constant: Efeitos.

1180: Call to a possibly undefined method Efeitos.

Provavelmente o compilador não consegue encontrar a classe, a tua classe pertence ao default package, tens o ficheiro Efeitos.as junto do fla?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já consegui corrigir esse erro. Tinha o nome do .as diferente do da classe  :-[  :-[  :-[

Agora já está corrigido e não da erros, no entanto o efeito não surge no stage  :wallbash:

Simplesmente mando como parámetros o valor do timer e a posição para o efeito, já tentei passar a Particles como parámetro mas também não funciona  :confused:

package {
import flash.display.DisplayObject;
import flash.events.TimerEvent;
import flash.utils.Timer;

import flash.events.Event;
import fl.motion.Color;
import flash.events.Event;
import flash.display.MovieClip;

public class ClasseTeste extends MovieClip {
	private var _timer:Timer;
	//private var _target:Particles;

	private var _valueX:int;
	private var _valueY:int;

	var myLabels:Array = new Array(0x00ff00, 0x66FFCC, 0xCC6633,
	  0xFFFF66, 0xFF66FF, 0xCCFF33,
	  0x996600, 0x6633CC, 0x333300);

	private var particleArray:Array = new Array();
	private var maxParticles:Number = 100;

	public function ClasseTeste( freq:uint, valueX:int, valueY:int):void {
		//_target = target;
		_valueX = valueX;
		_valueY = valueY;
		_timer = new Timer(freq);
		_timer.addEventListener(TimerEvent.TIMER, timerHandler);
	}
	public function start():void {
		_timer.start();
	}
	/*public function stop():void {
		_timer.stop();
	}*/
	private function timerHandler(evt:TimerEvent):void {

		var c:Color=new Color();
		c.setTint(myLabels[3], 0.8);

		var dot:Particles = new Particles();

		dot.transform.colorTransform=c;

		dot.x = _valueX;
		dot.y = _valueY;


		dot.alpha = Math.random() * .8 + .2;
		dot.scaleX = dot.scaleY = Math.random() * .8 + .2;
		dot.xMovement = Math.random() * 10 - 5;
		dot.yMovement = Math.random() * 10 - 5;
		particleArray.push(dot);
		addChild(dot);
		dot.cacheAsBitmap = true;

		//this.visible = true;

		if (particleArray.length >= maxParticles) {
			removeChild(particleArray.shift());
		}
		dot.addEventListener(Event.ENTER_FRAME,moveParticle);

	}
	public function moveParticle(e:Event) {
		e.currentTarget.x += e.currentTarget.xMovement;
		e.currentTarget.y += e.currentTarget.yMovement;
	}

}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a adicionar o objecto ClasseTeste que criaste à display list (addChild)?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E não é que tinhas razão  :-[

A minha ignorância em relação ao flash dá nisto  :wallbash:  :wallbash:

Obrigado pela ajuda  :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora