La biblioteca de controles para juegos mantiene una base de datos interna de dispositivos de control, que se utiliza a fin de configurar los botones, el diseño de los ejes de movimiento, la asignación de controles reconocidos y la asignación predeterminada de controles no reconocidos. El incluye muchos controles populares, pero es posible que no incluya todos los dispositivos relevantes para un juego en particular. La biblioteca de controles para juegos admite la personalización mediante funciones que pueden realizar las siguientes acciones:
- Recuperar la base de datos de asignación actual
- Agregar entradas a la base de datos existente
- Reemplazar las entradas de la base de datos existente
- Reemplazar toda la base de datos actual por una nueva
Cómo identificar un dispositivo
Los dispositivos de control se identifican por sus valores de productId
y vendorId
.
Cada dispositivo de control reconocido tiene al menos una entrada en la base de datos con un
que coinciden con productId
y vendorId
. La estructura de asignación del control incluye campos que especifican un rango de API de Android mínima y máxima apta para la entrada. Puede existir varias entradas con los mismos productId
y vendorId
en
la base de datos, siempre y cuando tengan rangos únicos de API mínimos y máximos.
Cómo leer tus datos actuales de reasignación
Usa la función Paddleboat_getControllerRemapTableData
a fin de recuperar los datos actuales de reasignación.
int32_t Paddleboat_getControllerRemapTableData(
const int32_t destRemapTableEntryCount,
Paddleboat_Controller_Mapping_Data* mappingData)
Paddleboat_getControllerRemapTableData
muestra la cantidad total de entradas de reasignación presentes en la base de datos interna.
Parámetro | Descripción |
---|---|
destRemapTableEntryCount
|
El tamaño de array de los elementos Paddleboat_Controller_Mapping_Data que se pasaron en el parámetro mappingData . |
mappingData
|
Un puntero para un array de elementos Paddleboat_Controller_Mapping_Data . |
Si destRemapTableEntryCount
es menor que la cantidad total de entradas de reasignación,
solo se copia la cantidad de entradas especificada por destRemapTableEntryCount
en mappingData
.
Cómo agregar o reemplazar los datos de reasignación
Usa la función Paddleboat_addControllerRemapData
a fin de agregar entradas de reasignación o reemplaza la base de datos de reasignación actual.
void Paddleboat_addControllerRemapData(
const Paddleboat_Remap_Addition_Mode addMode,
const int32_t remapTableEntryCount,
const Paddleboat_Controller_Mapping_Data* mappingData)
Parámetro | Descripción |
---|---|
addMode
|
Las reglas de adición que se usan para la operación.
Los valores válidos son PADDLEBOAT_REMAP_ADD_MODE_DEFAULT o PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL . |
remapTableEntryCount
|
El tamaño de array de los elementos Paddleboat_Controller_Mapping_Data que se pasaron en el parámetro mappingData . |
mappingData
|
Un puntero para un array de elementos Paddleboat_Controller_Mapping_Data . |
Modos de adición
Si se especifica PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL
en addMode
, se borra la base de datos existente y se reemplaza por el contenido del array nuevo.
Si se especifica PADDLEBOAT_REMAP_ADD_MODE_DEFAULT
en addMode
, se aplican los siguientes criterios a cada elemento del array que se pasó en mappingData
:
- Si un elemento
Paddleboat_getControllerRemapTableData
es único (en otras palabras, si elvendorId
y elproductId
no existen, o si existen, pero tienen un rango deminApi
omaxApi
que no se superpone), la entrada se agrega a la base de datos interna. - Si el elemento
Paddleboat_getControllerRemapTableData
no es único (sivendorId
yproductId
existen y hay una superposición deminApi
omaxApi
), se reemplaza la entrada existente en la base de datos interna.
La estructura de Paddleboat_Controller_Mapping_Data
es:
typedef struct Paddleboat_Controller_Mapping_Data {
int16_t minimumEffectiveApiLevel; /** Min. API level for this entry */
int16_t maximumEffectiveApiLevel; /** Max. API level, 0 = no max */
int32_t vendorId; /** VendorID of the controller device for this entry */
int32_t productId; /** ProductID of the controller device for this entry */
int32_t flags; /** Flag bits, will be ORed with
* Paddleboat_Controller_Info.controllerFlags */
/** AMOTION_EVENT_AXIS value for the corresponding Paddleboat control axis,
* or PADDLEBOAT_AXIS_IGNORED if unsupported. */
uint16_t axisMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];
/** Button to set on positive or negative axis value,
* PADDLEBOAT_AXIS_BUTTON_IGNORED if none. */
uint8_t axisPositiveButtonMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];
uint8_t axisNegativeButtonMapping[PADDLEBOAT_MAPPING_AXIS_COUNT];
/** AKEYCODE_ value corresponding with the corresponding Paddleboat button.
* PADDLEBOAT_BUTTON_IGNORED if unsupported. */
uint16_t buttonMapping[PADDLEBOAT_BUTTON_COUNT];
} Paddleboat_Controller_Mapping_Data;
Ejemplo de asignación
A continuación, se muestra un Paddleboat_Controller_Mapping_Data
propagado a efectos de describir un control de Google Stadia:
#define PADDLEBOAT_AXIS_BUTTON_DPAD_UP 0
#define PADDLEBOAT_AXIS_BUTTON_DPAD_LEFT 1
#define PADDLEBOAT_AXIS_BUTTON_DPAD_DOWN 2
#define PADDLEBOAT_AXIS_BUTTON_DPAD_RIGHT 3
#define PADDLEBOAT_AXIS_BUTTON_L2 9
#define PADDLEBOAT_AXIS_BUTTON_R2 12
static const Paddleboat_Controller_Mapping_Data stadia_controller_map[] = {
16, 0, 0x18d1, 0x9400, PADDLEBOAT_CONTROLLER_LAYOUT_STANDARD,
{
/* LX */ AMOTION_EVENT_AXIS_X,
/* LY */ AMOTION_EVENT_AXIS_Y,
/* RX */ AMOTION_EVENT_AXIS_Z,
/* RY */ AMOTION_EVENT_AXIS_RZ,
/* L1 */ PADDLEBOAT_AXIS_IGNORED,
/* L2 */ AMOTION_EVENT_AXIS_BRAKE,
/* R1 */ PADDLEBOAT_AXIS_IGNORED,
/* R2 */ AMOTION_EVENT_AXIS_GAS,
/* HX */ AMOTION_EVENT_AXIS_HAT_X,
/* HY */ AMOTION_EVENT_AXIS_HAT_Y,
},
{
/* LX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* LY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* RX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* RY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* L1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* L2 */ PADDLEBOAT_AXIS_BUTTON_L2,
/* R1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* R2 */ PADDLEBOAT_AXIS_BUTTON_R2,
/* HX */ PADDLEBOAT_AXIS_BUTTON_DPAD_RIGHT,
/* HY */ PADDLEBOAT_AXIS_BUTTON_DPAD_DOWN,
},
{
/* LX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* LY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* RX */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* RY */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* L1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* L2 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* R1 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* R2 */ PADDLEBOAT_AXIS_BUTTON_IGNORED,
/* HX */ PADDLEBOAT_AXIS_BUTTON_DPAD_LEFT,
/* HY */ PADDLEBOAT_AXIS_BUTTON_DPAD_UP,
},
{
/* UP */ AKEYCODE_DPAD_UP,
/* LEFT */ AKEYCODE_DPAD_LEFT,
/* DOWN */ AKEYCODE_DPAD_DOWN,
/* RIGHT */ AKEYCODE_DPAD_RIGHT,
/* A */ AKEYCODE_BUTTON_A,
/* B */ AKEYCODE_BUTTON_B,
/* X */ AKEYCODE_BUTTON_X,
/* Y */ AKEYCODE_BUTTON_Y,
/* L1 */ AKEYCODE_BUTTON_L1,
/* L2 */ AKEYCODE_BUTTON_L2,
/* L3 */ AKEYCODE_BUTTON_THUMBL,
/* R1 */ AKEYCODE_BUTTON_R1,
/* R2 */ AKEYCODE_BUTTON_R2,
/* R3 */ AKEYCODE_BUTTON_THUMBR,
/* SELECT */ AKEYCODE_BUTTON_SELECT,
/* START */ AKEYCODE_BUTTON_START,
/* SYSTEM */ AKEYCODE_BUTTON_MODE,
/* TOUCHP */ PADDLEBOAT_BUTTON_IGNORED,
/* AUX1 */ PADDLEBOAT_BUTTON_IGNORED,
/* AUX2 */ PADDLEBOAT_BUTTON_IGNORED,
/* AUX3 */ PADDLEBOAT_BUTTON_IGNORED,
/* AUX4 */ PADDLEBOAT_BUTTON_IGNORED
}
};