দুটি বস্তু যদি ইন্টারঅ্যাক্ট করে তবে ইন্টারঅ্যাকশন কোডটি কী ধারণ করে?


28

বুলেট এবং শত্রু, বা প্লেয়ার এবং মেঝে সম্পর্কে চিন্তা করুন। যদি এই অবজেক্টগুলি ইন্টারঅ্যাক্ট করে তবে ইন্টারঅ্যাকশন কোডটি কী ধারণ করে?


2
কোন ভাবে ইন্টারঅ্যাক্ট করবেন? আপনি সংঘর্ষ সনাক্তকরণ মানে? যদি তা হয় তবে সম্ভবত আপনি সংঘর্ষ শনাক্তকরণ ক্লাস এবং একটি সংঘর্ষের রেজোলিউশন ম্যানেজার উভয়ই প্রয়োগ করবেন।
ক্যাপ্টেনরেডমফ

আংশিক হ্যাঁ, আমি উভয় সংঘর্ষে আগ্রহী এবং সংঘর্ষের পরে কী ঘটে। বুলেটটি শত্রুর কাছাকাছি থাকলে বা অন্যভাবে? এবং সংঘর্ষের পরে কী ঘটে, বুলেট অবজেক্ট কেবল শত্রু অবজেক্টকে আঘাত করতে পারে তা বলতে পারে? আপনি দেখতে পাচ্ছেন যে আমি পুরো জিনিসটি সম্পর্কে মোটামুটি বিভ্রান্ত হয়ে পড়েছি এবং এটি কোড পড়তে খুব কঠিন করে তোলে।
ThatOneGuy

উত্তর:


23

টি এল; ডিআর:

আপনার গেমের বিষয়গুলি একে অপরের সম্পর্কে জানে না বা তারা অন্য বস্তুর বিরুদ্ধে চেকও সম্পাদন করে না। আপনি একটি সংঘর্ষ সনাক্তকরণ এবং সংঘর্ষের রেজোলিউশন প্যাটার্ন তৈরি করেন যা আপনার গেমের বিষয়গুলি পরীক্ষা করে এবং আপনার গেমের পদার্থবিজ্ঞানের অনুকরণের জন্য উপযুক্ত ক্রিয়া সম্পাদন করে।

গুড স্টাফ

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

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

pseudocode:

dectectCollisions(objects)
{
    for(objectA in objects)
    {
        for(objectB in objects)
        {
            if(objectA != objectB) //ignore self
            {
                if(BoundingSpheresIntersect(objectA, objectB))
                {
                    collisionResolver.addObjects(objectA, objectB);
                }
            }
        }
    }
}

এই ধরণের লুপটি বরং অকার্যকর তবে স্থানিক পার্টিশন ব্যবহারের মাধ্যমে প্রাথমিক পর্যায়ে অবজেক্টগুলির যে সংঘর্ষের থেকে দূরে থাকার গ্যারান্টি রয়েছে তা ব্যবহারের মাধ্যমে উন্নতির জায়গা ছেড়ে যায় না।

সম্ভাব্য সংঘর্ষের জন্য দুটি বস্তু পরীক্ষা করার পরে (অর্থাত্ উভয় বস্তু সংঘর্ষের জন্য যথেষ্ট নিকটবর্তী), আরও সঠিক সংঘর্ষ সনাক্তকরণের রুটিন সম্পাদনের জন্য বস্তুগুলি পাস হয়ে যায়।

কল্পনা করুন আপনার কাছে দুটি বহুভুজ এলোমেলো আকার এবং আকার রয়েছে যা সম্ভাব্যভাবে ছেদ করার পক্ষে যথেষ্ট তবে তাদের জ্যামিতির কারণে নয়:

গুগলের মাধ্যমে চিত্র পাওয়া গেছে

সীমাবদ্ধ গোলক ব্যবহার করে, এই দুটি বস্তু একটি সম্ভাব্য সংঘর্ষের জন্য একটি মিথ্যা ইতিবাচক তৈরি করবে। এটিই যেখানে দুটি বস্তু আসলে ছেদ করে কিনা তা নির্ধারণ করতে আপনি আরও পুঙ্খানুপুঙ্খ পাস সম্পাদন করবেন।

আপনি একবার সত্যিকারের সংঘর্ষের সন্ধান পেয়ে গেলে, আপনার সংঘর্ষের সমাধানের পদক্ষেপটি আপনার গেমের পদার্থবিজ্ঞানের গ্রানুলারিটি এবং প্রয়োজনীয়তার উপর নির্ভর করে বাহিনী বা মুহুর্তগুলি প্রয়োগ করে অবজেক্টগুলি সমাধানের জন্য উপযুক্ত পদক্ষেপ গ্রহণ করবে।

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


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

12

এক উপায় অবাস্তব ইঞ্জিন 3 এটি পরিচালনা করে:

বুলেটটি একটি সংঘর্ষের বার্তা পেয়ে বলেছিল যে এটি কিছু আঘাত করেছে, যুক্তি দিয়ে এটি কী আঘাত করেছে তা জানিয়েছে। এটি তখন অবজেক্টহিট.টেকড্যামেজ (স্ব) কল করতে পারে। তারপরে লক্ষ্যটি সেই জিনিসটিকে আঘাতকারী জিনিসটির পয়েন্টার সহ টেকড্যামেজ বার্তাটি পায় এবং যথাযথ পদক্ষেপ নেয়।

আমি ব্যক্তিগতভাবে এই পদ্ধতির পছন্দ করি কারণ এর অর্থ বুলেটটি বিশেষ পদক্ষেপ নিতে পারে (যেমন ধরণের জিনিস আঘাতের ধরণের উপর নির্ভর করে কিছু ধরণের বিস্ফোরণ প্রভাব তৈরি করে) এবং লক্ষ্যটি বুলেটের ধরণের উপর নির্ভর করে বিশেষ পদক্ষেপ নিতে পারে।

এটিও সম্ভব যে বুলেটটি লক্ষ্য করে কী করে এবং এটিতে হিট.ফ্রীজ (স্ব) এর মতো ফাংশন কল করতে পারে knows তারপরে লক্ষ্যটি জানে যে এটি এমন কিছুর দ্বারা আঘাত পেয়েছিল যা এটিকে হিমশীতল করে তোলে এবং কী ধরণের বস্তু ছিল।

সম্পাদনা: এই উত্তরটি কীভাবে এটি কাজ করতে পারে তার একটি সাধারণ চিত্র হিসাবে বোঝানো হয়েছে, যেহেতু আপনি সম্ভবত ইউই 3 এর সাথে কাজ করছেন না। :)


10

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

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

যেহেতু একই ইঞ্জিনটি সিস্টেমশোক 2 এ ব্যবহৃত হয় এটি সমস্ত ক্ষতির ধরণের বিভিন্ন পদ্ধতি হ'ল এইভাবে, বিভিন্ন বুলেটের বিভিন্ন রকম সেটামেন্ট সেট থাকে এবং বিভিন্ন দানবগুলি তারপরে বিভিন্ন স্টিম প্রকারের জন্য রিসেপ্ট্রন থাকে এবং 1 *, 2 *, 1 / এর সমান ক্ষতি করে do 2 গোলাবারুদ টাইপটি "সুপার কার্যকর" কিনা তার উপর নির্ভর করে তীব্রতা।

এটি একটি খুব নমনীয় সিস্টেমের মতো বলে মনে হয়েছিল যেহেতু আপনি স্তরের সম্পাদকের অবজেক্টগুলিতে উত্স এবং রিসেপ্টরন যুক্ত করতে পারেন (আগুনের ধাক্কায় খোলে এমন এক দরজা তৈরি করতে, বলুন।) আপনি যখন কোনও রিসেপ্ট্রনকে "স্ক্রিপ্ট প্রেরণ" করতেও বলতে পারেন বার্তা "যদি বস্তুর সাথে বিশেষ স্ক্রিপ্ট যুক্ত থাকে।

আপনি যা করতে চান না তা হ'ল কোনও সম্ভাব্য অবজেক্টের সাথে সংঘর্ষের সম্ভাব্য সমস্ত বস্তুর একটি এনএক্সএন ইন্টারঅ্যাকশন ম্যাট্রিক্সকে হার্ডকোড করতে হবে! মানকযুক্ত বার্তাগুলির মাধ্যমে ইন্টারঅ্যাকশনকে সাধারণীকরণের মাধ্যমে আপনি প্রক্রিয়াটি সহজ করেন।


স্ক্রিপ্টিং দৃষ্টিকোণ থেকে, এই পদ্ধতিকে সবচেয়ে নমনীয় এবং সবচেয়ে ভাবপূর্ণ বলে মনে হয়। খুব ঠান্ডা.
drhayes

-2

একটি সমাধান হ'ল বুলেট এবং প্লেয়ারগুলির পাত্রে পৃথক শ্রেণিতে রাখা এবং তারপরে মূল () ফাংশন থাকে যা ফ্রেম লুপটিকে মিথস্ক্রিয়াটির জন্য দায়ী রাখে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.