আমি কীভাবে একত্রিত হতে পারে প্রচুর বিভিন্ন আক্রমণাত্মক ধরণের ডিজাইন করতে পারি?


17

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

চামচ বেন্ডার আইজাককে হোমিং অশ্রু অঙ্কুরিত করার ক্ষমতা দেয়।

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

আইজাককে ট্রিপল শট দেয়

এই জাতীয় জিনিস ডিজাইন করার জন্য একটি ভাল স্থাপত্য কি? এখানে একটি নিষ্ঠুর শক্তি সমাধান:

if not spoon bender and not the inner eye then ...
if spoon bender and not the inner eye then ...
if not spoon bender and the inner eye then ...
if spoon bender and the inner eye then ...

তবে তা হাত থেকে খুব দ্রুত বেরিয়ে আসবে। এর মতো একটি সিস্টেম ডিজাইনের আরও ভাল উপায় কী?


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

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

উত্তর:


16

আপনার পুরোপুরি হ্যান্ড-কোড সংমিশ্রণের দরকার নেই। পরিবর্তে প্রতিটি আইটেম আপনাকে দেয় এমন বৈশিষ্ট্যগুলিতে ফোকাস করতে পারে। উদাহরণস্বরূপ, আইটেম এ সেট করে Projectile=Fireball,Targetting=Homingআইটেম বি সেট FireMode=ArcShot,Count=3ArcShotযুক্তিবিজ্ঞান পাঠানোর জন্য দায়ী Countসংখ্যা Projectileএকটি চাপ আইটেম।

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

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

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


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

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

আমার কাছে মনে হচ্ছে কৌতুকপূর্ণ অংশটি বৈশিষ্ট্যের বিভাগগুলি সনাক্ত করছে। উদাহরণস্বরূপ: লক্ষ্যমাত্রা এক, ফায়ারমড অন্যটি, গণনা তৃতীয় হতে পারে ... বা এটি নাও হতে পারে। সম্ভবত 3 টি প্রজেক্টেল একটি ফায়ারবল এবং 5 টি গ্রেনেড হতে পারে যদিও এটি একটি অস্ত্র though
ড্যানিয়েল ক্যাপলান

@ টিটিওয়াইটি: একেবারে। আপনি বিশেষ সংমিশ্রণ বা যুক্তি যুক্ত করার জন্য অবশ্যই সিস্টেমটিকে আরও বাড়িয়ে দিতে পারেন, তবে এটি নিয়মের পরিবর্তে ব্যতিক্রম হওয়া উচিত। কর্ণারের ক্ষেত্রে নয়, সাধারণ ক্ষেত্রে অনুকূলিত করুন।
শান মিডলডিচ

প্রক্রিয়াজাত প্রোগ্রামিং সম্পর্কে আপনি কেন ভুল করছেন সে সম্পর্কে একটি দুর্দান্ত ভিডিও এখানে রয়েছে youtu.be/QM1iUe6 আইওফএম , এছাড়াও ডেটা চালিত উপায়ে আপনি মানচিত্রের বর্ণনা দেন যদি / অন্য কোনও পৃথক ডেটা সেটগুলিতে অবরুদ্ধ করে , আপনাকে কতগুলি বিশেষ কেস দৃশ্যের প্রয়োজন তা হ্রাস করতে মূলত কিছুই করেনি প্রোগ্রাম, আপনি যেমন তাদের সমস্ত প্রোগ্রাম করতে হবে ...
রেনেসাঁ

8

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

অপরিশোধিত সি ++ উদাহরণ:

class AttackBehaviour
{
    /* other code */
    virtual void Attack(double angle);
};

class TearAttack: public AttackBehaviour
{
    /* other code */
    void Attack(double angle);
};

class TripleAttack: public AttackBehaviour
{
    /* other code */
    AttackBehaviour* baseAttackBehaviour;
    void Attack(double angle);
};

void TripleAttack::Attack(angle)
{
    baseAttackBehaviour->Attack(angle-30);
    baseAttackBehaviour->Attack(angle);
    baseAttackBehaviour->Attack(angle+30);
}

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


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

এটি আরও কঠোর কারণ মডিফায়ারটি সর্বদা Attackঅবজেক্টের পদ্ধতিটিকে একত্রিত করে কল করে end TripleAttackশ্রেণী সম্পর্কে জানতে করা উচিত নয় TearAttackবর্গ। যদি এটি সত্য হয় তবে এটি else-ifব্লকের মতোই অনেক মাথাব্যাথা বাড়ে। এর অর্থ হল যে কোনও টিয়ার অ্যানিমেশনগুলিকে TearAttackBehaviourঅবজেক্টের অভ্যন্তরে থাকতে হবে । এই অবজেক্টটি জানেন না (এবং হওয়া উচিত নয়) এটি কোনও TripleAttackবস্তু দ্বারা সজ্জিত হয়েছে । ফলে 3 টিয়ার অ্যানিমেশন স্বাধীনভাবে এগিয়ে যাওয়া, কারণ হয় স্বাধীন।
নটিক্যালমাইল

এটি কথায় কথায় ব্যাখ্যা করতে আমার খুব কষ্ট হচ্ছে, যদি অন্য কেউ যদি এটিকে ছুরিকাঘাত করতে চায় তবে আমার অতিথি হোন।
নটিক্যালমাইল

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

1

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

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

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

Isaac has IsaacMutators:
--spoonbender which gives no stat change and: Tears are made homing
--MeatEater which give +1 health, +1 damage and: nothing
--MagicMirror which gives no stat change and: Tears are made reflecting

Tears have tearMutators:
--(depends on MeatEater) +1 damage and: nothing
--(depends on MagicMirror) no stat change and: +1 vector towards isaac
--(depnds on spoonbender) no stat change and: +1 vector towards enemytype

ইত্যাদি। প্রকারগুলি সংযোজনীয় হওয়ায় আপনি আপনার হৃদয়ের সামগ্রীতে স্ট্যাক এবং যুক্ত করতে এবং মুছে ফেলতে পারেন।


-5

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

উভয় আইটেম উপস্থিত থাকলে আপনি নতুন ধরণের সংজ্ঞা তৈরি করে এটি সম্পর্কে জানতে পারেন, তবে এটি প্রকৃতপক্ষে সংশ্লেষণকে যুক্ত করে:

if spoon bender and the inner eye then new spoon bender inner eye

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