GameTextInput   Android গেম ডেভেলপমেন্ট কিটের অংশ।

GameTextInput লাইব্রেরি ব্যবহার করা হল ফুল-স্ক্রিন Android অ্যাপ লেখার একটি সহজ বিকল্প যা টেক্সট ইনপুটের জন্য সফট কীবোর্ড ব্যবহার করে।

GameTextInput সফ্ট কীবোর্ড দেখাতে বা লুকাতে, বর্তমানে এডিট করা টেক্সট সেট করতে বা পেতে এবং টেক্সট পরিবর্তন করা হলে বিজ্ঞপ্তি পেতে একটি সহজ API প্রদান করে। এটি সম্পূর্ণ টেক্সট এডিটর অ্যাপের জন্য নয়, তবে গেমের সাধারণ ব্যবহারের ক্ষেত্রে বেছে নেওয়া ও কম্পোজ করার জন্য সহায়তা প্রদান করে। এছাড়াও, এই লাইব্রেরি উন্নত ইনপুট মেথড এডিটর (IME) ফিচার যেমন বানান- পরীক্ষা, অটো-কমপ্লিট ও একাধিক কী অক্ষর সাপোর্ট করে।

ইন্টার্নালি, GameTextInput ইনপুট টেক্সট (সাথে প্রাসঙ্গিক স্টেট) ইন্টার্নাল বাফার GameTextInput::currentState_-এ যোগ করে এবং এতে কোনও পরিবর্তন হলে অ্যাপকে বিজ্ঞপ্তি পাঠায়। অ্যাপটি তারপরে এর রেজিস্টার করা কলব্যাক ফাংশনে টেক্সট প্রসেসিং পারফর্ম করে।

উপলভ্যতা

GameTextInput নিম্নলিখিত উপায়ে ব্যবহার করা যেতে পারে:

  • GameActivity-র সাথে একসাথে: GameActivity, GameTextInput ইন্টিগ্রেট করে। যেসব অ্যাপ্লিকেশন GameActivity ব্যবহার করে, সেগুলি শুধুমাত্র ইন্টিগ্রেটেড GameTextInput ব্যবহার করতে পারে। ব্যবহার সংক্রান্ত নির্দেশাবলী GameActivity পৃষ্ঠায় সম্পূর্ণভাবে ডকুমেন্ট করা আছে। GameActivity ও GameTextInput ইন্টিগ্রেশনের নমুনা দেখতে, games-samples repository দেখুন। এই ব্যবহারের মডেলটি এই নির্দেশিকার আওতায় পড়ে না।

  • স্ট্যান্ডঅ্যালোন লাইব্রেরি হিসেবে: নির্দেশিকার বাকি অংশে ব্যবহারের ধাপগুলি বর্ণনা করা আছে।

মনে রাখবেন, উপরে উল্লেখ করা দুটি পদ্ধতি পারস্পরিকভাবে এক্সক্লুসিভ।

আনুষ্ঠানিক GameTextInput রিলিজ Jetpack গেম লাইব্রেরিতে উপলভ্য Google Maven-এ রিলিজ করা হয়েছে।

আপনার বিল্ড সেট-আপ করা

GameTextInput Android Archive (AAR) হিসেবে ডিস্ট্রিবিউট করা হয়। এই AAR-এ Java ক্লাস এবং C সোর্স কোড আছে, যা GameTextInput-এর নেটিভ ফিচার প্রয়োগ করে। Prefab-এর মাধ্যমে আপনার বিল্ড প্রসেসের অংশ হিসেবে আপনাকে এইসব সোর্স ফাইল যোগ করতে হবে, যা আপনার CMake প্রোজেক্ট বা NDK বিল্ড-এর কাছে নেটিভ লাইব্রেরি ও সোর্স কোড প্রকাশ করে।

  1. আপনার গেমের build.gradle ফাইলে GameTextInput লাইব্রেরি ডিপেন্ডেন্সি যোগ করতে, Jetpack Android গেম পৃষ্ঠায় দেওয়া নির্দেশাবলী অনুসরণ করুন। মনে রাখবেন যে আপনার অ্যাপ্লিকেশন GameActivity ব্যবহার করলে, সেগুলি স্ট্যান্ডঅ্যালোন GameTextInput লাইব্রেরি ব্যবহার করতে পারবে না।

  2. gradle.properties-এ নিম্নলিখিত লাইন আছে কিনা দেখুন:

    # Tell Android Studio we are using AndroidX.
    android.useAndroidX=true
    # Use Prefab 1.1.2 or higher, which contains a fix for "header only" libs.
    android.prefabVersion=1.1.2
    # Required only if you're using Android Studio 4.0 (4.1 is recommended).
    # android.enablePrefab=true
    
  3. game-text-input প্যাকেজ ইমপোর্ট করুন এবং আপনার প্রোজেক্টের CMakeLists.txt ফাইলে টার্গেটে এটি যোগ করুন:

    find_package(game-text-input REQUIRED CONFIG)
    ...
    target_link_libraries(... game-text-input::game-text-input)
    
  4. আপনার গেমের .cpp ফাইলগুলির মধ্যে একটিতে, GameTextInput ইমপ্লিমেন্টেশন যোগ করতে নিচের লাইনটি যোগ করুন:

    #include <game-text-input/gametextinput.cpp>
    
  5. GameTextInput C API ব্যবহার করে এমন সোর্স ফাইলে, হেডার ফাইল অন্তর্ভুক্ত করুন:

    #include <game-text-input/gametextinput.h>
    
  6. অ্যাপটি কম্পাইল ও রান করুন। আপনার CMake সংক্রান্ত সমস্যা থাকলে, AAR এবং build.gradle ফাইল সঠিকভাবে সেট-আপ করা আছে কিনা তা যাচাই করুন। #include ফাইলটি খুঁজে না পেলে, আপনার CMakeLists.txt কনফিগারেশন ফাইল যাচাই করুন।

আপনার বিল্ড ইন্টিগ্রেট করা

  1. আপনার C থ্রেড থেকে যা আগে থেকেই JVM-এর সাথে অ্যাটাচ করা আছে অথবা অ্যাপের মূল থ্রেড, JNIEnv পয়েন্টার সহ GameTextInput_init কল করুন।

    static GameTextInput* gameTextInput = nullptr;
    
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_gametextinput_testbed_MainActivity_onCreated(JNIEnv* env,
      jobject this) {
    {
        if(!gameTextInput)
          gameTextInput = GameTextInput_init(env);
        ...
    }
    
  2. InputConnection-এ অ্যাক্সেস সহ একটি InputEnabledTextView Java ক্লাস তৈরি করুন।

    public class InputEnabledTextView extends View implements Listener {
      public InputConnection mInputConnection;
      public InputEnabledTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
      }
    
      public InputEnabledTextView(Context context) {
        super(context);
      }
      public void createInputConnection(int inputType) {
        EditorInfo editorInfo = new EditorInfo();
        editorInfo.inputType = inputType;
        editorInfo.actionId = IME_ACTION_NONE;
        editorInfo.imeOptions = IME_FLAG_NO_FULLSCREEN;
        mInputConnection = new InputConnection(this.getContext(), this,
                new Settings(editorInfo, true)
        ).setListener(this);
      }
    
      @Override
      public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        if (outAttrs != null) {
            GameTextInput.copyEditorInfo(mInputConnection.getEditorInfo(), outAttrs);
        }
        return mInputConnection;
      }
    
      // Called when the IME input changes.
      @Override
      public void stateChanged(State newState, boolean dismissed) {
        onTextInputEventNative(newState);
      }
      @Override
      public void onImeInsetsChanged(Insets insets) {
        // handle Inset changes here
      }
    
      private native void onTextInputEventNative(State softKeyboardEvent);
    }
    
  3. UI লেআউটে তৈরি করা InputEnabledTextView যোগ করুন। যেমন, activity_main.xml-এ থাকা নিম্নলিখিত কোডটি স্ক্রিনের নিচের দিকে পজিশন করতে পারে:

    <com.android.example.gametextinputjava.InputEnabledTextView
        android:id="@+id/input_enabled_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
    
  4. আপনার Java অ্যাক্টিভিটিতে এই নতুন InputEnabledTextView ক্লাসটি রিট্রিভ করুন। View Binding ব্যবহার করলে এটি তুলনামূলকভাবে সহজ:

    public class MainActivity extends AppCompatActivity {
      ...
      private ActivityMainBinding binding;
      private InputEnabledTextView inputEnabledTextView;
    
      private native void setInputConnectionNative(InputConnection c);
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        ...
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        inputEnabledTextView = binding.inputEnabledTextView;
        inputEnabledTextView.createInputConnection(InputType.TYPE_CLASS_TEXT);
        setInputConnectionNative(inputEnabledTextView.mInputConnection);
      }
    
  5. আপনার C লাইব্রেরিতে, inputConnection-কে GameTextInput_setInputConnection-এ পাস করুন। C স্টেট স্ট্রাকচার GameTextInputState GameTextInput_setEventCallback হিসেবে ইভেন্ট সম্পর্কে বিজ্ঞপ্তি পেতে, একটি কলব্যাক পাস করুন।

    extern "C"JNIEXPORT void JNICALL
    Java_com_gametextinput_testbed_MainActivity_setInputConnectionNative(
      JNIEnv *env, jobject this, jobject inputConnection) {
      GameTextInput_setInputConnection(gameTextInput, inputConnection);
      GameTextInput_setEventCallback(gameTextInput,[](void *ctx, const GameTexgtInputState *state) {
        if (!env || !state) return;
        // process the newly arrived text input from user.
        __android_log_print(ANDROID_LOG_INFO, "TheGreateGameTextInput", state->text_UTF8);
      }, env);
    }
    
  6. আপনার C লাইব্রেরিতে, call GameTextInput_processEvent ফাংশনটি কল করুন, যা ইন্টার্নালি আপনার অ্যাপের জন্য আগের ধাপে রেজিস্টার করা কলব্যাক ফাংশনকে কল করে, যাতে স্টেট পরিবর্তন হলে ইভেন্ট হ্যান্ডেল করা যায়।

    extern "C"
    JNIEXPORT void JNICALL
    Java_com_gametextinput_testbed_InputEnabledTextView_onTextInputEventNative(
      JNIEnv* env, jobject this, jobject soft_keyboard_event) {
      GameTextInput_processEvent(gameTextInput, soft_keyboard_event);
    }
    

ইউটিলিটি ফাংশন

GameTextInput লাইব্রেরিতে ইউটিলিটি ফাংশন অন্তর্ভুক্ত থাকে যা আপনাকে Java স্টেট অবজেক্ট এবং C স্টেট স্ট্রাক্টের মধ্যে কনভার্ট করতে দেয়। GameTextInput_showIme ও GameTextInput_hideIme ফাংশনের মাধ্যমে IME দেখানো ও লুকানোর জন্য ফাংশনালিটি অ্যাক্সেস করুন।

রেফারেন্স

ডেভেলপাররা GameTextInput-এর সাথে অ্যাপ তৈরি করার সময় নিম্নলিখিত বিষয়গুলি সহায়ক হিসেবে পেতে পারেন:

মতামত

GameTextInput সংক্রান্ত যেকোনও সমস্যা ও প্রশ্নের জন্য, Google IssueTracker-এ একটি বাগ তৈরি করুন।