Elektra 102 Denunciar post Postado Janeiro 27, 2011 Além do incremento/decremento para o frame rate em uma animação deve exibir em uma caixa de texto dinâmico o valor inicial (12) e atualizar após acionar cada função. info.text = stage.frameRate; Ao desativar o Strict Mode funciona perfeitamente. No CS5 foi necessário embedar para 'numerals'. Mas ativado exibe erro: 1067: Implicit coercion of a value of type Number to an unrelated type String. Deu pra compreender que a propriedade text se refere a uma String e o frame rate a Number. Nenhuma errata da editora para este exercício. Encontrei esta referência no Help (tradução google): Conversões explícitas É útil usar conversões explícitas ou vazamento, quando você compilar no modo estrito, porque pode haver momentos em que você não quer uma incompatibilidade de tipo para gerar um erro em tempo de compilação. Este pode ser o caso quando você sabe que a coerção converter os valores corretamente em tempo de execução. Por exemplo, quando se trabalha com dados recebidos de um formulário, você pode querer contar com a coerção para converter valores string certos valores numéricos. O código a seguir gera um erro em tempo de compilação mesmo que o código seja executado corretamente no modo padrão: quantityField var: String = "3"; var quantidade: int quantityField = / / erro de compilação do tempo no modo estrito Se você quiser continuar usando o modo estrito, mas gostaria que a string convertida para um inteiro, você pode usar a conversão explícita, como segue: quantityField var: String = "3"; var quantidade: int = int (quantityField); / / conversão explícita êxito. Vou tentar fazer a conversão, mas o que desejo é compreender para outras situações. O Flash por default traz o Strict Mode selecionado e todos os exercícios do livro que estou estudando são desativados. Isso traz algum benefício? Complica um bocado para quem está aprendendo. :ermm: Abraços Compartilhar este post Link para o post Compartilhar em outros sites
brunobispo 20 Denunciar post Postado Janeiro 27, 2011 Elektra, Strict Mode faz o Flash compilar utilizando tipagem estática. Isso significa que ele vai verificar os tipos do seu filme no momento da compilação. A vantagem nisso é que seu filme vai ter um desempenho melhor, uma vez que depois da compilação, no dia-a-dia, quando ele estiver sendo executado no computador dos usuários, ele não precisará mais conferir os tipos. Entendeu? Além disso, a tipagem ajuda você a manter o controle sobre sua programação. Os erros servem pra ajudar e não para atrapalhar. Eles vão te avisar quando você tentar usar um tipo diferente daquele que você estava esperando. Muito provavelmente isso vai evitar muitos problemas que poderiam vir a ocorrer sem você nem saber. Imagine a seguinte situação: Arquivo Boneco.as: package { import flash.display.Sprite; public class Boneco extends Sprite { public var forca:Number; public function matar(outro:Boneco):Boolean { return forca > outro.forca; } } } Arquivo principal: var boneco1:Boneco = new Boneco(); boneco1.forca = 1.2; var boneco2:Boneco = new Boneco(); boneco2.forca = .5; var resultadoBriga:Boolean = boneco1.matar(boneco2); if (resultadoBriga) trace('boneco1 tentou matar boneco2 e conseguiu.'); else trace('boneco1 tentou matar boneco2 e NÃO conseguiu.'); Imprimiria "boneco1 tentou matar boneco2 e conseguiu." na output. Tudo conforme o planejado. Porém, se você não estivesse usando Strict Mode e trocasse a força do boneco2 por ".5" (com aspas, sendo uma String), imprimiria "boneco1 tentou matar boneco2 e NÃO conseguiu." Com Strict Mode habilitado, você receberia um erro em tempo de compilação e poderia corrigi-lo. Imagine, agora, que você tivesse uma função que definisse uma força aleatória, mas que por algum motivo tivesse que fazê-la retornar um tipo String: Arquivo principal: var boneco1:Boneco = new Boneco(); boneco1.forca = Number(gerarForcaAleatoria()); // note o casting var boneco2:Boneco = new Boneco(); boneco2.forca = Number(gerarForcaAleatoria()); // note o casting var resultadoBriga:Boolean = boneco1.matar(boneco2); if (resultadoBriga) trace('boneco1 tentou matar boneco2 e conseguiu.'); else trace('boneco1 tentou matar boneco2 e NÃO conseguiu.'); function gerarForcaAleatoria():String // String apenas para exemplificar. Number seria o tipo ideal. { return String(Math.random() * 2); } Utilizando Strict Mode, precisaríamos fazer o casting (conversão) do resultado da função para aplicá-lo no parâmetro forca dos nossos bonecos. Isso ainda é bom. Assim você sempre vai saber que as coisas estão funcionando como deveriam. Viu como o Strict Mode não é um vilão? Compartilhar este post Link para o post Compartilhar em outros sites
Elektra 102 Denunciar post Postado Janeiro 28, 2011 hahahhh, podia ser uma função pra 'esfolar' o autor do livro, isso sim. :lol: Até estudar com esse livro eu nem sabia que existia Strict Mode. (São carneirinho iluminou o caminho) Fica bem mais legal aprender direto com a tipagem adequada, já chega os erros da edição, e nem foi falha na tradução para português. Mas por outro lado, o livro tem um conteúdo legal e muitos exemplos, coisa que não cheguei nem perto no curso. O jeito é encarar na boa. Valeu pela força Bruno, vou ver se acerto na conversão. Dou retorno do resultado. Chega de 'maltratar os bonecos' ... :grin:... abraços Compartilhar este post Link para o post Compartilhar em outros sites
Elektra 102 Denunciar post Postado Fevereiro 1, 2011 Consegui me achar com a conversão, mas achei tortuoso fazer isso em cada função. Ainda não acertei na verificação da função que faz o decremento e trava em um valor mínimo. Por enquanto o code está assim: import flash.events.MouseEvent; var fps:uint; fps = stage.frameRate; info.text = fps.toString(); acelera_btn.addEventListener(MouseEvent.CLICK, aceleraClick, false, 0, true); desacelera_btn.addEventListener(MouseEvent.CLICK, desaceleraClick, false, 0, true); function aceleraClick(evt:MouseEvent):void { var somaFps:uint; somaFps = stage.frameRate += 10; info.text = somaFps.toString(); } function desaceleraClick(evt:MouseEvent):void { // >>> FUNCIONA COM ERRO <<< var diminuiFps:uint; diminuiFps = stage.frameRate -= 10 ; if(diminuiFps > 10) { diminuiFps -= 10; } info.text = diminuiFps.toString(); // ORIGINAL /*if (stage.frameRate > 10) { stage.frameRate -= 10; } info.text = stage.frameRate;*/ } trace(stage.frameRate); Baixei 2 exemplos hoje, ainda não tive oportunidade de tentar adaptar ao meu exercício. Me chamou a atenção que nenhum deles usa conversão e funcionam com o Strict Mode Ativado. A diferença é que definem a exibição do fps inicial na caixa de texto dinâmico como String. Um é todo com elementos dinâmicos, usa ENTER_FRAME e condicionais para fps mínimo (6) e máximo (300). Define o valor inicial para 24. Esse tá beleza, apenas o incremento/decremento é lento. currentRate.text="24"; O outro é feito com anima na timeline, tem um leve bug ao informar os valores, mas funciona corretamente. Também define fps mínimo e máximo. O lado bom da história, o site onde encontrei o exemplo dinâmico, tem um monte de tutoriais ótimos + fla para download. Adorei. :grin: (os bugs do livrinho tá rendendo) Compartilhar este post Link para o post Compartilhar em outros sites
Elektra 102 Denunciar post Postado Fevereiro 3, 2011 êeeee, agora sim [RESOLVIDO], e o melhor de tudo, compreendi o que fiz. Exemplo online >> Clique aqui Code: package { import flash.display.MovieClip; import flash.events.MouseEvent; import flash.display.Stage; import caurina.transitions.Tweener; public class newFrameRate extends MovieClip { private var curFrames: uint = 24; public function newFrameRate():void { info.text = "24 fps"; acelera_btn.buttonMode = true; desacelera_btn.buttonMode = true; acelera_btn.addEventListener(MouseEvent.CLICK, aceleraClick, false, 0, true); acelera_btn.addEventListener(MouseEvent.MOUSE_OVER, onOver, false, 0, true); acelera_btn.addEventListener(MouseEvent.MOUSE_OUT, onOut, false, 0, true); desacelera_btn.addEventListener(MouseEvent.CLICK, desaceleraClick, false, 0, true); desacelera_btn.addEventListener(MouseEvent.MOUSE_OVER, onOver, false, 0, true); desacelera_btn.addEventListener(MouseEvent.MOUSE_OUT, onOut, false, 0, true); } private function aceleraClick(evt:MouseEvent):void { curFrames += 6; if(curFrames > 60) { curFrames = 60; } info.text = String(curFrames) + " fps" ; stage.frameRate = curFrames; } private function desaceleraClick(evt:MouseEvent):void { curFrames -= 6; if(curFrames < 6) { curFrames = 6; } info.text = String(curFrames) + " fps"; stage.frameRate = curFrames; } private function onOver(evt:MouseEvent):void { Tweener.addTween(evt.target, {alpha:.5, time:1}); } private function onOut(evt:MouseEvent):void { Tweener.addTween(evt.target, {alpha:1, time:1}); } } } Ao fazer a conversão usando 'toString()': function aceleraClick(evt:MouseEvent):void { var somaFps:uint; somaFps = stage.frameRate += 6; if(somaFps > 60) { somaFps = stage.frameRate = 60; } info.text = somaFps.toString() + " fps"; } function desaceleraClick(evt:MouseEvent):void { var diminuiFps:uint; diminuiFps = stage.frameRate -= 6; if(diminuiFps < 6) { diminuiFps = stage.frameRate = 6; } info.text = diminuiFps.toString() + " fps"; } ganhei meu dia hoje ... :graduated: Compartilhar este post Link para o post Compartilhar em outros sites