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

ফোন থেকে বিভিন্ন বড় স্ক্রীন ফর্ম ফ্যাক্টরগুলিতে প্রসারিত হওয়া আপনার গেম কীভাবে উইন্ডো ম্যানেজমেন্ট পরিচালনা করে তার জন্য বিবেচনার পরিচয় দেয়। PC-এ ChromeOS এবং Google Play Games-এ , আপনার গেম একটি প্রধান ডেস্কটপ ইন্টারফেসের উপর একটি উইন্ডো মোডে চলতে পারে। স্ক্রীন প্রস্থ > 600dp সহ Android 12L (API লেভেল 32) বা উচ্চতর চলমান নতুন অ্যান্ড্রয়েড ট্যাবলেট এবং ফোল্ডেবলগুলিতে , আপনার গেমটি অন্যান্য অ্যাপ্লিকেশনগুলির সাথে স্প্লিট-স্ক্রিন মোডে পাশাপাশি চলতে পারে, আকার পরিবর্তন করা যেতে পারে এবং এমনকি ভিতরের এবং বাইরের মধ্যে সরানো যেতে পারে ভাঁজযোগ্য ডিভাইসে প্রদর্শনের ফলে উইন্ডোর আকারের জন্য কনফিগারেশন পরিবর্তন হয় এবং কিছু ডিভাইসে অভিযোজন।

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

মৌলিক বড় পর্দা কনফিগারেশন

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

<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">

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

পিসিতে Google Play গেমগুলির জন্য, প্ল্যাটফর্মটি নির্দিষ্ট আকৃতির অনুপাতকে সম্মান করার সময় উইন্ডোর পরিবর্তনযোগ্যতা পরিচালনা করে। উইন্ডোর আকার স্বয়ংক্রিয়ভাবে সর্বোত্তম মাত্রায় লক করা হয়। আপনার প্রাথমিক অভিযোজন যদি ল্যান্ডস্কেপ হয় তাহলে আপনাকে কমপক্ষে 16:9 আকৃতির অনুপাত সমর্থন করতে হবে এবং যদি আপনার গেমটি পোর্ট্রেট মোড হয় 9:16 আকৃতির অনুপাত। সেরা অভিজ্ঞতার জন্য, ল্যান্ডস্কেপ গেমের জন্য স্পষ্টভাবে 21:9, 16:10 এবং 3:2 আকৃতির অনুপাত সমর্থন করুন। উইন্ডো রিসাইজযোগ্যতা এখানে প্রয়োজন হয় না কিন্তু অন্যান্য ফর্ম ফ্যাক্টর সামঞ্জস্যের জন্য এখনও ভাল।

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

ChromeOS এবং Android বড় স্ক্রীন

ChromeOS এবং বড় স্ক্রীনের Android ডিভাইসে পূর্ণ স্ক্রীনে আপনার গেমের জন্য দৃশ্যমান ক্ষেত্রটি সর্বাধিক করতে, পূর্ণ-স্ক্রীন ইমারসিভ মোড সমর্থন করুন এবং decorView , সিস্টেম UI দৃশ্যমানতা বা WindowInsetsCompat API-এর মাধ্যমে পতাকা সেট করে সিস্টেম বারগুলিকে লুকান৷ এছাড়াও আপনি ঘূর্ণন এবং রিসাইজ কনফিগারেশন ইভেন্টগুলিকে সুন্দরভাবে পরিচালনা করতে বা ChromeOS ডিভাইসে সেগুলিকে ঘটতে বাধা দিতে চাইবেন৷

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

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

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

উন্নত বড় পর্দা resizability

চিত্র 2. ডেস্কটপে বিভিন্ন UI এবং ট্যাবলেটপ ভঙ্গিতে ভাঁজ করা যায়।

সামঞ্জস্যপূর্ণ মোড থেকে বেরিয়ে আসতে এবং কার্যকলাপ বিনোদন এড়াতে, নিম্নলিখিতগুলি করুন:

  1. আপনার প্রধান ক্রিয়াকলাপটিকে আকার পরিবর্তনযোগ্য হিসাবে ঘোষণা করুন:

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

    <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 উপাদানগুলির মধ্যে কোনও কাট-অফ বা ওভারল্যাপিং নেই, স্পর্শ-লক্ষ্য অ্যাক্সেসযোগ্যতার সমস্যা, বা আকৃতির অনুপাতের সমস্যা যার ফলে গেমটি প্রসারিত, স্কোয়াশ বা অন্যথায় বিকৃত হয়ে যায়।

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

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

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

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

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

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

প্রথম বিকল্পটি আপনার অ্যান্ড্রয়েড ম্যানিফেস্টে <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)⁠⁠ ব্যবহার করে, আপনি প্রারম্ভিক উইন্ডোর মাত্রা নির্ধারণ করতে পারেন। যদি একটি খালি আয়তক্ষেত্র নির্দিষ্ট করা হয়, কার্যকলাপটি একটি সর্বাধিক অবস্থায় শুরু হয়।

অতিরিক্তভাবে, আপনি যদি ইউনিটি বা অবাস্তব গেম ইঞ্জিন ব্যবহার করেন তবে নিশ্চিত করুন যে আপনি একটি সাম্প্রতিক সংস্করণ (ইউনিটি 2019.4.40 এবং অবাস্তব 5.3 বা নতুন) ব্যবহার করছেন যা মাল্টি-উইন্ডো মোডের জন্য ভাল সমর্থন প্রদান করে।

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

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

চিত্র 3. ডিসপ্লের উল্লম্ব অংশে প্রধান দৃশ্য সহ ট্যাবলেটপ ভঙ্গিতে খেলা, অনুভূমিক অংশে নিয়ন্ত্রণ।

কোটলিন

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