সম্পূর্ণ চলাচলে একে অপরকে অনুসরণ করার জন্য প্রযুক্তি?


14

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

তাই ভালো:

এখানে চিত্র বর্ণনা লিখুন

সম্পাদনা:
আমি যেটি অর্জন করতে চাই তা হ'ল সামনের শীর্ষস্থানীয় অবজেক্টটি যে পথে নিচ্ছে সেগুলি নীচের সমস্ত অবজেক্ট "হাঁটাচলা" করে। অন্যান্য সমস্ত অবজেক্ট কেবল নেতৃস্থানীয় বস্তুর গতিতে সরে যায় (এটি নিম্নলিখিত সমস্ত বস্তুতে বেগ ভেক্টরটি পাস করার মাধ্যমে হবে)। তবে আমি একে অপরের থেকেও দূরত্ব বজায় রেখে কীভাবে সমস্ত বস্তুকে পাথের দিকে সরানো / বিরতি দিতে পারি।

উত্তর:


11

আপনার পাথকে বর্ণনা করে এমন উপায়-পয়েন্টগুলি সংরক্ষণ করার জন্য "পাথ" নামে একটি তালিকা এবং চলন্ত বস্তু এবং পথ সঞ্চয় করার জন্য "স্নেক" নামে একটি দ্বিগুণ-সংযুক্ত তালিকা ব্যবহার করুন

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

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

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

class Position {
    property x;
    property y;
}
class WayPoint extends ListNode {
    property position;
}
class Path extends List { 
    property WayPoints = array();

    // Find out the x, y coordinates given the distance traveled on the path
    function getPositionFromDistanceFromEnd(distance) {
        currentWayPoint = this->first();
        while(distance > 0) {
            distanceBetweenWayPoints = this->getDistance(currentWayPoint, currentWayPoint->next());
            if(distanceBetweenWayPoints > distance) {
                position = ... // travel remaining distance between currentWayPoint and currentWayPoint->next();
                return position;
            } else {
                distance -= distanceBetweenWayPoints;
                currentWayPoint = currentWayPoint->next();
            }
        }
    }
    function addWayPoint(position) {
        // Vector describing the current and new direction of movement
        currentDirection = this->first() - this->second();
        newDirection = position - this->first();
        // If the direction has not changed, there is no need to add a new WayPoint
        if( this->sameDirection(currentDirection, newDirection) {
            this->first->setPosition(position);
        } else {
            this->add(position);
        }
    }
}
class Snake extends DoublyLinkedList {
    property Path;
    property MovingObjects = array();
}
abstract class MovingObject extends DoublyLinkedListNode {
    property Snake; // shared among all moving objects of the same snake
    property position;
    const securityDistance = 10;
    abstract function move() { }
}
class MovingObjectLeader extends MovingObject {
    property direction;
    function move() {
        this->position += this->direction * this->Snake->speed;
        this->Snake->Path->addWayPoint(this->position);
        if(this->hasFollower()) {
            this->follower->move();
        }
    }
}
class MovingObjectFollower extends MovingObject {
    property distanceFromEnd;
    function move() {
        this->distanceFromEnd += this->Snake->speed;

        // If too close to leader: stop in order to respect security distance
        if(this->distanceFromEnd > this->leader()->distanceFromEnd - this->securityDistance) {
            this->distanceFromEnd = this->leader()->distanceFromEnd - this->securityDistance;
        }

        this->position = this->Snake->getPositionFromDistanceFromEnd(this->distanceFromEnd);

        if(this->hasFollower()) {
            this->follower->move();
        }
    }
}

পাথ-> ওয়ে পয়েন্টগুলি খেলাটি আরও দীর্ঘতর হয়। যদি আপনার সাপটি বেশ কিছু সময়ের জন্য বিদ্যমান থাকে তবে আপনাকে যখন স্নপের শেষ উপাদানটি দ্বিতীয় থেকে শেষের পথের পয়েন্টটি পেরিয়ে গেছে তখন আপনাকে শেষের ওয়ে পয়েন্টটি মুছতে হবে। সেই অনুসারে সাপের সমস্ত মুভিংঅবজেক্টগুলিতে দূরত্বফ্রেন্ডএন্ডও হ্রাস করতে ভুলবেন না।


আসুন বলি যে আমি আমার শীর্ষস্থানীয় বস্তুটি আমার মাউস দিয়ে টেনে আনতে চাই (যা আমি চাই তা নয়, তবে বলি যে আমি করি)। কিভাবে আপনার উদাহরণ দিয়ে কাজ করবে?
সিডার

অবজেক্টের তালিকা প্রথমে কোনও নির্দিষ্ট দিকটিকে (প্রদত্ত গতির সাথে) তার বর্তমান অবস্থান থেকে প্রথম উপাদানটিকে সরানোর মাধ্যমে এবং তারপরে অন্যান্য সমস্ত উপাদানকে তাদের বর্তমান অবস্থান থেকে তাদের বর্তমান অবস্থান এবং নির্দিষ্ট ক্ষেত্রের দ্বারা নির্দিষ্ট দিকটিতে সরিয়ে দিয়ে চলতে পারে $ this-> previousElement-> getPosition ()। আপনি যদি আপনার প্রথম উপাদানটি কোথাও টেনে আনেন তবে আপনাকে কেবল তার সেটপজিশন () পদ্ধতিতে কল করতে হবে। যখন তালিকাটি রেন্ডার করা হবে, অন্যান্য বস্তু তাদের পূর্বসূরিদের অনুসরণ করার জন্য তাদের পথ পরিবর্তন করবে।
বার্ডব্রোট

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

হ্যাঁ, এটি অবশ্যই এই বিশেষ প্রয়োগের সাথে ঘটবে। আপনি নিজের ছবি যুক্ত করার আগে আমি উত্তর পোস্ট করেছি, সুতরাং আবার চেষ্টা করুন ...
বার্ডব্রট

ঠিক আছে. এই সম্পর্কে কি?
বার্নডব্রট

6

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

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

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

এখন, শৃঙ্খলে থাকা নেতা পথে আইটেম যুক্ত করবেন । প্রতিবার এটি সরানো হলে তালিকার শীর্ষে কিছু যুক্ত হবে। শৃঙ্খলে থাকা প্রতিটি বস্তু তালিকার কোথায় রয়েছে তা মনে রাখে। এটি সরানোর ক্ষেত্রে যখন এটি তালিকার পরবর্তী আইটেমটিতে সরানো হয় (প্রয়োজনে যথাযথভাবে বিভক্ত)। শৃঙ্খলে থাকা শেষ আইটেমটি তালিকার কোনও আইটেম পেরিয়ে যাওয়ার পরে, সেই আইটেমটি ফেলে দেওয়া যেতে পারে (এটি লেজে থাকবে)।

রূপকভাবে নেতা তার অনুসারীদের জন্য একটি রুটিচূর্ণ পথ ছেড়ে যান। তালিকার শেষ অনুগামী রুটি খেয়ে ফেলে।

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


হ্যাঁ আমি এই জিনিসটি বুঝতে পেরেছি। এটি বাস্তবায়ন যা সাধারণত আমার মনকে অনুপ্রাণিত করে। যদিও উত্তরের জন্য ধন্যবাদ। অনুমোদিত বার্ডব্রটস উত্তর দিয়েছে তবে আপনার আপডিকেটেড করেছে।
সিডার

-3

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


আমি জানি যে এ * কী, আমি যা খুঁজছি তা নয় এবং এমন কোনও কিছুর চেয়ে অনেক বেশি ভারী বোঝা যা আরও সহজ মনে হয়।
সিডার

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

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

আমি বলেছিলাম একে অপরকে অনুসরণ করুন = পি কোনও বিন্দুতে যান না।
সিডার

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