Oyun Kumandası kitaplığını kullanma

Aşağıdaki işlevleri kullanarak oyununuza oyun kumandası desteği ekleyin: emin olmanız gerekir.

Oyun Kumandası kitaplığını başlatma ve kaldırma

Paddleboat_init'ı kullanma işlevini kullanın.

Paddleboat_ErrorCode Paddleboat_init(JNIEnv *env, jobject jcontext)

Paddleboat_init iki parametre alır:

  • JNIEnv işaretçisi mevcut ileti dizisine eklendi
  • Bir jobject JNI nesnesi referansı Context türetilmiş sınıf. Tüm Context türetilmiş sınıf nesnesi, şunlar dahil ancak bunlarla sınırlı olmamak üzere geçerlidir: Activity, NativeActivity, veya GameActivity.

Paddleboat_init karşılığında iade Başlatma başarılıysa PADDLEBOAT_NO_ERROR, aksi takdirde uygun bir hata kodu gösterilir hatası döndürülür.

Oyunun olup olmadığını kontrol etmek için Paddleboat_isInitialized aracını kullanabilirsiniz Denetleyici kitaplığı başarıyla başlatıldı. Bir boole değeri döndürür değer. True (doğru) ise API kullanılabilir.

bool Paddleboat_isInitialized()

Başvuruyu sonlandırmadan önce Paddleboat_destroy işlevini kullanın. Fonksiyon, tek bir parametresini içeren mevcut ileti dizisine ekli bir JNIEnv öğesine yönlendiren bir işaretçi içerir. Paddleboat_init, Paddleboat_destroy tarihinden sonra tekrar aranabilir.

void Paddleboat_destroy(JNIEnv *env)

Yaşam döngüsü olayları kitaplığına bilgi sağlar

Oyun Kumandası kitaplığı, etkinlik yaşam döngüsü onStop ve onStart etkinlikleri. Şunu çağırın: Paddleboat_onStop ve Paddleboat_onStart işlevlerini çağırın. Her iki işlev de tek parametre: mevcut ileti dizisine ekli bir JNIEnv işaretçisi.

void Paddleboat_onStop(JNIEnv *env)
void Paddleboat_onStart(JNIEnv *env)

Denetleyici durum geri çağırması kaydetme veya kaldırma

Oyun Kumandası kitaplığı, bir oyunu bildirmek için kumanda durumu geri çağırmasını kullanır otomatik olarak devreye girer. Sadece bir kumanda destekler durum geri araması yapabilirsiniz.

  • Kumanda durumu geri çağırması kaydetmek veya öncekileri değiştirmek için yeni bir geri çağırma işleviyle kaydedilmiş geri çağırmayı içeriyorsa, Paddleboat_setControllerStatusCallback işlevini kullanın.
  • Şu anda kayıtlı olan bir geri aramayı kaldırmak için NULL veya nullptr kodunu iletin.
  • userData parametresi, kullanıcı tanımlı veriler için isteğe bağlı bir işaretçidir. İlgili içeriği oluşturmak için kullanılan userData parametresi, geri çağırma işlevine aktarılır. Bu işaretçi amacıyla yapılan sonraki bir çağrıyla değiştirilene kadar dahili olarak saklanır. Paddleboat_setControllerStatusCallback
void Paddleboat_setControllerStatusCallback(Paddleboat_ControllerStatusCallback
  statusCallback, void *userData)

Geri çağırma işlevinin işlev imzası şöyledir:

typedef void (*Paddleboat_ControllerStatusCallback)(
  const int32_t controllerIndex,
  const Paddleboat_ControllerStatus controllerStatus,
  void *userData)
Parametre Açıklama
controllerIndex geri arama. 0 ile
arasında bir değer olacaktır PADDLEBOAT_MAX_CONTROLLERS - 1
controllerStatus Enum değeri PADDLEBOAT_CONTROLLER_JUST_CONNECTED veya
PADDLEBOAT_CONTROLLER_JUST_DISCONNECTED.
userData Kullanıcıya yönelik isteğe bağlı bir işaretçi (NULL olabilir) son çağrıda belirtilen tanımlanmış verileri Paddleboat_setControllerStatusCallback

Oyun Kumandası kitaplığını güncelleme işlevini çağırın

Oyun Kumandası kitaplığını güncelleme işlevi, Paddleboat_update , tercihen karenin başına yakın bir yerde, oyun çerçevesi başına bir kez çağrılmalıdır. İşlev tek bir parametre, bir JNIEnv mevcut ileti dizisi.

void Paddleboat_update(JNIEnv *env)

Etkinlikleri işle

Giriş etkinliklerini alırken oyununuzun şunları yapması gerekir: incelenmek üzere Oyun Kumandası kitaplığına yönlendirin. Oyun Kumandası kitaplığı, bir giriş etkinliğinin, yönetilen etkinliklerinden biriyle ilişkilendirilip ilişkilendirilmediğini değerlendirir cihazlar. Yönetilen cihazlardan gelen etkinlikler işlenir ve kullanılır.

Oyun Kumandası kitaplığı iki tür giriş etkinliğini destekler: AInputEvents ve GameActivity giriş etkinlikleri.

AInputEvent işleme

Oyununuz AInputEvents numaralı telefonu arayarak Paddleboat_processInputEvent etkinlik işleme kodunuzdan kaldırın.

int32_t Paddleboat_processInputEvent(const AInputEvent *event)

Paddleboat_processInputEvent, etkinlik yoksayıldıysa 0 değerini ve 1 değerini döndürür etkinlik Oyun Kumandası kitaplığı tarafından işlenip kullanıldıysa

GameActivity etkinlik işleme

Oyununuzda GameActivity kullanılıyorsa yönlendir GameActivityKeyEvent ve Arayarak GameActivityMotionEvent etkinlikleri Paddleboat_processGameActivityKeyInputEvent veya Paddleboat_processGameActivityMotionInputEvent etkinlik işleme kodunuzdan kaldırın.

int32_t Paddleboat_processGameActivityKeyInputEvent(const void *event,
                                                    const size_t eventSize)
int32_t Paddleboat_processGameActivityMotionInputEvent(const void *event,
                                                       const size_t eventSize)
Parametre Açıklama
event Bir GameActivityKeyEvent veya bağlı olarak GameActivityMotionEvent yapısı ilişkin temel bilgileri içerir.
eventSize Etkinliğin bayt cinsinden boyut event parametresinde iletilen yapı.

Etkinlik yoksayıldıysa her iki işlev de 0, etkinlik yoksayıldıysa 1 değerini döndürür. işlenip Oyun Kumandası kitaplığı tarafından kullanılır.

GameActivity, aktif hareket ekseninin GameActivityPointerAxes_enableAxis işlevini kullanın. İlgili içeriği oluşturmak için kullanılan Paddleboat_getActiveAxisMask çağrısı, bağlı kullanıcılar tarafından kullanılan ve o anda etkin olan hareket ekseninin bir bit maskesini döndürür. kontrol eder.

uint64_t Paddleboat_getActiveAxisMask()

Bunun nasıl yapılacağını gösteren bir örnek için Oyun Kumandası kitaplık örneğine bakın. GameActivity kullanır. Örnek, aktif eksen maskesini yoklar ve Yeni eksen kullanıldığında GameActivity. Bu işlem NativeEngine::CheckForNewAxis() işlevi.

void NativeEngine::CheckForNewAxis() {
    // Tell GameActivity about any new axis ids so it reports
    // their events
    const uint64_t activeAxisIds = Paddleboat_getActiveAxisMask();
    uint64_t newAxisIds = activeAxisIds ^ mActiveAxisIds;
    if (newAxisIds != 0) {
        mActiveAxisIds = activeAxisIds;
        int32_t currentAxisId = 0;
        while(newAxisIds != 0) {
            if ((newAxisIds & 1) != 0) {
                LOGD("Enable Axis: %d", currentAxisId);
                GameActivityPointerAxes_enableAxis(currentAxisId);
            }
            ++currentAxisId;
            newAxisIds >>= 1;
        }
    }
}

Denetleyicileri okuma

Oyun Kumandası kitaplığı, belirli bir denetleyici. Geçerli dizin değerleri aralığı: 0 - PADDLEBOAT_MAX_CONTROLLERS - 1. İlgili içeriği oluşturmak için kullanılan Paddleboat_getControllerStatus işlevi, belirtilen bir denetleyici dizininin durumunu belirler.

Paddleboat_ControllerStatus Paddleboat_getControllerStatus(
  const int32_t controllerIndex)

Bağlı bir kumandadan gelen bilgileri okumak için üç işlev vardır.

Kumanda adı

Paddleboat_getControllerName function iki giriş parametresi alır: denetleyici dizini, arabellek boyutu ve denetleyici ad dizesini depolayacak bir arabellek. Ad dizesi UTF-8 kodlamasını kullanan C dizesi. Cihazın adı dahili olarak alınır InputDevice.getName() kullanılıyor.

Paddleboat_getControllerName, adı başarıyla getirirse şunu döndürür: PADDLEBOAT_NO_ERROR, aksi takdirde uygun bir hata kodu döndürülür.

Paddleboat_ErrorCode Paddleboat_getControllerName(const int32_t controllerIndex,
                                                  const size_t bufferSize,
                                                  char *controllerName);
Parametre Açıklama
controllerIndex geri arama. 0 ile
arasında bir değer olacaktır PADDLEBOAT_MAX_CONTROLLERS - 1
bufferSize tarafından geçirilen arabelleğin bayt cinsinden boyutu controllerName ise ad dizesi şöyle olur. arabelleğe sığdırmak için gerekirse kısaltılır.
controllerName bufferSize baytlık arabelleğe yönlendiren bir işaret olması gerekir. Bu ad, UTF-8 kodlamasının kullanıldığı bir C dizesi olarak depolanmalıdır.

Kumanda cihaz bilgileri

Paddleboat_getControllerInfo function, iki giriş parametresi alır: a ve Paddleboat_Controller_Info yapısına işaret eden bir işaretçi içerir.

Paddleboat_Controller_Info alanı verilerle başarıyla doldurulduysa Paddleboat_getControllerInfo, PADDLEBOAT_NO_ERROR değerini döndürür, aksi takdirde uygun hata kodu döndürülür.

Paddleboat_ErrorCode Paddleboat_getControllerInfo(const int32_t controllerIndex,
  Paddleboat_Controller_Info *controllerInfo)

Paddleboat_Controller_Info yapısı, cihaza özel bilgiler içerir öğrenmek istiyorum.

typedef struct Paddleboat_Controller_Info {
    uint32_t controllerFlags;
    int32_t controllerNumber;
    int32_t vendorId;
    int32_t productId;
    int32_t deviceId;
    Paddleboat_Controller_Thumbstick_Precision leftStickPrecision;
    Paddleboat_Controller_Thumbstick_Precision rightStickPrecision;
} Paddleboat_Controller_Info;

typedef struct Paddleboat_Controller_Thumbstick_Precision {
    float stickFlatX;
    float stickFlatY;
    float stickFuzzX;
    float stickFuzzY;
} Paddleboat_Controller_Thumbstick_Precision;

Bazı struct üyeleri, Şununla ilişkili: InputDevice denetleyici:

controllerNumber    -   InputDevice.getControllerNumber()
vendorId              - InputDevice.getVendorId()
productId             - InputDevice.getProductId()
deviceId              - InputDevice.getId()
  • stickFlat değeri, merkezdeki düz konumun kapsamını gösterir. Bu değer, özellikle varsayılan bir merkez "ölü alt bölge" hesaplaması için yararlıdır açık otomatik olarak ortalayan cihazlardır.
  • stickFuzz değeri, hata toleransını veya hata toleransının ne kadar değer, gürültü ve cihaz hassasiyeti nedeniyle gerçek değerden farklı olabilir sınırlamaları vardır.

Her iki değer de her iki boyutta da maksimum eksen değerine (1.0) normalleştirilir.

controllerFlags üyesi, bağımsız bit maskesi uygulanmış bit maskelerinin bir kombinasyonunu içerir bayraklar ve çok bitli kombinasyon değerleri sunar.

Şu komutla controllerFlags mantıksal AND işlemi gerçekleştiriliyor: PADDLEBOAT_CONTROLLER_LAYOUT_MASK, Paddleboat_ControllerButtonLayout sıralaması. Bu sıralama, düğmeyi belirtir kumanda tarafından kullanılan ikonografi ve düzen.

enum Paddleboat_ControllerButtonLayout {
    //  Y
    // X B
    //  A
    PADDLEBOAT_CONTROLLER_LAYOUT_STANDARD = 0,
    //  △
    // □ ○
    //  x
    PADDLEBOAT_CONTROLLER_LAYOUT_SHAPES = 1,
    //  X
    // Y A
    //  B
    PADDLEBOAT_CONTROLLER_LAYOUT_REVERSE = 2,
    // X Y R1 L1
    // A B R2 L2
    PADDLEBOAT_CONTROLLER_LAYOUT_ARCADE_STICK = 3,
    PADDLEBOAT_CONTROLLER_LAYOUT_MASK = 3
};

Aşağıdaki sabit değerler, yetenek bitlerini tanımlar. Bir denetleyicinin bir özelliği destekliyorsa mantıksal bir AND controllerFlags karşısında sabit kalır. Sıfır olmayan bir sonuç, yeteneğin tarafından desteklenir.

PADDLEBOAT_CONTROLLER_FLAG_TOUCHPAD

Bu işaret biti ayarlanırsa kumandada entegre bir dokunmatik alan bulunur. Öğe dokunmatik alana basıldığında, kumanda, PADDLEBOAT_BUTTON_TOUCHPAD bitini Paddleboat_Controller_Data.buttonsDown alanına girin.

PADDLEBOAT_CONTROLLER_FLAG_VIRTUAL_MOUSE

Bu işaret biti ayarlanırsa kumanda bir işaretçi cihaz emülasyonu yapar. İlgili içeriği oluşturmak için kullanılan Paddleboat_Controller_Data yapısının virtualPointer üyesi sanal işaretçinin mevcut koordinatlarıyla doldurulur.

Kumanda verileri

Paddleboat_getControllerData işlevi, iki giriş parametresi alır: ve Paddleboat_Controller_Data yapısına işaret eden bir işaretçi içerir. Eğer Paddleboat_Controller_Data, verilerle başarıyla dolduruldu. Paddleboat_getControllerInfo, PADDLEBOAT_NO_ERROR değerini döndürür, aksi takdirde uygun hata kodu döndürülür.

Paddleboat_ErrorCode Paddleboat_getControllerData(const int32_t controllerIndex,
  Paddleboat_Controller_Data *controllerData)

Paddleboat_Controller_Data yapısı, geçerli kontrol girişini içerir değerleridir.

typedef struct Paddleboat_Controller_Data {
    uint64_t timestamp;
    uint32_t buttonsDown;
    Paddleboat_Controller_Thumbstick leftStick;
    Paddleboat_Controller_Thumbstick rightStick;
    float triggerL1;
    float triggerL2;
    float triggerR1;
    float triggerR2;
    Paddleboat_Controller_Pointer virtualPointer;
} Paddleboat_Controller_Data;

typedef struct Paddleboat_Controller_Pointer {
    float pointerX;
    float pointerY;
} Paddleboat_Controller_Pointer;

typedef struct Paddleboat_Controller_Thumbstick {
    float stickX;
    float stickY;
} Paddleboat_Controller_Thumbstick;

Değer aralıkları

Giriş türü Değer aralığı
Resim çubuğu ekseni -1.0-1.0
Tetikleyiciler 0.0-1.0
Sanal işaretçiler 0.0 - pencere genişliği/yüksekliği (piksel cinsinden)

Yapı ayrıntıları

Yapı üyesi Açıklama
buttonsDown Düğme başına bit alanı dizisi. Düğme bit maskesi sabitler paddlebot.h içinde tanımlanır. ve şununla başlar: PADDLEBOAT_BUTTON_.
timestamp. En son kumanda girişinin zaman damgası unutmayın. Zaman damgası, saat dilimi.
virtualPointer Sanal işaretçi konumu. Yalnızca PADDLEBOAT_CONTROLLER_FLAG_VIRTUAL_MOUSE işareti controllerFlags içinde ayarlandı, aksi takdirde 0.0, 0.0.