বড় পর্দা resizability সমর্থন

ফোন থেকে বিভিন্ন বড় স্ক্রিনের ডিভাইসে গেম প্রসারিত করার ফলে আপনার গেম কীভাবে উইন্ডো ম্যানেজমেন্ট করবে, তা নিয়ে কিছু বিষয় বিবেচনা করতে হয়। গুগলবুক , ক্রোমওএস এবং পিসিতে গুগল প্লে গেমস- এ আপনার গেম একটি মূল ডেস্কটপ ইন্টারফেসের উপরে উইন্ডো মোডে চলতে পারে। অ্যান্ড্রয়েড ১২এল (এপিআই লেভেল ৩২) বা তার উচ্চতর সংস্করণে চালিত এবং ৬০০ডিপি-র বেশি স্ক্রিন প্রস্থের নতুন অ্যান্ড্রয়েড ট্যাবলেট ও ​​ফোল্ডেবল ডিভাইসগুলিতে আপনার গেম অন্যান্য অ্যাপ্লিকেশনের সাথে স্প্লিট-স্ক্রিন মোডে পাশাপাশি চলতে পারে, এর আকার পরিবর্তন করা যায়, এবং এমনকি ফোল্ডেবল ডিভাইসগুলিতে ভেতরের ও বাইরের ডিসপ্লের মধ্যে সরানোও যায়। এর ফলে উইন্ডোর আকার এবং কিছু ডিভাইসে ওরিয়েন্টেশনের কনফিগারেশনে পরিবর্তন আসে।

ইউনিটি গেমের সাথে আকার পরিবর্তনযোগ্যতা

বেসিক বড় স্ক্রিন কনফিগারেশন

আপনার গেমটি আকার পরিবর্তনযোগ্যতা সামলাতে সক্ষম কিনা তা ঘোষণা করুন:

<android:resizeableActivity="true" or "false" />

যদি রিসাইজযোগ্যতা সমর্থন করা সম্ভব না হয়, তবে নিশ্চিত করুন যে গেম ম্যানিফেস্টে সর্বনিম্ন এবং সর্বোচ্চ সমর্থিত অ্যাস্পেক্ট রেশিও স্পষ্টভাবে সংজ্ঞায়িত করা আছে:

<!-- Render full screen between 3:2 and 21:9 aspect ratio -->
<!-- Let the platform letterbox otherwise -->
<activity android:minAspectRatio="1.5">
<activity android:maxAspectRatio="2.33">

পিসিতে গুগল প্লে গেমস

পিসিতে গুগল প্লে গেমসের জন্য, প্ল্যাটফর্মটি নির্দিষ্ট অ্যাস্পেক্ট রেশিও বজায় রেখে উইন্ডোর আকার পরিবর্তনের সুবিধাটি পরিচালনা করে। উইন্ডোর আকার স্বয়ংক্রিয়ভাবে সর্বোত্তম মাপে লক হয়ে যায়। আপনার গেমের প্রাথমিক ওরিয়েন্টেশন ল্যান্ডস্কেপ হলে আপনাকে অন্তত ১৬:৯ অ্যাস্পেক্ট রেশিও এবং গেমটি পোর্ট্রেট মোডে থাকলে ৯:১৬ অ্যাস্পেক্ট রেশিও সাপোর্ট করতে হবে। সেরা অভিজ্ঞতার জন্য, ল্যান্ডস্কেপ গেমের ক্ষেত্রে ২১:৯, ১৬:১০, এবং ৩:২ অ্যাস্পেক্ট রেশিও স্পষ্টভাবে সাপোর্ট করুন। এক্ষেত্রে উইন্ডোর আকার পরিবর্তনের সুবিধা থাকা আবশ্যক নয়, তবে অন্যান্য ফর্ম ফ্যাক্টরের সাথে সামঞ্জস্যের জন্য এটি থাকা ভালো।

আরও তথ্য এবং সর্বোত্তম পদ্ধতির জন্য, পিসিতে গুগল প্লে গেমসের জন্য গ্রাফিক্স কনফিগার করুন দেখুন।

বড় পর্দা

বড় স্ক্রিনের ট্যাবলেট, ফোল্ডেবল, গুগলবুক, ক্রোমওএস এবং কানেক্টেড ডিসপ্লেতে ফুল স্ক্রিনে আপনার গেমের দেখার জায়গা সর্বাধিক করতে, decorView , সিস্টেম UI ভিজিবিলিটি-তে ফ্ল্যাগ সেট করে অথবা WindowInsetsCompat API-এর মাধ্যমে ফুল-স্ক্রিন ইমারসিভ মোড সাপোর্ট করুন এবং সিস্টেম বারগুলো লুকান। এছাড়াও, আপনাকে রোটেশন এবং রিসাইজিং কনফিগারেশন ইভেন্টগুলো সুষ্ঠুভাবে পরিচালনা করতে হবে অথবা সেগুলোকে ঘটতে বাধা দিতে হবে।

মনে রাখবেন যে বড় স্ক্রিনের অ্যান্ড্রয়েড ডিভাইসগুলিতে, আপনার গেম এমন কনফিগারেশনে চলতে পারে যা আপনি হয়তো আগে থেকে সমর্থন করেন না। যদি আপনার গেম সমস্ত উইন্ডো সাইজ এবং ওরিয়েন্টেশন কনফিগারেশন সমর্থন না করে, তাহলে প্ল্যাটফর্মটি কম্প্যাটিবিলিটি মোডে আপনার গেমটিকে লেটারবক্স করে এবং প্রয়োজনে, অসমর্থিত কনফিগারেশনে পরিবর্তন করার আগে প্লেয়ারকে জিজ্ঞাসা করে।

চিত্র ১. কনফিগারেশন সামঞ্জস্যতা ডায়ালগ।

কিছু ডিভাইসে, যখন কোনো প্লেয়ার একটি অসমর্থিত কনফিগারেশনে যান, তখন তাকে গেমটি রিলোড করার এবং নতুন উইন্ডো লেআউটের সাথে সবচেয়ে ভালোভাবে মানিয়ে নেওয়ার জন্য অ্যাক্টিভিটিটি পুনরায় তৈরি করার একটি বিকল্প দেখানো হতে পারে, যা খেলার অভিজ্ঞতাকে ব্যাহত করে। আপনার গেমটি বিভিন্ন মাল্টি-উইন্ডো মোড কনফিগারেশনে (২/৩, ১/২, ১/৩ উইন্ডো সাইজ) পরীক্ষা করুন এবং যাচাই করুন যে কোনো গেমপ্লে বা UI এলিমেন্ট কেটে যাচ্ছে না বা অ্যাক্সেসযোগ্য হচ্ছে না। এছাড়াও, ফোল্ডেবল ডিভাইসে ভেতরের এবং বাইরের স্ক্রিনের মধ্যে যাতায়াতের সময় ফোল্ডেবল কন্টিনিউইটির প্রতি আপনার গেম কীভাবে সাড়া দেয় তা পরীক্ষা করুন। যদি কোনো সমস্যা দেখতে পান, তবে এই কনফিগারেশন ইভেন্টগুলো স্পষ্টভাবে হ্যান্ডেল করুন এবং বড় স্ক্রিনে আকার পরিবর্তনের জন্য উন্নত সাপোর্ট যোগ করুন।

উন্নত বড় স্ক্রিনের আকার পরিবর্তনযোগ্যতা

চিত্র ২. ডেস্কটপ এবং টেবিলের উপর রাখা ফোল্ডেবল ডিভাইসের ভিন্ন ভিন্ন ইউজার ইন্টারফেস।

কম্প্যাটিবিলিটি মোড থেকে বের হতে এবং অ্যাক্টিভিটি পুনরায় তৈরি হওয়া এড়াতে, নিম্নলিখিতগুলি করুন:

  1. আপনার প্রধান অ্যাক্টিভিটিকে রিসাইজযোগ্য হিসেবে ঘোষণা করুন:

    <android:resizeableActivity="true" />
    
  2. বড় স্ক্রিনের সমস্ত কনফিগারেশন ইভেন্ট গ্রহণ করার জন্য, আপনার গেম ম্যানিফেস্টের <activity> এলিমেন্টের android:configChanges অ্যাট্রিবিউটে 'orientation', 'screenSize', 'smallestScreenSize', 'screenLayout', এবং 'density'-এর জন্য সুস্পষ্ট সমর্থন ঘোষণা করুন।

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. onConfigurationChanged() ওভাররাইড করুন এবং বর্তমান ওরিয়েন্টেশন, উইন্ডোর আকার, প্রস্থ এবং উচ্চতা সহ কনফিগারেশন ইভেন্টটি হ্যান্ডেল করুন:

    কোটলিন

    override fun onConfigurationChanged(newConfig: Configuration) {
       super.onConfigurationChanged(newConfig)
       val density: Float = resources.displayMetrics.density
       val newScreenWidthPixels =
    (newConfig.screenWidthDp * density).toInt()
       val newScreenHeightPixels =
    (newConfig.screenHeightDp * density).toInt()
    
       // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE
       val newScreenOrientation: Int = newConfig.orientation
    
       // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270
       val newScreenRotation: Int =
    windowManager.defaultDisplay.rotation
    }

    জাভা

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
       super.onConfigurationChanged(newConfig);
       float density = getResources().getDisplayMetrics().density;
       int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density);
       int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density);
    
       // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE
       int newScreenOrientation = newConfig.orientation;
    
       // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270
       int newScreenRotation = getWindowManager().getDefaultDisplay()
               .getRotation();
    }

বর্তমান ডিভাইস রোটেশন পরীক্ষা করার জন্য আপনি WindowManager কোয়েরি করতে পারেন। এই মেটাডেটা ব্যবহার করে, নতুন উইন্ডোর ডাইমেনশন পরীক্ষা করুন এবং সম্পূর্ণ উইন্ডো সাইজে রেন্ডার করুন। অ্যাস্পেক্ট রেশিওর পার্থক্যের কারণে এটি সব ক্ষেত্রে কাজ নাও করতে পারে, তাই বিকল্প হিসেবে, আপনার গেমের UI-কে নতুন উইন্ডো সাইজে অ্যাঙ্কর করুন এবং আপনার মূল গেমপ্লে কন্টেন্টকে লেটারবক্স করুন। যদি প্রযুক্তিগত বা ডিজাইনগত সীমাবদ্ধতার কারণে কোনো পদ্ধতিই কাজ না করে, তবে অ্যাস্পেক্ট রেশিও বজায় রাখতে আপনার নিজস্ব ইন-ইঞ্জিন লেটারবক্সিং করুন, এবং resizeableActivity = false ডিক্লেয়ার করে ও কনফিগারেশন মোড এড়িয়ে সম্ভাব্য সেরা ডাইমেনশনে স্কেল করুন।

আপনি যে পদ্ধতিই অবলম্বন করুন না কেন, আপনার গেমটি বিভিন্ন কনফিগারেশনে (ফোল্ড ও আনফোল্ড, বিভিন্ন রোটেশন পরিবর্তন, স্প্লিট-স্ক্রিন মোড) পরীক্ষা করুন এবং নিশ্চিত করুন যে গেমের ভেতরের কোনো UI এলিমেন্ট কেটে যাচ্ছে বা একটির ওপর আরেকটি উঠে যাচ্ছে না, টাচ-টার্গেট অ্যাক্সেসিবিলিটিতে কোনো সমস্যা নেই, অথবা অ্যাস্পেক্ট রেশিওর কোনো সমস্যার কারণে গেমটি প্রসারিত, সংকুচিত বা অন্য কোনোভাবে বিকৃত হয়ে যাচ্ছে না।

এছাড়াও, বড় স্ক্রিনের মানে সাধারণত বড় পিক্সেল, কারণ অনেক বড় একটি এলাকার জন্য একই সংখ্যক পিক্সেল থাকে। এর ফলে ছোট আকারের রেন্ডার বাফার বা কম রেজোলিউশনের অ্যাসেটের ক্ষেত্রে পিক্সেলেশন হতে পারে। বড় স্ক্রিনের ডিভাইসে আপনার সর্বোচ্চ মানের অ্যাসেট ব্যবহার করুন এবং কোনো সমস্যা হচ্ছে কিনা তা নিশ্চিত করতে আপনার গেমের পারফরম্যান্স প্রোফাইল করুন । যদি আপনার গেম একাধিক কোয়ালিটি লেভেল সমর্থন করে, তবে নিশ্চিত করুন যে এটি বড় স্ক্রিনের ডিভাইসগুলোর কথা মাথায় রাখে।

মাল্টি-উইন্ডো মোড

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

যখন প্লেয়ার কোনো অ্যাপ বা গেমকে মাল্টি-উইন্ডো মোডে রাখে, তখন সিস্টেম 'অ্যাডভান্সড লার্জ স্ক্রিন রিসাইজেবিলিটি' বিভাগে উল্লেখিত কনফিগারেশন পরিবর্তনের কার্যকলাপ সম্পর্কে অবহিত করে। প্লেয়ার যখন গেমটির আকার পরিবর্তন করে বা গেমটিকে আবার ফুল-স্ক্রিন মোডে ফিরিয়ে আনে, তখনও একটি কনফিগারেশন পরিবর্তন ঘটে।

অ্যাপ্লিকেশনটি মাল্টি-উইন্ডো মোডে গেলে যে ফোকাস ফিরে পাবে, তার কোনো নিশ্চয়তা নেই। তাই, আপনি যদি আপনার গেমটি পজ করার জন্য অ্যাপের কোনো স্টেট ইভেন্ট ব্যবহার করেন, তবে গেমটি পুনরায় চালু করার জন্য অ্যাকোয়ার ফোকাস ইভেন্টের ( onWindowFocusChanged() যেখানে ফোকাস ভ্যালু true) উপর নির্ভর করবেন না। এর পরিবর্তে, onConfigurationChanged() বা onResume() এর মতো অন্যান্য ইভেন্ট হ্যান্ডলার বা স্টেট চেঞ্জ হ্যান্ডলার ব্যবহার করুন। মনে রাখবেন, বর্তমান অ্যাক্টিভিটিটি মাল্টি-উইন্ডো মোডে চলছে কিনা তা শনাক্ত করতে আপনি সর্বদা isInMultiWindowMode() মেথডটি ব্যবহার করতে পারেন।

গুগলবুক, ক্রোমওএস এবং বড় স্ক্রিনের ট্যাবলেট ও ​​ফোল্ডেবল ডিভাইসে ডেস্কটপ উইন্ডোইংয়ের ক্ষেত্রে, উইন্ডোর প্রাথমিক মাপ একটি গুরুত্বপূর্ণ বিবেচ্য বিষয় হয়ে ওঠে। একটি গেমকে ফুল স্ক্রিন হওয়ার প্রয়োজন নেই, এবং সেই ক্ষেত্রে উইন্ডোর আকার কেমন হবে তা আপনাকে নির্ধারণ করে দিতে হবে। এই কাজটি করার জন্য দুটি প্রস্তাবিত উপায় রয়েছে।

প্রথম পদ্ধতিটি আপনার অ্যান্ড্রয়েড ম্যানিফেস্টের <layout> ট্যাগে নির্দিষ্ট অ্যাট্রিবিউট ব্যবহার করে কাজ করে। defaultHeight এবং defaultWidth অ্যাট্রিবিউটগুলো প্রাথমিক মাপ নিয়ন্ত্রণ করে। minHeight এবং minWidth অ্যাট্রিবিউটগুলোর দিকেও খেয়াল রাখবেন, যাতে আপনার প্লেয়াররা গেম উইন্ডোকে এমন মাপে পরিবর্তন করতে না পারে যা আপনি সমর্থন করেন না। সবশেষে, gravity অ্যাট্রিবিউট রয়েছে, যা নির্ধারণ করে যে উইন্ডোটি চালু করার পর স্ক্রিনের কোথায় প্রদর্শিত হবে। এই অ্যাট্রিবিউটগুলো ব্যবহার করে তৈরি একটি লেআউট ট্যাগের উদাহরণ নিচে দেওয়া হলো:

<layout android:defaultHeight="500dp"
        android:defaultWidth="600dp"
        android:gravity="top|end"
        android:minHeight="450dp"
        android:minWidth="300dp" />

উইন্ডোর আকার নির্ধারণের দ্বিতীয় উপায়টি ডাইনামিক লঞ্চ বাউন্ডস ব্যবহারের মাধ্যমে কাজ করে। setLaunchBounds(Rect)⁠⁠ ব্যবহার করে আপনি উইন্ডোর শুরুর মাত্রা নির্ধারণ করতে পারেন। যদি একটি খালি আয়তক্ষেত্র নির্দিষ্ট করা হয়, তাহলে অ্যাক্টিভিটিটি ম্যাক্সিমাইজড অবস্থায় চালু হয়।

এছাড়াও, যদি আপনি ইউনিটি বা আনরিয়েল গেম ইঞ্জিন ব্যবহার করেন, তবে নিশ্চিত করুন যে আপনি একটি সাম্প্রতিক সংস্করণ (ইউনিটি ২০১৯.৪.৪০ এবং আনরিয়েল ৫.৩ বা নতুন) ব্যবহার করছেন, যা মাল্টি-উইন্ডো মোডের জন্য ভালো সাপোর্ট প্রদান করে।

ভাঁজযোগ্য ভঙ্গি সমর্থন

খেলোয়াড়ের নিমগ্নতা ও সম্পৃক্ততা বাড়াতে, টেবিলটপের মতো ভাঁজযোগ্য ভঙ্গি সমর্থন করার জন্য Jetpack WindowManager লেআউট লাইব্রেরি ব্যবহার করুন:

চিত্র ৩। টেবিলের উপর রাখা গেম, যেখানে ডিসপ্লের উল্লম্ব অংশে মূল দৃশ্য এবং অনুভূমিক অংশে কন্ট্রোলগুলো রয়েছে।

কোটলিন

fun isTableTopPosture(foldFeature : FoldingFeature?) : Boolean {
    contract { returns(true) implies (foldFeature != null) }
    return foldFeature?.state == FoldingFeature.State.HALF_OPENED &&
            foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
}

জাভা

boolean isTableTopPosture(FoldingFeature foldFeature) {
    return (foldFeature != null) &&
           (foldFeature.getState() == FoldingFeature.State.HALF_OPENED) &&
           (foldFeature.getOrientation() == FoldingFeature.Orientation.HORIZONTAL);
}