MXStudio » Flash » Movie Clip – HitTest (Galeria)

Movie Clip – HitTest (Galeria)

Coluna Flash – Movie Clip – HitTest

Introdução

Um olá para todos os amigos do MXStudio.

Neste artigo vamos ver um pouco sobre o método HitTest da classe MovieClip, na verdade fiz este exemplo para um aluno há algum tempo e resolvi postar.

Para testar arraste uma miniatura para a área de exibição.

Pré-Requisitos

Este artigo pede um conhecimento básico de ActionScript, mas é necessário ter uma familiaridade com o Flash.

Objetivo

Aprimoramento da Action Script junto ao Flash 8.

Conteúdo

Incialmente, vamos ao Dreamweaver escrever um XML, para quem ainda não utiliza recomendo que leiam muito sobre isso.Muito é facilitado utilizando essa meta-linguagem que é portabilidade entre quaisquer sistemas.

<?xml version=”1.0″ encoding=”utf-8″?>
<galeria>
<thumb title=”Hades Chapter Sanctuary” img=”images/01.jpg” thumb=”images/01_p.jpg” />
<thumb title=”Hades Chapter Sanctuary” img=”images/02.jpg” thumb=”images/02_p.jpg” />
<thumb title=”Hades Chapter Inferno ” img=”images/03.jpg” thumb=”images/03_p.jpg” />
</galeria>

Basicamente o que temos nesse xml são atributos para exibição de título, thumbnail e a imagem em seu tamanho maior. Em uma breve oportunidade veremos mais sobre a classe XML.

Salve o como galeria.xml.

Nosso trabalho no xml acaba aqui, o Flash se encarregará de ler esses dados. Não esquecendo que esse xml deveria ser gerado por um banco de dados, para fácil manutenção do mesmo.

No Flash 8, abra um novo documento (580px 510px) em branco.

Salve-o como galeria.fla.

Vamos inicialmente definir nossos elementos visuais, desenhe:

Um MovieClip de 378 de largura por 510 de altura, nome de instância: finalTarget;
Um MovieClip de qualquer tamanho (ele será seu preloader), nome de instância: preloader;
Va até o menu superior do Flash, clique em Insert, new Symbol, tipo MovieClip, nome item. Selecione o botão no canto inferior direito e selecione a opção Export For ActionScript, o Identifier deve ter o mesmo nome do símbolo, para facilitar sua localização numa Library complexa, neste caso item.
Dentro deste símbolo, inclua mais duas layers, nomes das três layers:

~AS
target_mc
title_txt

Na layer target_mc, desenhe mais um MovieClip de 100 de largura por 135 de altura, nome de instancia target_mc.
Na layer title_txt, desenhe um texto dinâmico com qualquer tamanho, nome de instância title_txt.

Esses sinais de _mc e _txt vão facilitar para que não esqueçamos o tipo desses objetos e também para lembrar que são variáveis de instâncias.

Na layer de actions digite:

/*Estamos importando a classe Tween para facilitar as animações via Action Script*/
import mx.transitions.Tween;
/*Declarando os tipos das instâncias visuais*/
var title_txt:TextField;
var target_mc:MovieClip;
/*Declarando as vriáveis não visuais*/
/*Indica se a thumb está dentro do container */
var selected:Boolean = false;
/*Indica se estamos arrastando a Thumb */
var isDragging:Boolean = false;
/*Posição inicial da Thumb */
var posX:Number = target_mc._x;
var posY:Number = target_mc._y;
/*Velocidade da animação do MovieClip via cálculo */
var time:Number = 10;
/*Inicialização dos objetos*/
/*Classe para preload das imagens grandes*/
var loader:MovieClipLoader = new MovieClipLoader();
/*Criação do objeto que irá ouvir os eventos da classe MovieClipLoader() */
var o:Object = new Object();
/*O MCL está cadastrando um objeto para receber seus futuros eventos */
loader.addListener(o);
/*Evento liberado ao iniciar um preload */
o.onLoadStart = function():Void {
with (_root.preloader) {
_alpha = 100;
}
};
/*Evento liberado no progresso do preload (carregando….) */
o.onLoadProgress = function(target:MovieClip, loaded:Number, total:Number):Void {
_root.preloader._xscale = loaded/total*100;
};
/*Evento liberado ao finalizar o preload, é aqui que coloco as ações que devem acontecer ao finalizar o preload */
o.onLoadInit = function():Void {
var effPreloader:Tween = new Tween(_root.preloader, “_alpha”, None.easeNone, _root.preloader._alpha, 0, .5, true);
var effTarget:Tween = new Tween(_root.finalTarget, “_alpha”, None.easeNone, 0, 100, .5, true);
};
/*Propriedades das instâncias*/
this.tabEnabled = false;
with (title_txt) {
html = true;
autoSize = true;
type = “dynamic”;
selectable = false;
}
/*Eventos do próprio Objeto*/
function onPress():Void {
/*Alterando o nível de altura do próprio MovieClip*/
this.swapDepths(_root.getNextHighestDepth());
target_mc.startDrag(false);
/*Estou arrastando */
isDragging = true;
}
function onRelease():Void {
target_mc.stopDrag();
/*Não estou arrastando mais */
isDragging = false;
/*Se o target_mc colidir com o FinalTarget que está no _root, faça algo*/
/*O HitTest passa outros parâmetros dependendo do caso: obj.hitTest(_x, _y, flag), onde flag indica se ele deve respeitar o bounding box (caixa delimetadora do MovieClip) ou não */
if (target_mc.hitTest(_root.finalTarget)) {
/*Aqui dizemos que ele continua sendo arrastado, mais abaixo vamos entender */
isDragging = true;
/*Estou selecionado agora que colidi com finalTarget */
selected = true;
/*Um loop básico que nada mais faz que liberar todos aqueles que não são o que eu estou arrastando*/
/*Para propriedade no _root faça */
for (var i in _root) {
/*Se o nome de instância do meu MovieClip no _root contiver item, faça… */
if (_root[i]._name.indexOf(“item”)>=0) {
/*Se o objeto nesse _root for eu mesmo faça… */
if (_root[i] == this) {
/*Aqui dentro o target_mc fica invisivel e o loader carrega minha variável largeImage, inserida pelo XML que já vamos ver */
this.target_mc._visible = false;
loader.loadClip(this.largeImage, _root.finalTarget);
/*Caso contrário */
} else {
/*Todos que não são eu mesmo não estão arrastando, não estão mais selecionados e voltam a ficar visíveis */
_root[i].isDragging = false;
_root[i].selected = false;
_root[i].target_mc._visible = true;
}
}
}
}
}
function onReleaseOutside():Void {
onRelease();
}
/*Esse evento de loop de “animação” verifica se minha condição isDragging (está arrastando) é verdadeira, se não for faça isso… */
function onEnterFrame():Void {
if (!isDragging) {
/*A posição do meu objeto será incrementada pela posição inicial menos a posição em que está, dividido pelo tempo de percurso, quanto menor, mais rápido */
target_mc["_x"] += (posX-target_mc["_x"])/time;
target_mc["_y"] += (posY-target_mc["_y"])/time;
}
}

Agora nosso item arrastável já funciona sozinho, o que temos de fazer é populá-lo com o XML, então, agora, voltemos ao _root.
No palco definiremos três layers com os seguintes nomes:

~AS
preloader
finalTarget

Em cada layer deixamos os respectivos objetos, nesse caso, não coloquei _mc para eles, mas seria bom que vocês o fizessem futuramente…
Na layer de Actions vamos ao código final:

/*Declarando os tipos das instâncias visuais*/
var preloader:MovieClip;
var finalTarget:MovieClip;
/*Propriedades das instâncias*/
/*Aqui estamos definindo um background para o finalTarget, seu depth (nível, aqui não podemos dizer, suba duas layers, deça três…) que será o mesmo do finalTarget menos um. */
finalTarget.duplicateMovieClip(“bgTarget”, finalTarget.getDepth()-1);
/*Declaração de funções*/
function createGallery():Void {
/*Criação do objeto XML */
var xml:XML = new XML();
xml.ignoreWhite = true;
/*Carregando nosso arquivo xml */
xml.load(“galeria.xml”);
/*Ao ler o xml faça isso */
xml.onLoad = function(success:Boolean):Void {
if (success) {
var path:Object = this.firstChild.childNodes;
/*Para variável i que vale 0, enquanto ela for menor que o número de itens dentro do xml, incremente 1 */
for (var i:Number = 0; i<path.length; i++) {
/*Estamos chamando o item da Library */
t = _root.attachMovie(“item”, “item”+i, i, {_x:10});
/*Esse item terá sua instância title_txt em sua propriedade text o valor alterado para o atributo title do XML */
t.title_txt.text = path[i].attributes.title;
/*Esse item terá sua instância target_mc carregando via loadMovie o atributo thumb do XML */
t.target_mc.loadMovie(path[i].attributes.thumb);
/*Anexamos uma variável largeImage ao MovieClip item, a mesma que chamamod no método loadClip da classe MovieClipLoader dentro do item */
t.largeImage = path[i].attributes.img;
/*Definimos a posição do item e incrementamos um espaço de px a distância entre eles */
t._y = i*t._height+10;
}
}
};
}
/*Inicialização das funções */
createGallery();

Neste artigo não vimos a paginação deste xml, ficará para a parte 2 juntamente com os Downloads dessas imagens.

Espero que tenham gostado, dúvidas ou sugestões são bem vindas em meu e-mail.

Abraços e até a próxima!

Autor: Leandro Amano – Colunista de Flash do MXSTUDIO

Site: www.leandroamano.com.br
Sobre: Leandro Amano atualmente é designer/desenvolvedor Macromedia, Macromedia User Group Leader do Flashfor, diretor de criação da Digital Bug e instrutor Macromedia na ENG DTP & Multimídia em São Paulo – SP.

Qualquer dúvida envie um email para amano@leandroamano.com.br ou acesse o nosso fórum.


Assine o nosso Feed
1.404 assinantes,
assine você também!
Publique esse artigo no Twitter Salve este artigo no Delicious Cadastre esse artigo no Dihitt Cadastre esse artigo no UEBA Cadastre esse artigo no Rec6

Deixe um Comentario

You can use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="">

Leandro_Amano

Últimos Artigos do Autor