Tomzinho 0 Denunciar post Postado Fevereiro 17, 2010 Estou tentando fazer um programa aonde os professores de laboratório possam editar o conteúdo da animação não consigo duplicar um arquivo externo em png, alguém pode me ajudar...melhorar o código tendo em vista que sou novato nesse ramo. Ajudem...facilitará tudo...segue o código abaixo: //área de carregamento do xml var carrega:URLLoader = new URLLoader(); carrega.addEventListener(Event.COMPLETE, xmlCarregado); carrega.load(new URLRequest('soma.xml')); //carregamento da imagens var endcerto:URLRequest = new URLRequest('img/certo.png'); var certo:Loader = new Loader(); certo.load(endcerto); var enderrado:URLRequest = new URLRequest('img/errado.png'); var errado:Loader = new Loader(); errado.load(enderrado); //variáveis do ambiente var calc:XMLList; var MeuXml:XML; var p:Array = new Array(); var s:Array = new Array(); var o:Array = new Array(); var r:Array = new Array(); var z:Array = new Array(); //puxa os itens do xml para os arrays function xmlCarregado(e:Event):void{ MeuXml = XML(e.target.data); calc = MeuXml.children(); for each (var element in calc){ p.push(element.parcela1); s.push(element.parcela2); o.push(element.operando); r.push(element.resultado);//array das respostas que não é exibido na tela, somente capturado } //função ouvinte do botão botao_btn.addEventListener(MouseEvent.CLICK, pega); function pega(evt:MouseEvent):void{ for(var i = 0; i < 8 ; i++){ var mc:MovieClip = new MovieClip(); addChild(mc); //aqui vi no site mais nao entendi mc.addChild(errado); } } //exiba na tela quero repetir um total de 8 vezes essas imagens que estou importanto para o movie. Compartilhar este post Link para o post Compartilhar em outros sites
Michel Araújo 0 Denunciar post Postado Fevereiro 18, 2010 Olá, bom, não é algo tão difícil mas também não é tão simples quanto poderia ser. O ActionScript 3 não possui nenhum método clone() ou um duplicateMovieClip(). O que acontece é que cada vez que é executado o comando mc.addChild(errado) ele não está criando cópias da imagem, e sim mudando o seu container (mudando de local, basicamente). Uma forma que você pode usar para conseguir fazer isso, é colocar todo o carregamento da imagem dentro do loop for. Assim, a cada volta do loop ele criaria um novo objeto Loader, e carregaria a imagem novamente. Esse meio tem um problema a se considerar: você estaria carregando o mesmo arquivo 9 vezes, fazendo 9 requisições ao servidor. É uma solução com um custo que pode ser alto. Para conseguirmos criar cópias dela, sem precisar carregar várias vezes, e em se tratando de imagens, penso em 2 alternativas: 1. Deixar de carregá-las de um arquivo externo. Incorporar as imagens ao fla, e exportá-las na biblioteca como classes. Assim, dentro desse for, onde está instanciando o mc pode já instanciar o objeto da classe da imagem incorporada. Assim você vai criar várias cópias (objetos da mesma classe), só precisa mudar ali trocando as posições. 2. Continuar carregando as imagens do arquivo externo e usar a propriedade BitmapData desse objeto para criar 'cópias' dele (essa forma funciona por ser uma imagem). Dessa forma, poderia criar uma função que te retorne a cópia já pronta (fazendo todo o processo para copiar a partir do BitmapData), e dentro do for, você chamaria essa função. Bom, você disse que é novato no ramo. Se não entender algo é só perguntar. Não detalhei muito por que são caminhos completamente diferentes, prefiro que se necessário for, você escolha um primeiro, pra eu não ter 3 trabalhos, sendo que só um vai ser usado. Aproveitando que você disse que é novato, não sei se você conhece, mas se não conhecer, põe esse link nos favoritos: http://help.adobe.co...10.0/index.html aí você tem a documentação da linguagem, em português. Dá até pra você tentar fazer o que falei sozinho, mesmo que não consiga 100%, garanto que vai aprender bastante. Qualquer dúvida só falar =) []'s Compartilhar este post Link para o post Compartilhar em outros sites
Tomzinho 0 Denunciar post Postado Fevereiro 18, 2010 Olá Michel Araújo, muito obrigado pelas dicas, acredito que da segunda forma ficaria fácil. Você pode continuar a me ajudar?! Eu tenho esse link adicionado em meu navegador, procuro muitas documentações na internet, mais realmente esse caminho para duplicar o movieclip, para quem usa AS2 é uma tarefa simples, mais AS3 muda muito, nada que depois de assimilado fica fácil. Grato até o momento pela ajuda. Compartilhar este post Link para o post Compartilhar em outros sites
Michel Araújo 0 Denunciar post Postado Fevereiro 18, 2010 Bom Tomzinho, é o seguinte: Primeiro passo é remover isso: var endcerto:URLRequest = new URLRequest('img/certo.png'); var certo:Loader = new Loader(); certo.load(endcerto); var enderrado:URLRequest = new URLRequest('img/errado.png'); var errado:Loader = new Loader(); errado.load(enderrado); Não será mais necessário. Agora, vamos importar as imagens para o flash, usando o menu File >> Import >> Import to Library... Escolhas as duas imagens (errado.png e certo.png), importe-as. Caso a Biblioteca não esteja aberta, aperte Ctrl+L para abri-la. Você verá algo assim: O que importa pra nós são os Symbol. Caso sua biblioteca já tenha muitos itens, é só você clicar neles e procurar quais são os simbolos que estão as suas imagens. Um preview aparece logo em cima. Agora clique com o botão direito sobre um dos symbol (ou o certo ou o errado), e escolha a opção [/b]properties...[/b]. Deve aparecer algo assim: Caso não apareça todas essas opções, clique no botão advanced que fica assim. Onde tem name renomeie seu simbolo com um nome mais descritivo. Pode ser Certo, se estiver editando o simbolo da imagem de certo, ou Errado, se for o outro. No menuzinho que tem Graphic troque para MovieClip. Mais em baixo, marque a caixinha Export for ActionScript e na caixinha Class, coloque o mesmo nome que colocou no name, caso já não fique igual (pro resto do exemplo vou considerar que você pos 'Certo' e 'Errado' aqui, isso é importante, é o nome que usaremos no ActionScript. Atenção também às maiusculas e minusculas. Como pos aqui, tem que por no AS). Deve ficar algo assim: Dê ok, e faça o mesmo procedimento para o outro simbolo, mudando os nomes, seja o certo ou o errado. Eles devem ficar +ou- assim na biblioteca: Agora sim, vamos ao ActionScript. Sua função pega vai ficar +ou- assim: function pega(evt:MouseEvent):void{ for(var i = 0; i < 8 ; i++){ //Aqui, eu crio o objeto a cada volta do loop for (então vão ser 8 objetos) var imgCerto:MovieClip = new Certo(); //Aqui eu mudo a posição de cada um deles, usando o i. Senão vão ser 8 objetos //na mesma posição, um em cima do outro. Essa arrumação vai depender de como você //quer aí, pode mudar o y também, e colocar nas posições desejadas. imgCerto.x = imgCerto.width * i; //Finalmente adiciono cada um deles ao palco addChild(imgCerto); } } Olha como ficou aqui, após clicar no botao_btn, que chama a função pega(essa bola verde é minha imagem do certo =]): Toda vez que você chamar algo assim: var meuMCCerto:MovieClip = new Certo(); //ou var meuMCErrado:MovieClip = new Errado(); você terá um novo objeto MovieClip com aquela imagem que você importou e exportou da biblioteca. Agora é só arrumar como você quer aí... pq sinceramente não entendi pra que você queria 8 imagens do certo no palco heheh... mas espero que pelo menos agora você saiba fazer. Guardei essas imagens, pretendo criar depois um tópico aqui no forum com essa, e as outras formas de 'duplicar' um objeto de exibição. []'s Compartilhar este post Link para o post Compartilhar em outros sites
Tomzinho 0 Denunciar post Postado Fevereiro 23, 2010 //área de carregamento do xml var carrega:URLLoader = new URLLoader(); carrega.addEventListener(Event.COMPLETE, xmlCarregado); carrega.load(new URLRequest('soma.xml')); //variáveis do ambiente var calc:XMLList; var MeuXml:XML; var p:Array = new Array(); var s:Array = new Array(); var o:Array = new Array(); var r:Array = new Array(); var z:Array = new Array(); //puxa os itens do xml para os arrays function xmlCarregado(e:Event):void { MeuXml = XML(e.target.data); calc = MeuXml.children(); for each (var element in calc) { p.push(element.parcela1); s.push(element.parcela2); o.push(element.operando); r.push(element.resultado); botao1_btn.enabled = false; botao1_btn.alpha = 0; //array das respostas que não é exibido na tela, somente capturado } //função ouvinte do botão botao_btn.addEventListener(MouseEvent.CLICK, pega); function pega(evt:MouseEvent):void { z.push(resp0.text, resp1.text, resp2.text, resp3.text, resp4.text, resp5.text, resp6.text, resp7.text); for(var i = 0; i < 8; i++){ var imgcerto:MovieClip = new Certo(); var imgerrado:MovieClip = new Errado(); local0_mc.addChild(imgcerto); //aqui só carrega o último local1_mc.addChild(imgcerto); ... local7_mc.addChild(imgcerto); } //} /*botao1_btn.addEventListener(MouseEvent.CLICK, corrige); function corrige(e:MouseEvent):void { botao1_btn.alpha = 100; botao1_btn.enabled = true; z.splice(0,1,2,3,4); }*/ //exiba na tela for(var i = 0; i < 8 ; i++){; this["ent"+ String(i)].text = p[i]; this["sup"+ String(i)].text = s[i]; this["op"+ String(i)].text = o[i]; } } Gostaria de fazer algo como se a criança fizesse o cálculo errado aparecesse o X, e certo aparece o certo. existe um botão que irá aparecer para apagar as contas com os cálculos errados, mais tá comentado...pois não consegui desvendar o mistério das cópias dos movie clips... muito obrigado Michel pela dica anterior. Do jeito que mostrou aparece os 8 certos ou 8 errados, mais gostaria de posiciona-los no movie clip vazio, ou naqueles lugares que estão no modelo acima. (Cada movie Clip vazio eu renomeie como local0_mc, local1_mc ... até local7_mc). Se tiver tudo errado e precisar começar do zero...Podem falar, todas as dicas e lógicas necessárias serão bem vidas, e ao final desse trabalho nos laboratórios educacionais das escola municipais no qual faço parte, colocarei os créditos as pessoas que colaboraram. Desde já agradeço...as respostas imediatas! Compartilhar este post Link para o post Compartilhar em outros sites
Michel Araújo 0 Denunciar post Postado Fevereiro 23, 2010 ok, mas você precisa da comparação pra ver se a resposta está certa ou não né? dentro do for você faz a comparação (com if), e dependendo do resultado (true ou false) você carrega um new Certo(), ou new Errado() dentro de um novo MovieClip. Aí é só adicionar esse novo movieclip ao 'container' correspondente (os local0_mc...). Algumas coisas que podem ajudar: 1. Não use z para nomear o objeto. Evite conflito com a propriedade z. 2. Não vejo necessidade de criar esses Arrays todos. Você pode trabalhar diretamente no XML carregado. E se quiser criar um Array, pode criar um Array só, para guardar os operadores e as respostas. Facilita na hora de comparar, assim ó: for each (var element in calc){ calculo.push({ parcela1: element.parcela1, parcela2: element.parcela2, operando: element.operando, resposta: element.resultado }); } Sendo que declarei o calculo como sendo um array (substituindo aquelas letras) aí na hora de acessar quando for comparar dentro do laço for você usa: var resul:MovieClip; if(Number(calculo[i].resultado) == (Number(calculo[i].parcela1) + Number(calculo[i].parcela2))){ resul = new Certo(); }else{ resul = new Errado(); } this['local' + i + '_mc'].addChild(resul); Claro que você vai precisar fazer umas verificações para determinar o operando, nesse caso simplifiquei e coloquei só adição, + creio que fique melhor que ficar trabalhando com esse monte de letras aí. Compartilhar este post Link para o post Compartilhar em outros sites
Tomzinho 0 Denunciar post Postado Fevereiro 24, 2010 //área de carregamento do xml var carrega:URLLoader = new URLLoader(); carrega.addEventListener(Event.COMPLETE, xmlCarregado); carrega.load(new URLRequest('soma.xml')); //variáveis do ambiente var calc:XMLList; var MeuXml:XML; var calculo:Array = new Array(); //puxa os itens do xml para os arrays function xmlCarregado(e:Event):void{ MeuXml = XML(e.target.data); calc = MeuXml.children(); for each (var element in calc){ calculo.push({ parcela1: element.parcela1, parcela2: element.parcela2, operando: element.operando, resultado: element.resultado}); botao1_btn.alpha = 0; botao1_btn.enabled = false; } //exiba na tela for (var h = 0; h < 8; h++){ this['ent' + h].text = calculo[h].parcela1; this['sup' + h].text = calculo[h].parcela2; this['op' + h].text = calculo[h].operando; } botao_btn.addEventListener(MouseEvent.CLICK, pega); function pega(Evento:MouseEvent):void { var recebe:Array = new Array(); recebe.push(resp0.text, resp1.text, resp2.text, resp3.text, resp4.text, resp5.text, resp6.text, resp7.text); for(var i = 0; i < 8; i++){ var resul:MovieClip; if(recebe[i] == calculo[i].resultado) { resul = new Certo(); }else{ resul = new Errado(); botao1_btn.alpha = 100; botao1_btn.enable = true; } this['local' + i].addChild(resul);//TypeError: Error #1010: A term is undefined and has no properties. //at MethodInfo-7() } } } Michel show de bola suas dicas para melhorar o código...mais uma que aprendi... seu coloco local0.addChild(resul) ele carrega naquele local, mais acredito que ele não quer duplicar o movie nos lugares... só falta isso...o resto tá ok... Compartilhar este post Link para o post Compartilhar em outros sites
Michel Araújo 0 Denunciar post Postado Fevereiro 24, 2010 Falta de atenção minha, sorry. Faz assim: root['local' + i].addChild(resul) e você mudou os nomes desses MC que recebem a imagem né? antes eram local0_mc... tirou o _mc? =) []'s Compartilhar este post Link para o post Compartilhar em outros sites
Tomzinho 0 Denunciar post Postado Fevereiro 24, 2010 Michel...muito obrigado...você é o cara! Como dizia o meu primo: " - Só um ninja pra matar outro ninja."; " - E quem tem amigo não precisa de dinheiro." Funcionou... Vou colocar resolvido agora no post... Estou elaborando vários outras atividades pedagógicas, e com certeza precisarei das suas dicas infalíveis...colocarei os créditos nos fontes de sua pessoa...valeu! Compartilhar este post Link para o post Compartilhar em outros sites
Michel Araújo 0 Denunciar post Postado Fevereiro 24, 2010 Que bom que resolveu =) A ideia aqui é essa, cada um ajudando com o que pode e sabe =) []'s Compartilhar este post Link para o post Compartilhar em outros sites
Tomzinho 0 Denunciar post Postado Fevereiro 25, 2010 //Action e Designer feitos por Wellington Severo da Silva// //Colaboração no Action por Michel Araújo// //área de carregamento do xml var carrega:URLLoader = new URLLoader(); carrega.addEventListener(Event.COMPLETE, xmlCarregado); carrega.load(new URLRequest('soma.xml')); //variáveis do ambiente var calc:XMLList; var MeuXml:XML; var calculo:Array = new Array(); //puxa os itens do xml para os arrays function xmlCarregado(e:Event):void{ MeuXml = XML(e.target.data); calc = MeuXml.children(); for each (var element in calc){ calculo.push({ parcela1: element.parcela1, parcela2: element.parcela2, operando: element.operando, resultado: element.resultado}); botao1_btn.alpha = 0; botao1_btn.enabled = false; } //exiba na tela for (var h = 0; h < 8; h++){ this['ent' + h].text = calculo[h].parcela1; this['sup' + h].text = calculo[h].parcela2; this['op' + h].text = calculo[h].operando; } //pega a resposta e analisa com o resultado do xml e apresenta a resposta botao_btn.addEventListener(MouseEvent.CLICK, pega); function pega(Evento:MouseEvent):void{ var recebe:Array = new Array(); recebe.push(resp0.text, resp1.text, resp2.text, resp3.text, resp4.text, resp5.text, resp6.text, resp7.text); for(var i = 0; i < 8; i++){ var resul:MovieClip; if(recebe[i] == calculo[i].resultado){ resul = new Certo(); }else{ resul = new Errado(); botao1_btn.alpha = 100; botao1_btn.enabled = true; } //mostra as imagens nos container root['local' + i].addChild(resul); //botão para apagar os movie clips errados botao1_btn.addEventListener(MouseEvent.CLICK, apaga); function apaga (e:MouseEvent):void { removeChild(resul); } } } } O Michel, faltou saber como apagar os movie clips, quando o aluno digitar o resultado errado...Li algumas coisas...mais não tem jeito não...Sem dicas do ninja...é difícil. De AS3, vendo nos outros post, você tem o domínio total desse "treco". "Mestre dos Magos"... Compartilhar este post Link para o post Compartilhar em outros sites
Michel Araújo 0 Denunciar post Postado Fevereiro 25, 2010 dá uma pesquisada por removeChild(). O restante é só lógica. Caso você queira remover só os 'certos' ou só os 'errados', pode criar uma variável booleana pra cada conta dessas, aí você verifica o estado dela antes de retirar... Compartilhar este post Link para o post Compartilhar em outros sites