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

গেম GameTextInput লাইব্রেরি ব্যবহার করা একটি পূর্ণ-স্ক্রীন অ্যান্ড্রয়েড অ্যাপ লেখার একটি সহজ বিকল্প যা পাঠ্য ইনপুটের জন্য নরম কীবোর্ড ব্যবহার করে।

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

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

প্রাপ্যতা

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

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

  • একটি স্বতন্ত্র লাইব্রেরি হিসাবে: গাইডের বাকি অংশ ব্যবহারের পদক্ষেপগুলি বর্ণনা করে৷

উল্লেখ্য যে উপরের দুটি পদ্ধতি পারস্পরিক একচেটিয়া।

আনুষ্ঠানিক GameTextInput রিলিজ নিম্নলিখিত চ্যানেলগুলিতে উপলব্ধ:

এই নির্দেশিকাটি প্রথম ব্যবহারের ক্ষেত্রে কভার করে। জিপ ফাইল রিলিজ ব্যবহার করতে, প্যাকেজের ভিতরে পাঠানো নির্দেশাবলী পড়ুন।

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

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

  1. আপনার গেমের build.gradle ফাইলে GameTextInput লাইব্রেরি নির্ভরতা যোগ করতে Jetpack Android গেমস পৃষ্ঠার নির্দেশাবলী অনুসরণ করুন। মনে রাখবেন যে আপনার অ্যাপ্লিকেশনগুলি যদি গেমঅ্যাক্টিভিটি ব্যবহার করে তবে তারা স্বতন্ত্র 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. আপনার জাভা কার্যকলাপে এই নতুন InputEnabledTextView ক্লাসটি পুনরুদ্ধার করুন। আপনি যখন ভিউ বাইন্ডিং ব্যবহার করেন তখন এটি আপেক্ষিক সহজ:

    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. আপনার সি লাইব্রেরিতে, GameTextInput_setInputConnectioninputConnection পাস করুন। একটি কলব্যাক পাস করুন GameTextInput_setEventCallback এ C state struct GameTextInputState হিসাবে ইভেন্টগুলি সম্পর্কে অবহিত হতে।

    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 লাইব্রেরিতে, 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 লাইব্রেরিতে ইউটিলিটি ফাংশন রয়েছে যা আপনাকে জাভা স্টেট অবজেক্ট এবং সি স্টেট স্ট্রাকটের মধ্যে রূপান্তর করতে দেয়। GameTextInput_showIme এবং GameTextInput_hideIme ফাংশনের মাধ্যমে IME দেখানো এবং লুকানোর কার্যকারিতা অ্যাক্সেস করুন।

তথ্যসূত্র

GameTextInput দিয়ে অ্যাপ তৈরি করার সময় বিকাশকারীরা নিম্নলিখিতগুলি সহায়ক হতে পারে:

প্রতিক্রিয়া

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