Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Mapping

Iniciado por zupervaca, 25 de Septiembre de 2006, 08:03:25 PM

« anterior - próximo »

zupervaca

Buenas, he estado mirando el motor actualmente y me he dado cuenta que el soporte para dinput es muy escaso.
Bueno al grano, la idea es hacer un mapping para vuestro motor como el que yo tengo implementado en el mio, osease, todos los perifericos de entrada se tratan como analogicos devolviendo valores entre 0 y 255.
Asi se trata el raton, teclado, pads de forma abstracta, simplificando, al programador le da igual que se pulse una tecla o se mueva el raton ya que lo que se comprueba son acciones.

Si os gusta la idea y si quereis me podria poner a implementarlo en c-sharp, os paso el codigo y si lo veis bien pues lo poneis y si no pues nada.

Vicente

Hola!

oye, has visto los últimos check-ins? Porque en las últimas actualizaciones se soporta:

- teclado
- mouse
- jostick
- pad de la 360 (wrapper sobre XInput)

Pero vamos, que toda colaboración es bienvenida y agradecida :) Así que si te apetece echar una mano, encantado ;)

Un saludo!

Vicente

zupervaca

si si, pero a lo que me refiero es que si quieres acceder al teclado tienes que usar la clase creada para el teclado y eso es algo engorroso, lo guapo es crear acciones, por ejemplo queremos que al pulsar la tecla W el personaje avance, entonces lo que se hace es crear una accion de teclado y luego se comprueba si la accion es diferente a cero, si es asi es que la tecla esta pulsado, en caso contrario no; por ahora no veras nada interesante, pero la ventaja de las acciones es esta... ahora supon que quieres que moviendo el raton hacia adelante quieres que el personaje se mueva hacia adelante, con el sistema que teneis ahora mismo tocaria cambiar la clase que se esta usando, la del teclado por la del raton, con las acciones solo se tendria que cambiar la forma en que se crea la accion, pero se comprobaria de la misma manera.

El juego de galaxywars que hice hace tiempo usa este sistema, igual que la libreria que tengo montado, un ejemplo de como se crean las acciones desde el archivo xml (aunque tambien se pueden crear desd codigo):

<?xml version="1.0"?>

<!-- Acciones del menu -->
<actions>

<!-- Menu principal -->

<!-- Moverse verticalmente -->
<action id="0" mode="timeup" elapse="400">
<plugin device="keyboard" classname="key" type="-" code="45"/> <!-- W -->
<plugin device="keyboard" classname="key" type="+" code="41"/> <!-- S -->
<plugin device="keyboard" classname="key" type="-" code="56"/> <!-- Flecha arriba -->
<plugin device="keyboard" classname="key" type="+" code="58"/> <!-- Flecha abajo -->

<plugin device="mouse" classname="axisy" type="+" direction="+" /> <!-- Eje Y valor positivo del raton -->
<plugin device="mouse" classname="axisy" type="-" direction="-" /> <!-- Eje y valor negativo del raton -->

<plugin device="gamepad" classname="axisy" type="+" direction="+" stick="0" pod="0" /> <!-- Eje y valor positivo del stick -->
<plugin device="gamepad" classname="axisy" type="-" direction="-" stick="0" pod="0" /> <!-- Eje y valor negativo del stick -->
</action>

<!-- Aceptar -->
<action id="1" mode="push">
<plugin device="keyboard" classname="key" type="+" code="86"/> <!-- Espacio -->
<plugin device="keyboard" classname="key" type="+" code="88"/> <!-- Enter -->

<plugin device="gamepad" classname="button" type="+" code="0"/> <!-- Boton 0 del pad -->
</action>



<!-- Menu durante el juego -->

<!-- Mostrar menu -->
<action id="2" mode="push">
<plugin device="keyboard" classname="key" type="+" code="0"/> <!-- Escape -->

<plugin device="mouse" classname="button" type="+" code="1"/> <!-- Boton secundario del raton -->

<plugin device="gamepad" classname="button" type="+" code="3"/> <!-- Boton 3 del pad -->
<plugin device="gamepad" classname="button" type="+" code="8"/> <!-- Boton 8 del pad -->
</action>



<!-- Durante el juego -->

<!-- Moverse verticalmente -->
<action id="3" mode="normal">
<plugin device="keyboard" classname="key" type="-" code="45"/> <!-- W -->
<plugin device="keyboard" classname="key" type="+" code="41"/> <!-- S -->

<plugin device="gamepad" classname="axisy" type="+" direction="+" stick="0" pod="0" /> <!-- Eje y valor positivo del stick -->
<plugin device="gamepad" classname="axisy" type="-" direction="-" stick="0" pod="0" /> <!-- Eje y valor negativo del stick -->
</action>

<!-- Moverse horizontalmente -->
<action id="4" mode="normal">
<plugin device="keyboard" classname="key" type="-" code="23"/> <!-- A -->
<plugin device="keyboard" classname="key" type="+" code="26"/> <!-- D -->

<plugin device="gamepad" classname="axisx" type="+" direction="+" stick="0" pod="0" /> <!-- Eje x positivo del pad -->
<plugin device="gamepad" classname="axisx" type="-" direction="-" stick="0" pod="0" /> <!-- Eje x negativo del pad -->
</action>

<!-- Disparar -->
<action id="5" mode="normal">
<plugin device="keyboard" classname="key" type="+" code="86"/> <!-- Espacio -->
<plugin device="keyboard" classname="key" type="+" code="88"/> <!-- Enter -->
<plugin device="keyboard" classname="key" type="+" code="75"/> <!-- 0 del teclado numerico -->
<plugin device="keyboard" classname="key" type="+" code="66"/> <!-- Control izquierdo -->
<plugin device="keyboard" classname="key" type="+" code="67"/> <!-- Control derecho -->

<plugin device="mouse" classname="button" type="+" code="0"/> <!-- Boton primario del raton -->

<plugin device="gamepad" classname="button" type="+" code="0"/> <!-- Boton 0 del pad -->
</action>

<!-- Disparar  verticalmente-->
<action id="6" mode="normal">
<plugin device="gamepad" classname="rotationu" type="+" direction="+" stick="0" pod="0" /> <!-- Stick de rotacion -->
<plugin device="gamepad" classname="rotationu" type="-" direction="-" stick="0" pod="0" /> <!-- Stick de rotacion -->
</action>

<!-- Disparar  horizontalmente -->
<action id="7" mode="normal">
<plugin device="gamepad" classname="rotationz" type="+" direction="+" stick="0" pod="0" /> <!-- Stick de rotacion -->
<plugin device="gamepad" classname="rotationz" type="-" direction="-" stick="0" pod="0" /> <!-- Stick de rotacion -->
</action>

<!-- Rotar horizontalmente -->
<action id="8" mode="normal">
<plugin device="keyboard" classname="key" type="-" code="57"/> <!-- Flecha izquierda -->
<plugin device="keyboard" classname="key" type="+" code="59"/> <!-- Flecha derecha -->
</action>

<!-- Avanzar -->
<action id="9" mode="normal">
<plugin device="keyboard" classname="key" type="+" code="56"/> <!-- Flecha arriba -->
</action>
</actions>


Como veras en el codigo se especifica la accion con su identificador, luego el modo en que funciona (se repite automaticamente, se debe de soltar, etc) y los plugins especifican el device a usar, el tipo de clase, si retorna un valor positivo o negativo, tambien si quieres coger el rango positivo o negativo de la clase (por ejemplo un stick), etc.

Vicente

Perdón por no responder ayer. La verdad que la idea es más que interesante, y creo que sería un muy buen añadido para el engine :) Así que si tienes ganas de aportarlo, nosotros encantados de añadirlo ;)

Un saludo!

Vicente

[EX3]

Por lo que comentas, zupervaca, parece ser un sistema de eventos asociado a teclas o botones de los perifericos, no? Digamos que seria como crear un evento que se dispare cuando pulsara la tecla escape por ejemplo, no? Si es asi la idea es muy buena :) no se me habia ocurrido algo semejane y me vendria de perlas para completar mi sencilla clase Input en la dx_lib32 (el tema es ver como crear y asociar eventos en VB 6.0 "al vuelo" como en .NET... si es que se puede, claro)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

bnl

Yo lo he entendido de otra forma. Creo no se utilizan eventos. Simplemente en vez de comprobar si se ha pulsado una determinada tecla o boton del raton se comprueba si se ha realizado una determinada accion.
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

zupervaca

Asi es bnl, se comprueba la accion cuando quieres,ademas siempre retorna un valor de 0 a 255 si retorna valores positivos y de -255 a 0 si retorna valores negativos, es decir, todas las acciones indistintamente de cual sea el origen (periferico) son analogicos lo cual abstrae completamente al programador (que es lo que mas me gusta hacer :D)
Despues cada accion puede tener diferentes modos de funcionamiento que se puede especificar el cualquier momento, por ejemplo, que la accion tenga que volver a tener el valor de 0 para que pueda retornar otra vez el valor 255 u otro (asi evitas el disparo automatico), que tenga que pasar un tiempo entre activacion y activacion de la accion, etc.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.