Özel kumanda cihaz eşlemeleri ekle

Oyun Denetleyicisi kitaplığında, denetleyici cihazlarının yer aldığı dahili bir veritabanı bulunur. Bu veritabanı; düğmeleri, hareket ekseni düzenini, tanınan denetleyiciler için eşlemeyi ve tanınmayan kumandalar için varsayılan eşlemeyi yapılandırmak amacıyla kullanılır. Veritabanında birçok popüler kumanda yer alsa da belirli bir oyunla ilgili tüm cihazlar bulunmayabilir. Oyun Kumandası kitaplığı, aşağıdakileri yapabilen işlevlerle özelleştirmeyi destekler:

  • Geçerli eşleme veritabanını alın.
  • Mevcut veritabanına giriş ekleyin.
  • Mevcut veritabanı girişlerini değiştirin.
  • Mevcut veritabanının tamamını yeni bir veritabanıyla değiştirin.

Cihaz tanımlama

Denetleyici cihazları, productId ve vendorId değerleriyle tanımlanır. Tanınan her kumanda cihazının veritabanında eşleşen productId ve vendorId ile en az bir giriş bulunur. Denetleyici eşleme yapısı, giriş için uygun bir minimum ve maksimum Android API aralığı belirten alanlar içerir. Benzersiz minimum ve maksimum API aralıklarına sahip olduğu sürece veritabanında aynı productId ve vendorId değerlerine sahip birden fazla giriş bulunabilir.

Mevcut yeniden eşleme verilerinizi okuma

Mevcut yeniden eşleme verilerini almak için Paddleboat_getControllerRemapTableData işlevini kullanın.

int32_t Paddleboat_getControllerRemapTableData(
   const int32_t destRemapTableEntryCount,
   Paddleboat_Controller_Mapping_Data* mappingData)

Paddleboat_getControllerRemapTableData, dahili veritabanında bulunan toplam yeniden eşleme giriş sayısını döndürür.

Parametre Açıklama
destRemapTableEntryCount mappingData parametresinde iletilen Paddleboat_Controller_Mapping_Data öğelerinin dizi boyutu.
mappingData Paddleboat_Controller_Mapping_Data öğe dizisine işaretçi.

destRemapTableEntryCount, toplam yeniden eşleme giriş sayısından küçükse yalnızca destRemapTableEntryCount tarafından belirtilen giriş sayısı mappingData öğesine kopyalanır.

Yeniden eşleme verilerini ekleme veya değiştirme

Yeniden eşleme girişleri eklemek veya mevcut yeniden eşleme veritabanını değiştirmek için Paddleboat_addControllerRemapData işlevini kullanın.

void Paddleboat_addControllerRemapData(
   const Paddleboat_Remap_Addition_Mode addMode,
   const int32_t remapTableEntryCount,
   const Paddleboat_Controller_Mapping_Data* mappingData)
Parametre Açıklama
addMode İşlem için kullanılan ekleme kuralları. Geçerli değerler: PADDLEBOAT_REMAP_ADD_MODE_DEFAULT veya PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL
remapTableEntryCount mappingData parametresinde iletilen Paddleboat_Controller_Mapping_Data öğelerinin dizi boyutu.
mappingData Paddleboat_Controller_Mapping_Data öğe dizisine işaretçi.

Ekleme modları

addMode içinde PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL belirtilirse mevcut veritabanı silinir ve yerine yeni dizinin içeriği getirilir.

addMode içinde PADDLEBOAT_REMAP_ADD_MODE_DEFAULT belirtilirse aşağıdaki ölçütler, mappingData ile iletilen dizideki her öğeye uygulanır:

  • Paddleboat_getControllerRemapTableData benzersizse (başka bir deyişle, vendorId ve productId zaten yoksa ya da varken ancak çakışmayan bir minApi veya maxApi aralığına sahipse) giriş dahili veritabanına eklenir.
  • Paddleboat_getControllerRemapTableData benzersiz değilse (vendorId ve productId mevcutsa ve minApi veya maxApi çakışması varsa) dahili veritabanındaki mevcut girişin yerini alır.

Paddleboat_Controller_Mapping_Data yapısı:

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;

Eşleme örneği

Aşağıda bir Google Stadia Kumandayı tanımlamak için doldurulan Paddleboat_Controller_Mapping_Data gösterilmektedir:

#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
    }
};