viernes, 30 de julio de 2010

JInput, usa tus controles de juego en Java. Parte I Detectar los controles

Cuantas veces cuando creamos un juego o alguna aplicación en Java en la cual interactúe el usuario, nos vemos en la necesidad de agregar soporte para un control, para dejar de lado el aburrido teclado :).

El problema es que nos encontramos con que hay opciones especificas a una plataforma, normalmente a Windows usando DirectX. Como usuario de Linux busque una opción que se adecuara a mis necesidades, así encontré JInput para definirlo usare la misma información que se encuentra en la pagina:

"The JInput Project hosts an implementation of an API for game controller discovery and polled input. It is part of a suite of open-source technologies initiated by the Game Technology Group at Sun Microsystems with intention of making the development of high performance games in Java a reality.

The API itself is pure Java and presents a platform-neutral completely portable model of controller discovery and polling. It can handle arbitrary controllers and returns both human and machine understandable descriptions of the inputs available."


Bueno lo interesante aqui es que es neutral a la plataforma a la que se use para esto usa plugins especificos al Sistema Operativos, sin mas que hablar vamos  a ver como funciona:

Requerimientos:

Se necesita un conocimiento básico de Java.

Una vez descargado JInput tendremos una serie de archivos así como se ve en la figura:



De todos estos archivos solo nos interesa jinput.jar y las librerias nativas de acuerdo al SO y a la arquitectura del computador que se este usando, en mi caso uso Ubuntu 10.4 de 64 bits asi que usare libjinput-linux64.so si tienes una distribucion de linux de 32 bits usaras libjinput-linux.so

Vamos a crear un nuevo proyecto en eclipse nos vemos a File >> New >> Java Project, colocamos el nombre de JInputTest a nuetro proyecto, clic en siguiente, ahora vamos a agregar la libreria jinput.jar y libjinput-linux64.so, para esto hacemos clic en la pestaña Libraries, clic en add jar y seleccionamos jinput.jar, luego expandimos la libreria JRE System Library dentro de el encontramos un item que dice Native Library Location, hacemos double clic y colocamos la ruta la carpeta donde se encuentra la libreria libjinput-linux64.so.




Una vez preparado el proyecto vamos a proceder a crear la clase de prueba, la llamaremos JInputTest.java

JInputTest.java

import net.java.games.input.Controller;
import net.java.games.input.ControllerEnvironment;


public class JInputTest {
    public static void main(String[] args){
        //Obtenermos los controles que detecta nuestra computadora
        Controller[] controllers = ControllerEnvironment.getDefaultEnvironment().getControllers();
        for(Controller c : controllers){
            System.out.println("Encontrado el control " + c.getName() + " que es un " + c.getType());
        }
    }
}


El método getControllers() se encargara de detectar todos los controles que tengamos conectados a nuestra PC, con getName() obtenemos el nombre comercial del control y getType() nos dirá que tipo de control es.

La salida del programa dependerá del control que tengan:

Encontrado el control DragonRise Inc.   Generic   USB  Joystick   que es un Stick


Ahora que sabemos cual es nuestro control vamos a ver que componentes tenemos, para esto agregamos:

JInputTest.java


import net.java.games.input.Component;
import net.java.games.input.Controller;
import net.java.games.input.ControllerEnvironment;


public class JInputTest {
    public static void main(String[] args){
        //Obtenermos los controles que detecta nuestra computadora
        Controller[] controles = ControllerEnvironment.getDefaultEnvironment().getControllers();
        for(Controller c : controles){
            System.out.println("Encontrado el control " + c.getName() + " que es un " + c.getType());
        }
        //Obtenemos nuestro control
        Controller controlActual = controles[0];
        //Obtenemos los componentes del control
        Component[] componentes = controlActual.getComponents();
        int i = 0;
        for(Component c : componentes){
            System.out.println("Componente " + i + " :" +c.getName());
            i++;
        }
    }
}

Ejecutamos y tendremos los componentes de nuestro control.

Componente 0 :Trigger
Componente 1 :Thumb
Componente 2 :Thumb 2
Componente 3 :Top
Componente 4 :Top 2
Componente 5 :Pinkie
Componente 6 :Base
Componente 7 :Base 2
Componente 8 :Base 3
Componente 9 :Base 4
Componente 10 :Base 5
Componente 11 :Base 6
Componente 12 :x
Componente 13 :y
Componente 14 :z
Componente 15 :rx
Componente 16 :rz
Componente 17 :pov


Por el momento eso es todo, en la segunda parte de este tutorial veremos como interactuar con nuestro control.








jueves, 22 de julio de 2010

Data Centric Features en FlashBuilder 4

Hola hoy les mostrare un video que realice hace ya algún tiempo para un concurso en RIAgora, en este muestro una de las características de FlashBuilder 4: Data Centric Features.



Espero sea de su agrado.
DCF Flash Builder 4

lunes, 19 de julio de 2010

Conectar BlazeDS con Java

Hola hoy día les voy a presentar un pequeño tutorial sobre como conectar BlazeDS con Java.

Para las personas que usan Adobe flex como front-end y Java como back-end surge la necesidad comunicar estas tecnologías, existen varias opciones entre estas esta usar servicios HTTP, servicios Web u objetos remotos. Todas estas son buenas opciones y cada una de ellas tiene sus pros, sus contras y una forma especial de implementación.

BlazeDS surgio como una alternativa muy potente para comunicar Java y Adobe Flex  desde que Adobe decidió liberarlo en el 2007 junto con la especificación de AMF, siendo este una de las mas grandes noticias para los desarrolladores de Flex y Java. Bueno sin mas preámbulos vamos a desarrollar el tutorial.

REQUERIMIENTOS:

No se necesita grandes conocimientos en Java o Flex solo conocimientos básicos, manos a la obra.

Primero vamos a configurar la parte de Java:
En Java importamos el war que se encuentra dentro de distribucion BlazeDS:



Luego especificamos la ruta en la cual se encuentra el war de BlazeDS y hacemos clic en Terminar:



Una vez que tenemos la configuración de Java creamos un paquete llamado prueba y dentro de el una clase PruebaBlaze.java y escribimos el siguiente método.

PruebaBlaze.java

package prueba;

public class PruebaBlaze {
    public String saludar(String texto){
        return "Hola " + texto + " desde Java";
    }
}

Luego tenemos que decirle a BlazeDS que exponga nuestro método para que pueda ser consumido por Flex, para eso vamos al archivo remoting-config.xml
dentro de la carpeta WebContent/WEB-INF/flex, la estructura de nuestro proyecto quedaría así:
 


remoting-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service"
    class="flex.messaging.services.RemotingService">

    <adapters>
        <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
    </adapters>

    <default-channels>
        <channel ref="my-amf"/>
    </default-channels>
    
    <destination id="miServicio">
        <properties>
            <source>prueba.PruebaBlaze</source>
        </properties>
    </destination>

</service>

El destino viene a ser el nombre con el cual se expondrá nuestra clase, la cual se encuentra dentro de la etiqueta source. Luego agregamos nuestro proyecto BlazeDS_Java a nuestro servidor de aplicaciones.

 Con este paso finalizamos la parte de Java, ahora vamos por el cliente Flex.


Configuración de la parte Flex:
Al usar FlashBuilder 4  la configuración usando ya sea el sdk flex 3 o sdk flex 4 debe de ser la misma. Creamos un nuevo proyecto de Flex con el nombre de BlazeDS_Flex, seleccionamos el tipo de aplicación Web y Servidor J2EE y BlazeDS como se ve en la imagen:



Presionamos siguiente y configuramos las siguientes opciones:
  • En el root folder especificamos la ruta del WebContent de nuestro proyecto BlazeDS_Java.
  • En root URL agregamos la dirección de nuestro servidor de aplicaciones y agregamos el context root del proyecto BlazeDS_Java.
  • En context root el context root del proyecto BlazeDS_Java.



Finalizamos y agregamos el siguiente codigo:

BlazeDS_Flex.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <fx:Script>
        <![CDATA[
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import mx.controls.Alert;

            protected function ServicioRO_faultHandler(event:FaultEvent):void
            {
                txtError.text = event.fault.message;
            }

            protected function ServicioCR_resultHandler(event:ResultEvent):void
            {
                Alert.show(event.result as String);
            }

            protected function btnInvocar_clickHandler(event:MouseEvent):void
            {
                ServicioCR.token = ServicioRO.saludar(txtNombre.text);
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <mx:RemoteObject id="ServicioRO" destination="miServicio" fault="ServicioRO_faultHandler(event)"/>
        <mx:CallResponder id="ServicioCR" result="ServicioCR_resultHandler(event)" fault="ServicioRO_faultHandler(event)"/>
    </fx:Declarations>
    <s:layout>
        <s:VerticalLayout paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"/>
    </s:layout>
    <mx:Form>
        <mx:FormItem label="Nombre">
            <s:TextInput id="txtNombre"/>
        </mx:FormItem>
        <mx:FormItem>
            <s:Button id="btnInvocar" label="Invocar Metodo Java" click="btnInvocar_clickHandler(event)"/>
        </mx:FormItem>
        <mx:FormItem label="Error">
            <s:TextInput id="txtError" width="100%" color="red"/>
        </mx:FormItem>
    </mx:Form>
</s:Application>

Algunas cosas que remarcar:
RemoteObject: Es la clase que nos permite usar objetos remotos dentro de esta tenemos el destino el cual debemos de apuntar a nuestro servicio expuesto en el archivo remoting-config.xml recuerdan?

CallResponder: Nos permite manejar los resultados de llamadas asíncronas hechas de servicio basados en RPC.

Luego ejecutamos nuestra clase en flex y si no sucede ningún problema o error saldria lo siguiente en nuestro navegador


Colocamos nuestro nombre y hacemos clic en el botón y voila:




Eso es todo amigos, espero sus sugerencias.




domingo, 18 de julio de 2010

!Bienvenido!

Hola soy Victor y les doy la bienvenida a mi blog, aquí pretenderé crear un espacio de discusión para los diferentes temas que tengan relación con las tecnologías RIA, programación, base de datos, opensource, etc.


Espero que lo que veas aquí sea les sea de ayuda y de su agrado.