Grade Sonora II



por Dauton Janota

Ok, ok, ok...=)
Devido a inúmeros pedidos posto aqui uma maneira de criar uma grade sonora!



Começaremos com um filme em branco 600 x 400 pixels (Thanks to Kip) e apenas uma camada chamada chamada ações.

Nesta camada colocaremos as seguintes linhas de actionscript:


l = 20;//largura
h = 20;// altura
a = 600/l;
d = 400/h;

for(i=0;ifor(j=0;jcontador = ((i*a)+j);
attachMovie("som_acionador", "acionador"+contador,contador);
mv = _root["acionador"+contador];
mv.onRollOver = function(){
this.gotoAndPlay("on");
}
mv._x = j*l;
mv._y = i*h;
}
}

Notem que usarei attachMovie, o que significa que anexarei um filme diretamente da biblioteca, mas que filme?

Bem para isto, deveremos inserir um movieClip na biblioteca, portanto vá ao menu:

1. Inserir

2. Novo Símbolo

3. Selecione Movie Clip e dê o nome de som_acionador

Este movieClip conterá duas camadas (ações e preenchimento) com 20 frames (quadros) cada.

ações:

No frame 1 coloque no nome no quadro (painel de propriedades) de "off" sem áspas. Neste mesmo frame coloque a ação stop();

Insira um quadro em branco no frame 10 e nomeie-o de "on" sem áspas.

Por fim, no frame 15 insira a ação:

gotoAndStop("off");

preenchimento:

Do frame 1 ao 10º (frame contínuo) desenhe um quadrado de tamanho 20x20 px e posicione em 0.0 em x e 0.0 em y (painel de propriedades)

No frame 11º, desenhe um quadrado igual, no mesmo tamanho e posição, porém com uma cor diferente e mais um detalhe importante neste frame: Insira um som qualquer.

Volte para a Cena principal... acabou? Não... ainda falta uma coisa:

Linkar este movieClip.

Para isto, abra a biblioteca (Ctrl+L) procure o seu movieClip som_acionador, selecione-o e com o clique direito do mouse, procure o ítem "linkage".

Clique em cima dele e selecione "Export for Actionscript" e na caixa de entrada coloque o mesmo nome do movieClip - som_acionador - certamente já estará colocado automaticamente.

Agora sim, acabou!

É só rodar o filme e ver o resultado!

postado por Dauton Janota em 4:27 PM


Warning: fopen(blogkomm/comments.txt) [function.fopen]: failed to open stream: Permission denied in /srv/www/vhosts/cgibras/indacobr/www/blogkomm/module/blogkomm_show_link.php on line 55
[ sem comentários ]



Matematic Markup Language(MathML)



por Gabriel Laet

Fala pessoal!
Estava dando uma passada no site da W3C e encontrei uma linguagem diferente, o MathML. Este padrão W3C é usado para exibir caracteres matemáticos(fração, raiz quadrada, raiz cúbica e etc..) em qualquer browser que seja compatível com os padrões W3C, fazendo alguns testes verifiquei que não funciona no IE. O código MathML é todo baseado em XML, fiz um exemplo que exibe uma fração de 3/4:


<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
"http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<p>
<math xmlns="http://www.w3.org/1998/Math/MathML">
<mfrac>
<mn>3</mn><mn>4</mn>
</mfrac>
</math>
</p>
</body>
</html>



Tudo se aplica entre as tags <math></math>, dentro delas encontramos a tag <mfrac>, que inicia uma fração, e temos a tag <mn>
que é usada para exibir números.


Se você for meio louco e quiser fazer exemplos mais avançados irá precisar dessas fontes true type:

http://support.wolfram.com/mathematica/systems/windows/...
http://www.mozilla.org/projects/mathml/fonts/bakoma/texcm-ttf.zip
http://www.mathtype.com/dl/MTW4_TrueType.exe


E aí vai alguns links sobre MathML:
http://pear.math.pitt.edu/mathzilla/ - Vai encontrar aqui muitos exemplos e conversor de texto pra MathML.
http://www.w3.org/TR/MathML2/ - Site oficial da versão 2 do MathML.
http://www.w3.org/Math/testsuite/ - Exemplos de todos os tipos!


Veja aqui o exemplo da fração:
http://www.gabriellaet.com/mathML/fracao.xml


É isso ae! Valeu!
postado por Gabriel Laet em 11:14 AM

[ sem comentários ]






por Dauton Janota

Para os designers de plantão : o Terzi está lançando o 9volts, zine de design, que será feito com as contribuições enviadas pela galera. Cada edição terá determinado tema, neste mês o tema é Coca-Cola.
Mais informações vocês podem encontrar no site Terzistudio.ppg.br

To all the designers on duty: Terzi is creating 9volts, a collaborative zine about design. You can be part of it by sending your work too. Each edition will have a theme, and this month´s will be Coca-Cola.
For further info, visit Terzistudio.ppg.br



postado por Dauton Janota em 4:57 PM

[ 1 comentário ]



Grade Sonora



por Dauton Janota



O amigo Kip Parker nos mostrou como trabalhar com sons de maneira interessante no flash MX e este é o resultado.

Código:

function getNext(obj){
num = parseInt(obj._name.substring(7));
decider = random(4);
switch(decider){
case 0:
num = num-across;
break;
case 1:
num = num+across;
break;
case 2:
num++;
break;
case 3:
num--;
break;
}
if(num>0&&num with(_root["trigger"+num]){
gotoAndPlay("on");
}
}
}
w = 20;
h = 20;
across = 600/w;
down = 400/h;

for(i=0;i for(j=0;j counter = ((i*across)+j);
attachMovie("sound_trigger", "trigger"+counter,counter);
mv = _root["trigger"+counter];
mv.onRelease = function(){
this.gotoAndPlay("on");
this.scale.gotoAndStop(this.soundToPlay);
this.scale.gotoAndStop(1);
}
mv.soundToPlay = i+2;
mv._x = j*w;
mv._y = i*h;
mv.snd = new Sound(mv);
pan = ((j/30)*200)-100;
mv.snd.setPan(pan);
}
}


postado por Dauton Janota em 1:58 AM

[ 1 comentário ]



Novo DES16N em Breve!

por Jonas Galvez

Pessoal, estamos trabalhando em uma nova versão deste blog. Utilizando XHTML e CSS, buscamos oferecer um acesso mais rápido e um design mais limpo. Nosso objetivo é tornar o DES16N um centro de conhecimento sobre Flash, onde vários desenvolvedores e designers possam publicar suas idéias e comentar sobre o que há de mais novo na comunidade. Aguardem! =)
postado por Jonas Galvez em 6:32 PM


[ 2 comentários ]



Parâmetros dinâmicos

por Jonas Galvez

Com a introdução dos novos callbacks de eventos de movieclip no Flash MX, muitos programadores adoraram a idéia de definir eventos dinamicamente, em loop de duplicação de movieclips por exemplo. No entanto, esta tarefa pode ser um tanto complicada. Vejam o seguinte exemplo:

for(var i = 0; i < 10; i++) {
this.mc_original.duplicateMovieClip("mc_copia" + i, i);
// ...definição de propriedades do movieclip duplicado
this["mc_copia" + i].onRelease = function() {
trace("Este movieclip deverá mostrar o valor " + i);
};
};

A mensagem que deveria ser exibida apenas pelo último movieclip (mc_copia9) será exibida por todos os movieclips. Isto acontece porque o evento onRelease armazena uma cópia do valor final da variável i internamente. Para evitar isso, a solução mais direta é a seguinte:

for(var i = 0; i < 10; i++) {
this.mc_original.duplicateMovieClip("mc_copia" + i, i);
// armazena uma cópia do valor atual de I na
// propriedade VALOR do movieclip
this["mc_copia" + i].valor = i;
this["mc_copia" + i].onRelease = function() {
trace("Este movieclip deverá mostrar o valor " + this.valor);
};
};

Algumas vezes, isto pode ser meio chato, principalmente quando precisamos definir vários parâmetros dinâmicos. Bom, eu criei uma função que facilita o trabalho. É bem simples:

_global.createFunctionCall = function() {
var _obj = arguments.shift();
var _function = arguments.shift();
var _arguments = arguments;
return function() { _function.apply(_obj, _arguments); };
};

Com ela, podemos passar criar uma função auxiliar para chamar uma outra função (método) passando parâmetros. Veja como ficaria o loop anterior usando esta função:

for(var i = 0; i < 10; i++) {
var mc = this.mc_original.duplicateMovieClip("mc_copia" + i, i);
mc.onRelease = createFunctionCall(mc, function(valor) {
trace("Este movieclip deverá mostrar o valor " + valor);
}, i);
};

O primeiro parâmetro da função createFunctionCall é o objeto no qual a função será aplicada. No exemplo, o objeto é o movieclip recém criado. O segundo parâmetro é a função que deverá ser executada. Note que podemos definir parâmetros diretamente na função. A partir do terceiro parâmetro, inserimos os valores que deverão passados como parâmetro.

É basicamente isso. Eu devo dizer que não testei isso o quanto eu deveria ter testado, mas parece estar funcionando. Qualquer dúvida, me enviem um e-mail ou enviem como comentário deste post mesmo.
postado por Jonas Galvez em 6:11 PM


[ sem comentários ]



Acessando dados com Flash Remoting


por Neto Leal

Veremos a seguir a simples tarefa de acessar dados no servidor usando apenas o ActionScript. Sem a necessidade de nenhuma outra linguagem server-side.

O Macromedia ColdFusion MX traz consigo o pacote Flash Remoting que tambem pode ser ser executado em outros servidores WEB como o .NET por exemplo. Este pacote permite o desenvolvedor, resgatar dados do seu servidor usando apenas o ActionScript.

Nesse artigo vou mostrar como preencher um ListBox (Componente) a partir de uma consulta à banco de dados.

Para criar esse exemplo usei um DataSource chamado "cfsnippets" padrão do admin do ColdFusion .

O segundo passo, é criar o arquivo ActionScript que irá executar no servidor.

Seu código é o seguinte:

//Arquivo employees.asr
function getEmp(id){
var where = (id != 0)? "where emp_id = " + id: "";
var ret = CF.query(
"cfsnippets",
"select * from Employees " + where
);
var ret_array = new Array(id,ret);
return ret_array;
}

Ess função irá receber um parâmetro chamado "id" que será o identificador do funcionário a ser pesquisado. Se esse parâmentro for 0 (zero) a consulta deverá retornar todos os funcionários da tabela. Caso o valor do "id" seja diferente de 0 (zero) a consulta deverá retornar apenas o funcionário com "id" igual ao informado.

Para isso usamos o método do objeto "CF" chamado "query" que executa um comando SQL no servidor e retorna um Recordset.
o retorno da função devolve ao flash um array contendo o "id" especificado e no segundo índice o recordset retornado pelo método CF.query

Agora vamos ao código do cliente:

/*
Primeiro incluímos o arquivo NetServices.as que contém o objeto NetServices. Esse objeto é o responsável para criar conexão entro o cliente e o servidor Remoting.
*/
#include "NetServices.as"

/*
O arquivo "NetDebug.as" é opcional. Esse arquivo cria o objeto NetDebug que contém o método "trace" responsável para depuração de seu código.
*/
#include "NetDebug.as"

/*
O arquivo "DataGlue.as" cria o objeto DataGlue. Esse objeto cria uma interação entre o objeto RecordSet (criado pelo NetServices.as) e os Flash MX UI components. Esse objeto é muito útil para se criar aplicativos Rich.
*/
#include "DataGlue.as"

//Esse método serve para "limpar" os textos de uma determinada Timeline ou MovieClip.
MovieClip.prototype.limpaCampos = function() {
for (t in this) {
if (t instanceof TextField) {
t.text = "";
}
}
};

//Definimos a URL padrão de onde se encontram os seus services no servidor Remoting
NetServices.setDefaultGatewayURL("http://localhost:8500/flashservices/gateway");

//Criamos uma conexão e atribuímos ao objeto cfServer_conn
cfServer_conn = NetServices.createGatewayConnection();

/*
o método getService funciona da seguinte forma:

digamos que seu arquivo employees.asr esteja situado dentro de um diretório chamado "teste_neto_cf1" na raiz do seu servidor (C:\CFusionMX\wwwroot\teste_neto_cf1). este serviço será acessado pelo id "teste_neto_cf1.employees".

O segundo parâmetro do método significa a linha do tempo que será "guardado" o resultado do método. Nesse caso o this foi usado. Ou seja, a linha do tempo atual.
*/
serv = cfServer_conn.getService("teste_neto_cf1.employees", this);

//O método "getEmp" é o nome da function criada no arquivo "employees.asr"
serv.getEmp(0);

/*
A função getEmp_result tem esse nome seguindo uma convenção adotada pelo Remoting. O sufixo "_result" indica que essa função será executada quando o "getEmp" responder. O parâmetro "res" irá receber o resultado da função no servidor.
Nesse caso será um array onde o primeiro parâmetro é o "id" informado e o segundo é o recordset resultado do CF.query.
*/
function getEmp_result(res) {
st_txt.text = "";

if (res[0] == 0) {//Se o id for 0 (zero) indica que deverá ser preenchido o listBox
/*
O seguinte método preenche o listBox "lstEmp_lst" passado no primeiro parâmetro da seguinte forma:
res[1] -> objeto RecordSet retornado do banco de dados
"#FirstName#" -> Chave do Recordset que será o label do valor do listBox
"#emp_id#" -> Chave do Recordset que será o data do listBox
*/
DataGlue.bindFormatStrings(lstEmp_lst, res[1], "#FirstName#", "#emp_id#");

} else {//Se o id nao for 0 (zero) será mostrado os detalhes do funcionário selecionado
/*
Abaixo usamos o método getItemAt do objeto RecordSet que retorna o valor de uma chave do objeto
o método pede um índice (nesse caso 0) e a chave desejada.
*/
nome_txt.text = res[1].getItemAt(0)["FirstName"];
lnome_txt.text = res[1].getItemAt(0)["LastName"];
fone_txt.text = res[1].getItemAt(0)["Phone"];
}
}

/*
Abaixo definimos a função pegaDados como sendo o changeHandler do componente listBox
*/
lstEmp_lst.setChangeHandler("pegaDados");
function pegaDados() {
_root.limpaCampos();
st_txt.text = "Atualizando...";

//Abaixo usamos o mesmo getEmp passando como parâmetro o id do funcionário selecionado no listBox
serv.getEmp(lstEmp_lst.getSelectedItem().data);
}

Bem, vimos aqui como é simples a tarefa de integração com banco de dados usando Flash Remoting
Vimos tambem que é possível integrar totalmente usando APENAS ActionScript.

Agora é botar a mão na massa nessa poderosa tecnologia que chegou pra ficar !
Até a próxima !!
postado por Neto Leal em 8:09 AM

[ 3 comentários ]