Olá, primeiramente quero dizer que não tenho postado muita coisa no blog devido a falta de tempo, e tambem de conteudo(até se alguem tiver alguma sugestão manda por email ou coloca aqui como comentario que eu farei o possivel para falar sobre o assunto).

Hoje a tarde depois de arrumar as posiçoes dezenas de movieClips para que não distorcessem eu pensei “por que eu estou fazendo isso? o flash poderia fazer sozinho”, então criei este JSFL que faz exatamente isto (link)

OBS: se o link não funcionar copie ele e cole no navegador;

Como utilizar: é só executar.

ele pega todos os itens(movieClip,Button,Graphic,TextField..)  da timeline atual e ajusta  as posiçoes dos mesmos.

para aplicar isto dentro de um movieClip , abra-o e execute o comando dentro do movie;

pra quem não conseguiu abrir o link aqui vai o codigo:

// Pixel Snapping [alk].jsfl

/*
Script criado por Armando Leopoldo Keller(http://alkeller.wordpress.com)
para instalar: só colar este arquivo em C:\Users\nome_do_usuario\AppData\Local\Adobe\Flash CS3\en\Configuration\Commands
obs: este é o caminho no windows vista
*/
for( var i = 0; i < fl.getDocumentDOM().getTimeline().layers.length; i++)
{
var layerAtual = fl.getDocumentDOM().getTimeline().layers[i];
for(var j = 0 ; j < layerAtual.frames.length ; j++)
{
var frameAtual = layerAtual.frames[j];
for(var k = 0 ; k < frameAtual.elements.length ; k++)
{
var elementoAtual = frameAtual.elements[k];
elementoAtual.x = parseInt(elementoAtual.x);
elementoAtual.y = parseInt(elementoAtual.y);
}
}
}

Qualquer coisa é só comentar, ou mandar email que eu respondo.

Olá, eu estava procurando algumas outras engines 3d para Actionscript, foi então que eu encontrei o Away3D( http://away3d.com/ ) que aparentemente parece ser melhor do que o papervision para coisas mais completas.

Se alguem testar os dois coloque a sua opnião aqui.

eu escolho o  Away3D   :D

Neste tutorial mostrarei como utilizar uma classe que eu criei para facilitar o uso de SQL em AIR (tanto para flash quanto para flex)
A classe é esta:

/*
################################################
# #
# Classe : DB (com.alkeller.air.DB) #
# Autor : Armando Leopoldo Keller #
# Versão : 1.0 #
# Contato : alksk8@hotmail.com #
# Blog : http://alkeller.wordpress.com #
# Documentaçao em breve no blog #
# #
################################################
——- Deixe os creditos na classe ———-
*/
package com.alkeller.air
{
// Imports
import flash.data.SQLResult;
import flash.filesystem.File;
import flash.data.SQLStatement;
import flash.data.SQLConnection;
import flash.events.SQLEvent;
import flash.events.SQLErrorEvent;
import flash.errors.SQLError;

// Classe;
public class DB
{
// Variaveis utilizadas;
private static var conectado:Boolean = false;
private static var dbFile:File
private static var conn:SQLConnection
private static var _sqlStatement:SQLStatement;
private static var resultado:SQLResult;
private static var retornoString:String;
private static var retornoObjeto:Object;

// Funçao Inicia :utilizada para conectar com o banco de dados;
public static function Inicia(_nome:String):String
{
conn = new SQLConnection();
dbFile = File.applicationStorageDirectory.resolvePath(String(_nome+”.db”));
try
{
conn.open(dbFile);
conectado = true;
trace(”Conectado com “+_nome+”.db”);
retornoString = “Conectado com “+_nome+”.db”;
}
catch (error:SQLError) {
conectado = false;
retornoString = “Falha ao conectar: “+error.message+”\nDetalhes: “+error.details;
}
return retornoString;
}
// Funçao executeQuery: Utilizada para executar um comando SQL(verificar quais são aceitos pelo AIR);
// Retorno: SQLResult –> http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/data/SQLResult.html
// ou String de erro;
public static function executeQuery(_sql:String):Object
{
if(conectado == true)
{
_sqlStatement = new SQLStatement();
_sqlStatement.sqlConnection = conn;
_sqlStatement.text = _sql;
try
{
_sqlStatement.execute();
resultado = _sqlStatement.getResult();
retornoObjeto = resultado;
}
catch (error:SQLError)
{
retornoString = “Falha ao executar(”+_sql+”): “+error.message+”\nDetalhes: “+error.details;
}
return retornoObjeto?retornoObjeto:retornoString;
}
else
{
return “Não conectado!”;
}
}
}
}

Classe para download: http://paginas.terra.com.br/lazer/alksk8/DB.as

Como utilizar:
1 - Importe a classe:

// OBS: Aqui é bom verificar se a classe esta no local certo com/alkeller/air/
import com.alkeller.air.*;
// ou
import com.alkeller.air.DB;

2 - Inicie o banco:

DB.Inicia(”teste”); // sendo que teste é o nome do banco

3 - Se as tabelas não existirem, crie elas:

DB.executeQuery(”CREATE TABLE IF NOT EXISTS testando (id INTEGER PRIMARY KEY AUTOINCREMENT,nome TEXT,sobrenome TEXT)”);

4.1 - Execute as Querys que desejar, por exemplo inserir alguns dados:

DB.executeQuery(”INSERT INTO testando (id,nome,sobrenome) VALUES (null,’ARMANDO LEOPOLDO’,'KELLER’)”);

4.2 - Exemplo de como buscar dados:

var obj:Object = DB.executeQuery(”SELECT * FROM testando”).data;
for(var i:uint=0; i < obj.length; i++)
{
trace(”linha: “+i)
for(var j:Object in obj[i])
{
trace(j+”: “+obj[i][j])
}
}

Aproveitem a classe :D

Em breve colocarei aqui este tutorial em video.

Olá, segue abaixo um exemplo comentado de como utilizar menus(como os da maioria dos softwares) em AIR, é um exemplo básico baseado em tutoriais da Adobe.

/*

Primeiro crie um arquivo novo(air)

crie um campo de texto com o tamanho que desejar

instancie o campo de texto como “texto” (sem as aspas)

cole o codigo a seguir no primeiro frame

*/

// importa as classes necessarias

import flash.display.NativeMenu;

import flash.display.NativeMenuItem;

import flash.display.NativeWindow;

import flash.desktop.NativeApplication;

//declara os 2 items do menu

var Menu01:NativeMenuItem;

var Menu02:NativeMenuItem;

if (NativeWindow.supportsMenu)// Se o sistema operacional for windows

{

          stage.nativeWindow.menu = new NativeMenu(); //cria o menu

          stage.nativeWindow.menu.addEventListener(Event.SELECT, selecionouUmItem);//adiciona um evento de seleção no menu

Menu01 = stage.nativeWindow.menu.addItem(new NativeMenuItem(“Primeiro item”));//adiciona o primeiro item no menu

Menu01.submenu = criaSubMenu(); // adiciona o submenu(que vai ser criado logo abaixo) ao primeiro item

Menu02 = stage.nativeWindow.menu.addItem(new NativeMenuItem(“Segundo item”));//adiciona o segundo item no menu

}

if (NativeApplication.supportsMenu)// se o sistema operacionall for mac

{

Menu01 = NativeApplication.nativeApplication.menu.addItem(new NativeMenuItem(“Primeiro item”));//adiciona o primeiro item no menu

          NativeApplication.nativeApplication.menu.addEventListener(Event.SELECT, selecionouUmItem);//adiciona um evento de seleção no menu

Menu01.submenu = criaSubMenu(); // adiciona o submenu(que vai ser criado logo abaixo) ao primeiro item

Menu02 = NativeApplication.nativeApplication.menu.addItem(new NativeMenuItem(“Segundo item”));//adiciona o segundo item no menu

}

function criaSubMenu():NativeMenu

{

var tmpMenu:NativeMenu = new NativeMenu(); // cria o submenu do primeiro item

var MenuNovo:NativeMenuItem = tmpMenu.addItem(new NativeMenuItem(“Novo”));//adiciona o item “Novo” ao submenu

var MenuSalva:NativeMenuItem = tmpMenu.addItem(new NativeMenuItem(“Salva”));//adiciona o item “Salva” ao submenu

var MenuSair:NativeMenuItem = tmpMenu.addItem(new NativeMenuItem(“Sair”));//adiciona o item “Sair” ao submenu

return tmpMenu;

}

function selecionouUmItem(e:Event)
{

texto.text = e.target.label // escreve o nome do item selecionado no campo de texto

}

Qualquer duvida é só postar que eu respondo.

Assim que sobrar algum tempo por aqui eu postarei um tutorial (bem detalhado) e com os exemplos, de como utilizar um banco de dados local com o AIR.

Olá, fiquei um tempo sem postar devido a falta de tempo , mas estou devolta, para quem ainda não sabe o Adobe AIR não é mais beta, ele ja foi lançado.

player : http://get.adobe.com/air/

Como instalar e começar com AIR + Flash : http://www.adobe.com/devnet/air/flash/getting_started.html

Se alguém tiver duvidas de como instalar ou algo do genero, fala ai que eu vou procurar sanar as duvidas.

Opa, essa semana eu estava lendo o the flash blog como de costume, e achei um post interessante com o titulo “Help me improve the flash code editor!” (The flash blog - Lee Brimelow) , aqui esta o link: http://theflashblog.com/?p=329 , espero que seja util.

Oi, eu fiquei um tempo sem postar devido a falta de tempo ( muito trabalho) .

Mas ai vai uma classe que poupa muito tempo na validação de formularios:

// Teste.as

package alkeller
{
public class Teste
{
private var campos:Array

public function Teste()
{
this.campos = new Array();
}
public function adiciona(Campo, Nome)
{
this.campos.push( { campo:Campo, nome:Nome } );
}
public function Verifica()
{
for (var i:int = 0 ; i < this.campos.length; i++)
{
if (
(this.campos[i].campo.text == undefined) ||
(this.campos[i].campo.text == “undefined”) ||
(this.campos[i].campo.text == “”) ||
(this.campos[i].campo.text == null) ||
(this.campos[i].campo.text == ” “)
)
{
return “Preencha o campo ” + this.campos[i].nome;
}
}
return true;
}
}
}

E para utilizar é simples:
1º - Crie um movieClip e instancie ele como “bt”(sem as aspas).
2º - Crie 5 campos de texto tipo input e instancie eles como(”cp1″,”cp2″ ……) obs: isso é só um exemplo, pode ser quantos campos você quiser e com o nome que você quiser.
3º - Crie um campo de texto dinamico e instancie ele de resultado
4º - Cole o codigo abaixo no frame
5º - Teste
// Teste.fla 1º frame

import alkeller.Teste
var ve:Teste = new Teste();
ve.adiciona(cp1,”Campo 1″);
ve.adiciona(cp2,”Campo 2″);
ve.adiciona(cp3,”Campo 3″);
ve.adiciona(cp4,”Campo 4″);
ve.adiciona(cp5,”Campo 5″);

bt.addEventListener(MouseEvent.CLICK,clicou);
function clicou(e:MouseEvent):void
{
if(ve.Verifica() != true)
{
resultado.text = ve.Verifica();
}
else
{
resultado.text = “Tudo preenchido”
}
}

Qualquer duvida é só falar.

Bom, aqui vai um exemplo simples de como pegar eventos em objetos 3D (papervision), por exemplo clicar num cubo…

1º crie um AS chamado testando_papervision.as, e cole o seguinte codigo:package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.objects.Cube;
import org.papervision3d.scenes.MovieScene3D;
public class testando_papervision extends Sprite
{
public function testando_papervision()
{
var rodando = false;
var cont:Sprite = new Sprite();
cont.x = stage.stageWidth * 0.5;
cont.y = stage.stageHeight * 0.5;
addChild(cont);
//
var cena:MovieScene3D = new MovieScene3D(cont);
//
var cam:Camera3D = new Camera3D();
cam.z = -500;
cam.zoom = 5;
//
var mat:BitmapFileMaterial = new BitmapFileMaterial(”porquinho1.jpg”);
mat.doubleSided = true;
mat.smooth = true;
var cubo:Cube = new Cube(mat,128,128,128);
cena.addChild(cubo);
cubo.container.addEventListener(MouseEvent.CLICK,roda);
function roda(e:MouseEvent):void
{
if(rodando == false){
rodando = true
}else{
rodando = false
}
}
this.addEventListener(Event.ENTER_FRAME,renderiza)
function renderiza(e:Event):void
{
if(rodando == true){
cubo.rotationY +=5
}
cena.renderCamera(cam);
}
}
}
}

Depois crie um Fla vazio e em propriedades , Document Class, escreva: testando_papervision

coloque uma imagem com o nome de porquinho1.jpg com 128px por 128px na mesma pasta

salve tudo e compile o flash.

Quando você clicar no cubo, se ele estiver parado ele vai começar a rodar, e se ele estiver rodando vai parar.

Até a próxima, qualquer duvida comentem.

Controlar as janelas transparentes do AIR é mais fácil do que parece, aqui vão alguns exemplos de como fazer isso:

Fechar

//tendo um movieClip com instanciado de bt_fechar
bt_fechar.addEventListener(MouseEvent.CLICK,sair);
function sair(e:MouseEvent):void{

    stage.nativeWindow.close();

}

Minimizar

//tendo um movieClip com instanciado de bt_minimizar
bt_minimizar.addEventListener(MouseEvent.CLICK,minimizar);
function minimizar(e:MouseEvent):void{

    stage.nativeWindow.minimize();

}

Maximizar

//tendo um movieClip com instanciado de bt_maximizar
bt_maximizar.addEventListener(MouseEvent.CLICK,maximizar);
function minimizar(e:MouseEvent):void{

    stage.nativeWindow.maximize();

}

Restaurar

//tendo um movieClip com instanciado de bt_restaurar
bt_restaurar.addEventListener(MouseEvent.CLICK,restaurar);
function restaurar(e:MouseEvent):void{

    stage.nativeWindow.restore();

}

Mover

//Crie um movieClip com a area para ser usada para arrasta, instancie ele como bt_arrastar
bt_arrastar.addEventListener(MouseEvent.MOUSE_DOWN,arrastar);
function arrastar(e:MouseEvent):void{

    stage.nativeWindow.startMove();

}

Dimensionar

//Crie um movieClip com a area para ser usada para dimensionar, instancie ele como bt_dimensionar
bt_dimensionar.addEventListener(MouseEvent.MOUSE_DOWN,dimensionar);
function dimensionar(e:MouseEvent):void{

    stage.nativeWindow.startResize(NativeWindowResize.BOTTOM_RIGHT);

}

A formatação do código não está das melhores( tudo feito a mão :-P ), com o tempo quero ver se consigo colocar o plugin de formatação de código aqui, ou encontrar algum que formate sozinho e gere o html com as cores e espaços tudo certos, caso alguém tenha uma sugestão ou duvida, comenta ai.

Oi, AMFPHPconn é uma classe desenvolvida por mim para facilitar a conexão com o AMFPHP segue abaixo a classe:
// AMFPHPconn.as
import mx.remoting.Service;
import mx.services.Log;
class AMFPHPconn {
public var gateway:String;
public var log:Log;
public var servico:String;
public var Servico:Service;
public function AMFPHPconn (_gateway, _servico, _log) {
this.gateway = _gateway;
this.servico = _servico;
this.log = _log;
this.Servico = new Service(this.gateway, this.log, this.servico, null, null);
}
}

Para utilizar essa classe é só colocar o arquivo AMFPHPconn.as na mesma pasta do SWF.

um exemplo de como utilizar:

// importador.as
import mx.remoting.Service;
import mx.services.Log;
import mx.rpc.RelayResponder;
import mx.rpc.FaultEvent;
import mx.rpc.ResultEvent;
import mx.remoting.PendingCall;
import mx.remoting.RecordSet;

// no flash:

#include “importador.as”
var conn:AMFPHPconn = new AMFPHPconn(”http://localhost/amfphp/gateway.php”,”Login”);
// é opcional colocar log
//com log ficaria:
//var conn:AMFPHPconn = new AMFPHPconn(”http://localhost/amfphp/gateway.php”,”Login”,new log());
var pc_loga:PendingCall = conn.Servico.loga(”armando”,”keller”);
pc_loga.responder = new RelayResponder(this,”rpc_loga”,null);
function rpc_loga(re:ResultEvent){
trace(”retornou “+re.result);
}

(more…)