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.








2 comentarios: