Özel kumanda cihaz eşlemeleri ekle

Oyun Kumandası kitaplığının dahili bir denetleyici veritabanı vardır hareket ekseni düzenini, harita oluşturma hareketlerini ve hatta tanınan denetleyicileri ve tanınmayan denetleyiciler için varsayılan eşlemeyi kullanır. İlgili içeriği oluşturmak için kullanılan veritabanı birçok popüler kumanda içerir, ancak tüm cihazları kapsamayabilir olduğunu varsayalım. Oyun Kumandası kitaplığı özelleştirmeyi destekler Şu işlemleri yapabilen işlevlerle:

  • Mevcut eşleme veritabanını alın.
  • Mevcut veritabanına giriş ekleyin.
  • Mevcut veritabanı girişlerini değiştirin.
  • Mevcut veritabanının tamamını yenisiyle değiştirin.

Bir cihazı tanımlayın

Kumanda cihazları, productId ve vendorId değerleriyle tanımlanır. Tanınan her kumanda cihazının, veritabanında productId ve vendorId eşleşiyor. Denetleyici eşleme yapısında Android API'leri için uygun bir minimum ve maksimum Android API aralığı belirten girin. Aynı productId ve vendorId değerlerine sahip birden çok giriş olabilir (benzersiz minimum ve maksimum API aralıklarına sahip oldukları sürece) veritabanını yeniden düzenleyebilir.

Mevcut yeniden harita verilerinizi okuma

Paddleboat_getControllerRemapTableData işlevini kullanarak mevcut yeniden eşleme verilerini alabilirsiniz.

int32_t Paddleboat_getControllerRemapTableData(
   const int32_t destRemapTableEntryCount,
   Paddleboat_Controller_Mapping_Data* mappingData)

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

Parametre Açıklama
destRemapTableEntryCount Dizi boyutu Paddleboat_Controller_Mapping_Data öğe mappingData parametresinde geçirildi.
mappingData İşaretçi: Paddleboat_Controller_Mapping_Data öğeleri.

destRemapTableEntryCount, toplam yeniden eşleme girişlerinin sayısından azsa yalnızca destRemapTableEntryCount tarafından belirtilen giriş sayısı kopyalanır mappingData konumuna eklendi.

Yeniden eşleme verileri ekle veya değiştir

Şunu eklemek için Paddleboat_addControllerRemapData işlevini kullanın: girişleri yeniden eşleyebilir veya mevcut yeniden eşleme veritabanını değiştirebilirsiniz.

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 Dizi boyutu Paddleboat_Controller_Mapping_Data öğe mappingData parametresinde geçirildi.
mappingData İşaretçi: Paddleboat_Controller_Mapping_Data öğeleri.

Ekleme modları

addMode içinde PADDLEBOAT_REMAP_ADD_MODE_REPLACE_ALL belirtilirse veritabanı silinir ve yerine yeni dizinin içeriğiyle değiştirilir.

addMode içinde PADDLEBOAT_REMAP_ADD_MODE_DEFAULT belirtilirse aşağıdaki ölçüt, mappingData hücresinde geçirilen dizideki her bir öğeye uygulanır:

  • Paddleboat_getControllerRemapTableData benzersizse (diğer bir deyişle vendorId ve productId mevcut değil ya da mevcut ancak bir minApi veya maxApi aralığı varsa) giriş, örneğidir.
  • Paddleboat_getControllerRemapTableData benzersiz değilse (vendorId productId varsa ve minApi veya maxApi çakışması varsa) dahili veritabanındaki mevcut girişin yerine geçer.

Paddleboat_Controller_Mapping_Data yapısı şöyledir:

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, şununla doldurulan bir Paddleboat_Controller_Mapping_Data gösterilmektedir: Google Stadia Kumanda tanımlayın:

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