অ্যাডভেঞ্চার গেমসে বিভিন্ন রাজ্যের কোডিং


12

আমি একটি অ্যাডভেঞ্চার গেমের পরিকল্পনা করছি, এবং গল্পের অগ্রগতির অবস্থার উপর নির্ভর করে কোনও স্তরের আচরণ বাস্তবায়নের সঠিক উপায়টি কী তা বুঝতে পারি না।

আমার একক প্লেয়ার গেমটি একটি বিশাল বিশ্ব দেখায় যেখানে খেলোয়াড়কে গেমের বিভিন্ন স্থানে একটি শহরের লোকের সাথে যোগাযোগ করতে হয়। তবে গল্পের অগ্রগতির উপর নির্ভর করে বিভিন্ন জিনিস প্লেয়ারের কাছে উপস্থাপন করা হবে, উদাহরণস্বরূপ গিল্ড লিডার শহরের বর্গক্ষেত্র থেকে শহরের বিভিন্ন স্থানে স্থান পরিবর্তন করবে; নির্দিষ্ট রুটিন শেষ করে দিনের নির্দিষ্ট সময়গুলিতে দরজাগুলি কেবল আনলক হত; নির্দিষ্ট মাইলফলক পৌঁছানোর পরেই বিভিন্ন কাট-স্ক্রিন / ট্রিগার ইভেন্ট ঘটে।

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

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

বা সহজভাবে, প্রতিটি গেমের রাজ্যের জন্য একটি অভিন্ন, তবে পৃথক স্তর তৈরি করুন। এটি জিনিসগুলি করার সবচেয়ে সহজ এবং ত্রুটি-মুক্ত উপায় অনুভব করে তবে স্তরের প্রতিটি সংস্করণ একে অপরের সাথে সত্যই অভিন্ন তা নিশ্চিত করে এটি বিশাল ম্যানুয়াল কাজের মতো অনুভব করে।

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

PS: আমার কাছে এখনও কোনও স্তরের সম্পাদক নেই - জেএমই এসডিকে জাতীয় কিছু ব্যবহার করার বা নিজের তৈরি করার কথা ভাবা।

উত্তর:


9

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

কোনও রাষ্ট্রীয় ইন্টারফেসটি দেখতে কেমন হবে তার একটি উদাহরণ (সম্পূর্ণরূপে তৈরি - কেবল এই স্কিম আপনাকে নিয়ন্ত্রণের স্তরটি কী তা বোঝানোর জন্য):

interface NPCState {
    Scene whereAmI(NPC o);
    String saySomething(NPC o);
}

এবং দুটি বাস্তবায়নকারী ক্লাস:

class Busy implements NPCState {
    Scene whereAmI(NPC o) {
        return o.getWorkScene();
    }
    String saySomething(NPC o) {
        return "Can't talk now, I'm busy!";
    }
}

class Available implements NPCState {
    Scene whereAmI(NPC o) {
        return TAVERN;
    }
    String saySomething(NPC o) {
        String[] choices = o.getRandomChat();
        return choices[RANDOM.getInt(choices.length)];
    }
}

এবং স্যুইচিং স্টেটস:

// The time of day passed from "afternoon" to "evening"
NPCState available = new Available();
for ( NPC o : list ) {
    Scene oldScene = o.state.whereAmI(o);
    o.state = available;
    Scene newScene = o.state.whereAmI(o);
    moveGameObject(o, oldScene, newScene);
    ...

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

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

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


হ্যাঁ, আপনি বর্ণিত এসোসিয়েটিভ অ্যারের সাথে আপনি এই রাজ্য নকশার ধরণটি একত্রিত করতে পারেন। আপনি এখানে বর্ণিত হিসাবে রাজ্য অবজেক্টস কোড করতে পারে, এবং তারপরে আমার পরামর্শ অনুসারে একটি মিশুক অ্যারে ব্যবহার করে বিভিন্ন রাজ্য অবজেক্টের মধ্যে চয়ন করতে পারেন।
49

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

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

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

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

2

আমি যে পছন্দগুলি বিবেচনা করব তা হ'ল হয় পৃথক বস্তুগুলি বিভিন্ন গেমস্টেটগুলিতে প্রতিক্রিয়া ব্যক্ত করা, বা বিভিন্ন গেমস্টেটগুলিতে বিভিন্ন স্তর সরবরাহ করে। এই দুজনের মধ্যে পছন্দ নির্ভর করবে যে আমি খেলায় ঠিক কী করতে চাইছি (বিভিন্ন রাজ্যগুলি কী কী? রাজ্যের মধ্যে গেমটি কীভাবে রূপান্তরিত হবে? ইত্যাদি)

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

if (state in behaviors) {
  behaviors[state]();
}

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

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

ওহ .. হ্যাঁ এটা অবশ্যই সহজ! : ডি লুয়া হা হা এর মতো কিছু এম্বেড করার দৃশ্যের সাথে তুলনা করে ..
কার্ডিন

2

মাইলফলক-পরিবর্তনগুলি দেখার জন্য একটি পর্যবেক্ষক প্যাটার্ন ব্যবহার সম্পর্কে কী? যদি কোনও পরিবর্তন ঘটে থাকে তবে কিছু শ্রেণি এটি সনাক্ত করবে এবং উদাহরণস্বরূপ এমন একটি পরিবর্তন পরিচালনা করবে যা একটি এনপিসি করতে হবে।

উল্লিখিত স্টেট ডিজাইনের প্যাটার্নের পরিবর্তে আমি কৌশল-প্যাটার্ন ব্যবহার করব।

যদি কোনও এনপিসির চরিত্র এবং তিনি যে স্থানে থাকতে পারে তার অবস্থানের সাথে ইন্টারঅ্যাক্ট করার জন্য এন উপায় থাকে তবে আপনার সর্বাধিক (এম * এন) +1 শ্রেণি নকশা করতে হবে। কৌশল-প্যাটার্ন ব্যবহার করে আপনি এন + এম + 1 ক্লাস শেষ করবেন তবে এই কৌশলগুলি অন্যান্য এনপিসিও ব্যবহার করতে পারে।

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


পর্যবেক্ষক প্যাটার্নটি আকর্ষণীয় বলে মনে হচ্ছে। আমি মনে করি এটি রাষ্ট্রীয় পর্যবেক্ষকের কাছে নিবন্ধিত করার জন্য এনপিসির কাছে সমস্ত দায়িত্ব পরিষ্কারভাবে ছেড়ে দিতে পারে। কৌশল প্যাটার্নটি অনেকটা Unক্য ইঞ্জিনের ট্রিগার এবং এআই আচরণগুলির মতো অনুভূত হয়, যা বিটিডব্লিউএন ডিফ গেমের অবজেক্টগুলিকে ভাগ করে নিতে ব্যবহার করা হয় (আমার মনে হয়)। এটি সম্ভবপর শোনাচ্ছে। আমি এই মুহূর্তে নিশ্চিত নই কী, তবে ityক্য একই পদ্ধতিটি ব্যবহার করে হাহাকে কিছুটা আশ্বাস দেয় ..
কার্ডিন

আমি এই দুটি প্যাটার্ন কয়েকবার ব্যবহার করেছি তাই আমি এই কনস সম্পর্কে আপনাকে বলতে পারছি না: - / তবে আমি মনে করি যে একক দায়িত্ব এবং প্রতিটি কৌশল পরীক্ষা করার জন্য উপলব্ধতার ক্ষেত্রে এটি চমৎকার: :) যদি আপনার অনেকগুলি বিভিন্ন ক্লাসে কৌশল ব্যবহার করে এবং আপনি এটি ব্যবহার করে এমন প্রতিটি শ্রেণীর সন্ধান করতে চান।
TOAOGG

0

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

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

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

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

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

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