Bueno en primera instancia los problemas que se me presentan a diario es que soy como un bohemio de la programación, por ende todo lo que hago, es combinar ejemplos, forear un poco, y arriesgarme a perder tiempo o en en el mejor de los casos lograr mi objetivo.
Mi idea:
Una aplicación, de escritorio, con accesos directos fijos a mis programas y carpetas.
Que en lo posible fuera en 3d, que sea de básicas líneas, y que tenga un fondo transparente, de manera tal que se destacaran mis ICONOS EN 3D.
En primera instancia, me registré en http://www.flare3d.com luego me descargue "FLARE3D", una excelente aplicación que permite exportar, modelos hechos en 3d max, a Flash, o no se si decir directamente a AS3. Con mucho miedo a no poder lograr nada, debido a mis pocas y malas experiencias con otros software que prometían lo mismo y resultaban muy complicados.
Luego instale Flare3d en mi pc, para mi sorpresa venia con ejemplos, para ser mas preciso 21 , al mirar dentro de cada ejemplo, me asombre lo fácil e intuitivo que era todo, lo primero que me gusto fueron las pocas líneas en AS3, luego la cantidad de posibilidades que tenia en frente mío.
Dentro de todos los ejemplos que había, el que yo justamente necesitaba no estaba, me refiero a algún objeto en 3d en el cual hacer clic y que suceda algo(creo que esto se llama evento o algo así)
Así que con esperanzas, empecé a forear, creyendo que tardarían , pero para mi sorpresa en 15 minutos, ya me habían contestado, y me habían pasado un link en el cual habia un ejemplo muy copado(para mi gusto)
http://www.flare3d.com/docs/tutorials/19%20-%20mouse%20events/
Mouse event
Se trataban de una esfera y un cubo que al presionarlos cambiaban de color,
Esto era genial para mi
Así que me lo baje y empecé a analizar
Código ActionScript :
/ Class Main.as package { import flare.basic.* import flare.events.* import flare.materials.* import flare.primitives.* import flash.display.* import flash.events.* public class Main extends Sprite { private var scene:Scene3D public function Main() { stage.quality = "medium" // creates the scene. scene = new Scene3D( this ) // creates sphere and cube. var sphere:Sphere = new Sphere( "mySphere" ) sphere.x = 10 var cube:Cube = new Cube( "myCube" ) cube.x = -10 // add objects to scene. scene.addChild( sphere ) scene.addChild( cube ) // add objects listeners. sphere.addEventListener( MouseEvent3D.CLICK, mouseClickEvent ) sphere.addEventListener( MouseEvent3D.MOUSE_OUT, mouseOutEvent ) sphere.addEventListener( MouseEvent3D.MOUSE_OVER, mouseOverEvent ) cube.addEventListener( MouseEvent3D.CLICK, mouseClickEvent ) cube.addEventListener( MouseEvent3D.MOUSE_OUT, mouseOutEvent ) cube.addEventListener( MouseEvent3D.MOUSE_OVER, mouseOverEvent ) // add scene update listener. scene.addEventListener( Scene3D.UPDATE_EVENT, updateEvent ) // set camera position and orientation. scene.camera.setPosition( 30, 30, -30 ) scene.camera.lookAt( 0, 0, 0 ) } private function updateEvent(e:Event):void { scene.rotateY( 1 ) } private function mouseClickEvent(e:MouseEvent3D):void { // change the material. var randomColor:int = 0xffffff * Math.random() var material:ShadedColorMaterial = new ShadedColorMaterial( "myMaterial", 0x000000, randomColor ) e.target.setMaterial( material ) } private function mouseOverEvent(e:MouseEvent3D):void { // change scale. e.target.setScale( 1.2, 1.2, 1.2 ) } private function mouseOutEvent(e:MouseEvent3D):void { // reset to original scale. e.target.setScale( 1, 1, 1 ) } } }
Lo primero que hice fue probar si funcionaba el “fscommand”, pero en donde ponerlo
El lugar mas indicado era aquí
Código ActionScript :
private function mouseClickEvent(e:MouseEvent3D):void { // change the material. var randomColor:int = 0xffffff * Math.random() var material:ShadedColorMaterial = new ShadedColorMaterial( "myMaterial", 0x000000, randomColor ) e.target.setMaterial( material ) }
Así que reemplace todo el choclo ese de cambios de color al azar por esto
private function mouseClickEvent(e:MouseEvent3D):void
Código ActionScript :
{ fscommand("exec", "notepad.exe") }
Y como era AS3 al fscommand había que importarlo:
Al principio debajo de todos los import puse esto:
import flash.system.fscommand;
bien probé mi ejemplo, utilizando el proyector nativo de flash, ya que la funcion fscommand no funciona en “swf” así que luego de pasar mi flash a exe, lo probé
y ¿que creen?
FUNCIONÓ
Pero me encontré con otro, problema, que el proyector nativo de flash, no soportaba transparencias,
Así que buscando me baje una versión demo de “mdm zinck 3.0.22” por que esta además de ser la ultima soporta “adobe flash placer 10” necesario para el soporte en 3d.
luego de compilar mis swf con “mdm zink” me dejaba una marca agua en el medio de la aplicación por tratarse de una versión demo, pero se me ocurrió que podia ocultar esa marca agua fuera del monitor y decentar mi swf,
así que abrí mi “swf”, que era de 800 * 600px le puse un tamaño de 1000* 600px pensando que esto era la solución. Pero nuevamente al compilar la molesta marca agua.
Asi que lo que tenia que hacer en si era correr mis modelos 3d hacía la izquierda, de manera de ocultar fuera del monitor en la parte derecha la marca agua. Como no sabia como hacer, foreé de nuevo, y me dieron las bellas líneas que me permitían correr la cámara master donde se veían los 3d a donde yo quisiera
Código ActionScript :
scene.canvas.setViewport(300, 400, 20, 0);
y lo puse encima de esto
Código ActionScript :
// start application... } // add objects listeners. sphere.addEventListener( MouseEvent3D.CLICK, pelota ) sphere.addEventListener( MouseEvent3D.MOUSE_OUT, mouseOutEvent ) sphere.addEventListener( MouseEvent3D.MOUSE_OVER, mouseOverEvent ) cylinder.addEventListener( MouseEvent3D.CLICK, cubo ) cylinder.addEventListener( MouseEvent3D.MOUSE_OUT, mouseOutEvent ) cylinder.addEventListener( MouseEvent3D.MOUSE_OVER, mouseOverEvent ) pyramid.addEventListener( MouseEvent3D.CLICK, piramide ) pyramid.addEventListener( MouseEvent3D.MOUSE_OUT, mouseOutEvent ) pyramid.addEventListener( MouseEvent3D.MOUSE_OVER, mouseOverEvent ) // add scene update listener. scene.addEventListener( Scene3D.UPDATE_EVENT, updateEvent )
jugué con los valores hasta conseguir lo deseado
listo, burle a Mdm,
pero otra vezz, me tope con un problema, en mdm no se pueden utilizar los fscommand
así que me puse a forear, en CristaLab ahí me dieron una mano
bastaba con implementar esto
Código ActionScript :
import mdm.*; //llamado a MDM un compilador exe que permite transparencias y ejecutar aplicaciones mdm.Application.init(this, initApp);
y en
Código ActionScript :
private function mouseClickEvent(e:MouseEvent3D):void { // var path:String = mdm.Application.path+"notepad.exe"; //mdm.System.exec(path); }
Esto abre el notepad, al presionar tanto la esfera como el cubo.
Yo quería que al presionar la esfera, se abriera una cosa y con el cubo se abriera otra
Asi que lo que hice fue:
Código ActionScript :
Cambiar esto // add objects listeners. sphere.addEventListener( MouseEvent3D.CLICK, mouseClickEvent ) sphere.addEventListener( MouseEvent3D.MOUSE_OUT, mouseOutEvent ) sphere.addEventListener( MouseEvent3D.MOUSE_OVER, mouseOverEvent ) cube.addEventListener( MouseEvent3D.CLICK, mouseClickEvent ) cube.addEventListener( MouseEvent3D.MOUSE_OUT, mouseOutEvent ) cube.addEventListener( MouseEvent3D.MOUSE_OVER, mouseOverEvent )
por esto
Código ActionScript :
sphere.addEventListener( MouseEvent3D.CLICK, pelota ) sphere.addEventListener( MouseEvent3D.MOUSE_OUT, mouseOutEvent ) sphere.addEventListener( MouseEvent3D.MOUSE_OVER, mouseOverEvent ) cube.addEventListener( MouseEvent3D.CLICK, cubo ) cube.addEventListener( MouseEvent3D.MOUSE_OUT, mouseOutEvent ) cube.addEventListener( MouseEvent3D.MOUSE_OVER, mouseOverEvent )
Simplemente cambie en el evento click de sphere= mouseClickEvent por pelota
y lo mismo con cube
Código ActionScript :
private function pelota(e:MouseEvent3D):void { var path:String = mdm.Application.path+"a.bat"; mdm.System.exec(path); } private function cubo(e:MouseEvent3D):void { var path:String = mdm.Application.path+"notepad.exe"; mdm.System.exec(path); }
Siguiendo con los problemas......
Este ejemplo que yo me habia bajado, no usaba ningun modelo exportado desde 3d max
Si no que tanto la pelota como el cubo eran generados
Código ActionScript :
// creates sphere and cube. var sphere:Sphere = new Sphere( "mySphere" ) sphere.x = 10 var cube:Cube = new Cube( "myCube" ) cube.x = -10
lo que yo quería era tomar un diseño hecho en 3d Max y obtener eventos por medio de as3
así que lo que hice fue tomar un ejemplo de los que se instalan con flare 3d en donde se controla
una esfera ,una pirámide y un cilindro por medio de lineas:
Código ActionScript :
{ import flare.basic.* import flare.core.* import flare.utils.* import flash.display.* import flash.events.* public class Main extends Sprite { private var scene:Scene3D private var cylinder:Pivot3D private var pyramid:Pivot3D private var sphere:Pivot3D public function Main() { stage.quality = "medium" // creates the scene. scene = new Viewer3D( this, "scene.f3d" ) // define progress and complete events. scene.addEventListener( Scene3D.PROGRESS_EVENT, progressEvent ) scene.addEventListener( Scene3D.COMPLETE_EVENT, completeEvent ) } private function progressEvent(e:Event):void { // trace( scene.loadProgress ) } private function completeEvent(e:Event):void { // trace info about the scene. Pivot3DUtils.traceInfo( scene ) // once completed, we can access to 3d objects. cylinder = scene.getChildByName( "cylinder" ) pyramid = scene.getChildByName( "pyramid" ) sphere = scene.getChildByName( "sphere" ) // we begin update the scene. scene.addEventListener( Scene3D.UPDATE_EVENT, updateEvent ) }
Y combinarlo con mi trabajo anterior.
(SE LOS DEJO CON LAS MODIFICACIONES QUE FUI ANULANDO PASO A PASO)
Código ActionScript :
package { import flare.basic.* import flare.events.* import flare.materials.* import flare.primitives.* import flare.core.* import flare.utils.* import flash.display.* import flash.events.* import mdm.*; import flash.display.Sprite; import flash.system.fscommand; public class Main extends Sprite { private var scene:Scene3D private var cylinder:Pivot3D private var pyramid:Pivot3D private var sphere:Pivot3D public function Main() { stage.quality = "medium" // creates the scene. scene = new Viewer3D( this, "scene.f3d" ) // define progress and complete events. scene.addEventListener( Scene3D.PROGRESS_EVENT, progressEvent ) scene.addEventListener( Scene3D.COMPLETE_EVENT, completeEvent ) } private function progressEvent(e:Event):void { trace( scene.loadProgress ) } private function completeEvent(e:Event):void { // trace info about the scene. Pivot3DUtils.traceInfo( scene ) // once completed, we can access to 3d objects. cylinder = scene.getChildByName( "cylinder" ) pyramid = scene.getChildByName( "pyramid" ) sphere = scene.getChildByName( "sphere" ) // we begin update the scene. scene.addEventListener( Scene3D.UPDATE_EVENT, updateEvent ) //pocisionamiento y tamaño de la camara dentro del swf yo la utilizo para evadir la marca de agua de mdm zin scene.canvas.setViewport(300, 400, 20, 0); //llamado a MDM un compilador exe que permite transparencias y ejecutar aplicaciones mdm.Application.init(this, initApp); function initApp():void{ // start application... } // add objects listeners. sphere.addEventListener( MouseEvent3D.CLICK, pelota ) sphere.addEventListener( MouseEvent3D.MOUSE_OUT, mouseOutEvent ) sphere.addEventListener( MouseEvent3D.MOUSE_OVER, mouseOverEvent ) cylinder.addEventListener( MouseEvent3D.CLICK, cilindro ) cylinder.addEventListener( MouseEvent3D.MOUSE_OUT, mouseOutEvent ) cylinder.addEventListener( MouseEvent3D.MOUSE_OVER, mouseOverEvent ) pyramid.addEventListener( MouseEvent3D.CLICK, piramide ) pyramid.addEventListener( MouseEvent3D.MOUSE_OUT, mouseOutEvent ) pyramid.addEventListener( MouseEvent3D.MOUSE_OVER, mouseOverEvent ) // add scene update listener. scene.addEventListener( Scene3D.UPDATE_EVENT, updateEvent ) // set camera position and orientation. scene.camera.setPosition( -20, 150, -90 ) scene.camera.lookAt( 50, 30, 0 ) } private function updateEvent(e:Event):void { scene.rotateY( 1 ) } private function pelota(e:MouseEvent3D):void { //fscommand("exec", "notepad.exe") var path:String = mdm.Application.path+"a.bat"; mdm.System.exec(path); //else if ( e.target.name == "Cube" ) //{ // var path:String = mdm.Application.path+"notepad.exe"; //mdm.System.exec(path); //} } private function cilindro (e:MouseEvent3D):void { var path:String = mdm.Application.path+"notepad.exe"; mdm.System.exec(path); //else if ( e.target.name == "Cube" ) //{ // var path:String = mdm.Application.path+"notepad.exe"; //mdm.System.exec(path); } private function piramide(e:MouseEvent3D):void { var path:String = mdm.Application.path+"paint.exe"; mdm.System.exec(path); //else if ( e.target.name == "Cube" ) //{ // var path:String = mdm.Application.path+"notepad.exe"; //mdm.System.exec(path); } private function mouseOverEvent(e:MouseEvent3D):void { // change scale. e.target.setScale( 1.2, 1.2, 1.2 ) } private function mouseOutEvent(e:MouseEvent3D):void { // reset to original scale. e.target.setScale( 1, 1, 1 ) } } }
Como resultado
Contento con mi resultado, sigo experimentando
archivos: http://www.megaupload.com/?d=TUKNXFR7
saludos:
Carlos Andrès Milanoff
"Todo lo que somos, son los fragmentos que captamos de nuestro etorno"