অনেকগুলি স্কোয়ারের জন্য দক্ষ টাইল ভিত্তিক সংঘর্ষ সনাক্তকরণ?


9

বর্তমানে আমি একটি টাইল ভিত্তিক গেমটি নিজেরাই নিয়ে কাজ করছি (মনে করি টেরারিয়া, তবে কম কল্পনাপ্রসূত (আমি মনে করি এটি একটি শব্দ? দুঃখিত না হলে এটি))।

যাইহোক, আমার কাছে বর্তমানে সংঘর্ষ সনাক্তকরণ কাজ করছে (কোণার ক্ষেত্রে এমনকি!) যা আমার জন্য একটি বড় পদক্ষেপ ছিল। একটি স্প্রাইট একটি ব্লক দিয়ে চালানো না দেখে চরম সন্তোষজনক কিছু আছে। তবে তখন আমার কাছে বেনমার্ক করার ধারণা ছিল। খারাপ ধারণা।

1,000 স্কোয়ার, কোনও সমস্যা নেই। 10,000 টি স্কয়ার, 3 টি অক্ষরের জন্য এক ধরণের লেগ ছিল। ১০০,০০০ স্কোয়ার (সত্যই বিশাল মানচিত্র), 3 টি অক্ষরের জন্য প্লে করা যায় না।

আমার এমন সমস্যা রয়েছে যেখানে আমি প্লেয়ার, চরিত্র, আইটেম ইত্যাদির থেকে খুব দূরে থাকা ব্লকগুলিও বিবেচনা করতে চাই না, তবে আমি স্মরণে থাকা অবিচ্ছিন্নভাবে ক্রমাগত লোড করতে চাই না।

এখানে এখন পর্যন্ত আমার অ্যালগরিদম, সমালোচনা নির্দ্বিধায়।

foreach (Block in level)
{
    if (distance from block to player > a specified amount)
        ignore this block;
    else
    {
        get the intersection depth between the two bounding boxes
        if (depth of intersection != Zero-vector)
        {
            check y size vs x size
            resolve on smallest axis
        }
    }
}

যেমন আপনি লক্ষ করবেন, স্তরের আকার যখন আরও বড় হয়, এই অ্যালগরিদমের ক্রমটি এন ব্লকগুলি দ্বারা বৃদ্ধি পায়। আমি এমনকি ব্লকগুলি এমনকি প্লেয়ারের কাছাকাছি নয় বিবেচনা করতে চাই would

আমি ভাবছি হয়ত কোনও (0,0) থেকে (মানচিত্রের প্রস্থ, ম্যাপহাইট) তালিকার পরিবর্তে ডাবল-অ্যারে ব্যবহার করুন, ব্যক্তির অবস্থানের উপর নির্ভর করে একটি বিপদ-অঞ্চল গণনা করা, যেমন প্লেয়ারের অবস্থান (10, 20) এটি (0, 10) থেকে (20, 30), বা আরও কিছু দেখতে পাবেন।

যেকোন চিন্তাভাবনা এবং বিবেচনা দুর্দান্ত,


1
এবং স্ট্যাকেক্সচেঞ্জে স্বাগতম! :-) পুরো কিউ এবং খ্যাতি সিস্টেম কীভাবে কাজ করে সে সম্পর্কে যদি আপনি অসচেতন থাকেন তবে FAQ পড়তে ভুলবেন না।
ডেভিড গাউভিয়া

অবশ্যই এই টাইলগুলি 16 বাই 16 পিক্সেলের চেয়ে বেশি, 1920 এ 1080 দ্বারা 8,100 টাইল। অবশ্যই আপনি জানেন যে চলনীয় সত্তা কোথায় এবং আপনি কেবল গ্রিডে টাইলগুলি পরীক্ষা করতে পারেন যা সম্ভবত পরিসরের মধ্যে থাকতে পারে (যদি একটি 160 * 160 হয় এবং কেন্দ্রটি টাইল হয় (12,12) আপনার কেবল টাইলগুলির মধ্যে পরীক্ষা করতে হবে (6 , 6) এবং (18,18) মোট ~ 150 সম্ভাব্য টাইলগুলির জন্য) অবশ্যই মহাকর্ষের অধীনে টাইলগুলি কেবল নিচে পড়ে যায় এবং সুতরাং এর নীচে কেবল পরবর্তী টাইলগুলির জন্য আপনার প্রয়োজন।
দাম্পে এস 8 এন

আপনি কি 16x16 খুব ছোট মনে করেন? টাইলসের আকার পরিবর্তন করা আমার পক্ষে কঠিন হবে না, যেহেতু টাইলউইথ / উচ্চতার উল্লেখ করে যা কিছু স্থিতিশীল থাকে। আমি কেবল যা করতে চাই তা হ'ল পেইন্ট.এনইটি-তে তাদের প্রসারিত করা, যা দুর্দান্ত কারণ এটি আরও বিশদ যুক্ত করে।
রস

আপনার সংঘর্ষের কোডটি ভাগ করে নিতে কি আপত্তি হবে? : /
ashes999

উত্তর:


7

হ্যাঁ, আপনি সঠিকভাবে চিন্তা করছেন। আপনি টাইলসের 2D অ্যারে ব্যবহার করা উচিত কারণ এটি আপনাকে অবস্থান অনুসারে টাইলস সূচী করতে দেয়।

Block[,] level = new Block[width, height];

এবং যেহেতু প্লেয়ারটি কেবল তার চারপাশের টাইলগুলির সাথে সংঘর্ষ করতে পারে, তাই আপনার যা করতে হবে তা সংঘর্ষের চেকের সংখ্যা খুব কম। এটি অবশ্যই প্লেয়ারের আকারের উপর নির্ভর করে। Platformer নমুনা ভালো এটা আছে:

int leftTile = (int)Math.Floor((float)characterBounds.Left / tileWidth);
int rightTile = (int)Math.Ceiling(((float)characterBounds.Right / tileWidth)) - 1;
int topTile = (int)Math.Floor((float)characterBounds.Top / tileHeight);
int bottomTile = (int)Math.Ceiling(((float)characterBounds.Bottom / tileHeight)) - 1;

for (int y = topTile; y <= bottomTile; ++y)
{
    for (int x = leftTile; x <= rightTile; ++x)
    {
        // Handle collisions with the tile level[x,y] just like you were doing!
    }
}

আপনার এখনও সমস্যা থাকলে নমুনাটি পরীক্ষা করে দেখুন।


এটি খুব সুন্দর একটি অ্যালগরিদম, আমি প্ল্যাটফর্মার নমুনাটিও শুনিনি (আমার থাকা উচিত, তবে আমি অজ্ঞতার দাবি করি)। ধন্যবাদ!
রস

@ রোস আসলেই? নমুনার সাথে আপনার সমাধানটি কতটা সমান তা দেখে আপনি অবাক হবেন। :-) তালিকা অংশটি বিয়োগ করা, অন্য সব কিছুই বেশ অনেকটা অভিন্ন (বাউন্ডিং বাক্সগুলি ছেদ করুন, ছেদ করার গভীরতা পান, ক্ষুদ্রতম অক্ষকে সমাধান করুন)।
ডেভিড গাউভিয়া

1
ওহ মানুষ, আমি শুধু এটি তাকিয়ে ছিল। >। <কাশ 2 দিন আগে আমি জানতাম !! ঠিক আছে, আমি এক্সএনএ-তে নতুন তবে আমি 2 ডি গ্রাফিক্স দিয়েছি (কেবল ওপেনগিএল, খুব বেশি গেম প্রোগ্রামিং নয়)। আমি অনুমান করি কোডিংয়ের প্রথম দিকে যাওয়ার আগে আমার আরও সংস্থানগুলি পরীক্ষা করা উচিত।
রস

1

আমার ধারণা আমার উত্তরটি আপনার উত্তর হবে! ;-)

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

আপনি ইতিমধ্যে না থাকলে riemers.net এ সংঘর্ষের টিউটোরিয়ালটি পরীক্ষা করে দেখুন ।


আমি রিমারের কথা শুনেছি কিন্তু কখনই সন্ধান করতে পারি নি, ধন্যবাদ!
রস

1

বিপুল সংখ্যক সংঘর্ষের সাথে মোকাবিলা করার সময়, আপনি সাধারণত এই ধরণের সংঘর্ষগুলি পরীক্ষা করার জন্য চতুষ্কোণ বা হাশম্যাপের মতো আরও উন্নত কাঠামো গ্রহণ করতে চান ।

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

  1. আশেপাশের আশেপাশের লোকদের কাছে চেকগুলি সীমাবদ্ধ করুন
  2. চলমান কেবলমাত্র অবজেক্টগুলিতে চেকগুলি সীমাবদ্ধ করুন

এখন আপনি যদি পর্দার বাইরে টাইলসটি দেখতে না চান তবে আপনি এর মতো কিছু করতে পারেন

public bool CheckCollision(myPosition) {
    if(quadNodes.Count > 0) {
        // This is not a leaf, keep checking
        foreach(Quad node in quadNodes) {
            if(node.Position is insideViewport && nearPlayer)
                // Continue recursion
            }
        }
    }
    else {
        // This is a leaf, do checks
        foreach(Tile tile in tileList) {
            if(collision)
                return true;
        }
        return false;
    }
}

হুম, আমি থ্রিডি সংঘর্ষ শনাক্তকরণের জন্য অক্টোবরের কথা শুনেছি তবে 2D সংঘর্ষ সনাক্তকরণের জন্য কোনও উন্নত ডেটা স্ট্রাকচার ব্যবহার করা হয়নি। আপনাকে অনেক ধন্যবাদ!
রস

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

1
আপনি যদি ঠিক একটি গ্রিড ভিত্তিক গেম, এমনকি চরিত্রের আকার থেকেও ঠিক থাকেন। আমি জানি যে টেরারিয়ায় তাদের এমন দানবও রয়েছে যা গ্রিড বিন্যাসে সহজেই খাপ খায় না। আমি এই অনুমানের অধীনে চলছিলাম যে বেসিক ওয়ার্ল্ড টাইলস দিয়ে তৈরি তবে অন্যান্য জিনিস আলাদা হবে এবং অন্য একটি তৈরি না করার জন্য তারা এগুলি একই কাঠামোতে সঞ্চয় করতে পারে। আমি মনে করি তারা টাইলসের জন্য গ্রিড ব্যবহার করতে পারে তবে অন্যান্য স্বেচ্ছাসেবী বস্তুর জন্য আলাদা কাঠামো (প্রয়োজনে) ব্যবহার করতে পারে।
মাইক ক্লাক

1
এটিই আমি পরামর্শ দিতে যাচ্ছিলাম :) গ্রিডটি ভূখণ্ডের সাথে সংঘর্ষগুলি পরিচালনা করতে ব্যবহার করা উচিত, যখন একটি চতুর্ভুজ আন্তঃ-বস্তুর সংঘর্ষগুলি পরিচালনা করতে ব্যবহার করা যেতে পারে।
ডেভিড গাউভিয়া

সত্য। এখনই প্রতিটি বাউন্ডিং বাক্সে 2 ^ পাওয়ারের মাত্রা রয়েছে। সংঘর্ষ সনাক্তকরণের জন্য এটি খুঁজে পাওয়া সহজ করে তোলে। একটি গ্রিড আপাতত আমার প্রয়োজন মাপসই করা হবে।
রস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.