কীভাবে ওওপি ছাড়াই গেম তৈরি করবেন? [বন্ধ]


10

আমি বর্তমান গেম ডেভলপমেন্ট অধ্যয়ন করছি এবং গেমস তৈরির অনুশীলন করছি।

আমি আমার গেমগুলিতে প্রচুর ওওপি ব্যবহার করি। উদাহরণস্বরূপ, প্রতিটি ক্ষেপণাস্ত্র যা গুলি করা হয় তা কোনও Missileবস্তুর উদাহরণ এবং বস্তুর তালিকায় যুক্ত হয় Missile। গেমের প্রতিটি ট্যাঙ্ক একটি Tankবস্তু। প্রভৃতি

প্রোগ্রামটির পুরো নকশা এটি ভিত্তিক। উদাহরণস্বরূপ, Missileঅবজেক্টের একটি তালিকা থাকা আমার প্রতিটি ফ্রেমকে ক্ষেপণাস্ত্রগুলি সরাতে, সেগুলি আঁকতে, ইত্যাদির Tankঅনুমতি দেয় এবং প্রতিটি ট্যাঙ্কের জন্য কোনও বস্তুর উদাহরণ থাকার ফলে প্রতিটি ট্যাঙ্ক কোনও কিছুর সাথে সংঘর্ষ হয় কিনা তা পরীক্ষা করার অনুমতি দেয় etc.

একটি গেমটি (যা প্যাক-ম্যানের চেয়ে জটিল) কীভাবে অ-ও ভাষায় প্রোগ্রাম করা যায় তা আমার পক্ষে ধারণা করা কঠিন hard (অবশ্যই অ-ওও প্রোগ্রামারদের কোনও সম্মান না করে)। এটি কতক্ষণ সময় নেয় তা কেবল শর্তেই নয়, তবে বেশিরভাগ ক্ষেত্রে কীভাবে কোনও গেমটি এভাবে ডিজাইন করা যেতে পারে।

আমি অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং ব্যবহার না করে কোনও গেম ডিজাইনের কল্পনা করতে পারি না, কারণ গেম-প্রোগ্রামটি কীভাবে ডিজাইন করা যায় তার সম্পূর্ণ বোঝার বিষয়টি ওওপি-র উপর ভিত্তি করে।

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

যদি তা হয় তবে আপনি কি আমাকে একটি ধারণা দিতে পারেন, উদাহরণস্বরূপ, কীভাবে একটি ট্যাংক এবং এন সংখ্যক মিসাইলের মধ্যে সংঘর্ষ সনাক্তকরণ ওওপি ছাড়াই কার্যকর করা যেতে পারে?


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

অনেক গেমস একটি কম্পোনেন্ট-ভিত্তিক সিস্টেম ব্যবহার করে যেমন এই উত্তরটি বর্ণনা করেছে: গেমদেব.স্ট্যাকেক্সেঞ্জার
জন ম্যাকডোনাল্ড

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

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

উত্তর:


16

আমি অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং ব্যবহার না করে কোনও গেম ডিজাইনের কল্পনা করতে পারি না, কারণ গেম-প্রোগ্রামটি কীভাবে ডিজাইন করা যায় তার সম্পূর্ণ বোঝার বিষয়টি ওওপি-র উপর ভিত্তি করে।

তাহলে আপনার পক্ষে অ-ওও স্টাইলে কিছু প্রোগ্রাম লেখার চেষ্টা করা ভাল। এমনকি যদি আপনি আবিষ্কার করেন যে এটি আপনার পক্ষে বাস্তবসম্মত নয় তবে আপনি সম্ভবত সেই পথটি অনেক কিছু শিখবেন যা আপনাকে ভবিষ্যতে সহায়তা করবে।

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

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

ফাংশনাল প্রোগ্রামিংয়ে প্রতিটি ফাংশনকে অবশ্যই তার ফেরত মূল্য গণনা করা তথ্য থেকে গণনা করতে হবে; "গ্লোবাল স্টেট" থেকে কোনও পড়া নেই।

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

এই সিরিজের ব্লগ নিবন্ধগুলিতে কার্যকরী শৈলীতে গেম লেখার বিষয়ে আরও চিন্তাভাবনা রয়েছে:

http://prog21.dadgum.com/23.html

এই নিবন্ধটি আপনার "শেলটিকে একটি ট্যাঙ্ক মারে" প্রশ্নটি নির্দিষ্ট করে:

http://prog21.dadgum.com/189.html

আসলে, পুরো ব্লগটি কেবল পড়ুন। সেখানে ভাল জিনিস আছে এবং নিবন্ধগুলি সংক্ষিপ্ত।


12

যে কোনও অবজেক্ট ওরিয়েন্টেড প্রোগ্রামকে স্ট্রাকচার সহ সমস্ত ক্লাস প্রতিস্থাপন করে এবং সমস্ত সদস্য-ফাংশনকে স্ট্যান্ড-অ্যালোন ফাংশনে রূপান্তর করে একটি প্রক্রিয়াভিত্তিক প্রোগ্রামে রিফ্যাক্টর করা যেতে পারে যা thisএকটি আর্গুমেন্ট হিসাবে অবজেক্ট হিসাবে গ্রহণ করে ।

সুতরাং

 missile.setVelocity(100);

হয়ে

 setMissileVelocity(missile, 100);

বা যখন এই ফাংশনটি তুচ্ছ, আপনি ঠিক করবেন

 missile.velocity = 100;

বস্তু-ভিত্তিক প্রোগ্রামিং এবং পদ্ধতিগত প্রোগ্রামিংয়ের মধ্যে প্রধান পার্থক্য হ'ল আপনি কীভাবে আপনার ডেটা ব্যবহার করেন treat ওওপি-তে ডেটা স্মার্ট । এটি নিজেই পরিচালনা করে এবং পরিচালনা করে। পদ্ধতিগত প্রোগ্রামিংয়ে, ডেটা বোবা হয় । এটি নিজে থেকে কিছু করে না এবং বাইরে থেকে কারসাজি করা দরকার।

আপনি এমনকি কাঠামোকে খুব অবজেক্ট-ভিত্তিক বিবেচনা করলে, আপনি একাধিক অ্যারে স্ট্রাকচারের একটি অ্যারে প্রতিস্থাপন করতে পারেন, যা একটি ক্ষেপণাস্ত্রের পরিবর্তনশীল হতে পারে এমন সমস্ত কিছুর জন্য একটি one সুতরাং

struct Missile {
     int x;
     int y;
     int velocity;
}

Missile missiles[256];

হয়ে

int missileX[256];
int missileY[256];
int missileVelocities[256];

এই নকশায়, কোনও ফাংশন যা একই ক্ষেপণাস্ত্রের একাধিক বৈশিষ্ট্যযুক্ত একটি অপারেশন করে এখন কোনও কাঠামোর রেফারেন্সের পরিবর্তে অ্যারে সূচক গ্রহণ করবে। এর বাস্তবায়নটি দেখতে এরকম হবে:

function updateMissilePosition(int index) {
     missileX[index] += missileVelocity[index];
}

1
তবে missileএটি কোনও বস্তুর উদাহরণ। অ-ওওপি-তে কোনও দৃষ্টান্ত নেই, আমি কি সঠিক? যদি তা হয় তবে আপনি সেটমিসাইলভেলোসিটি (মিসাইল, 100) কীভাবে করতে পারেন?
ব্যবহারকারী 3150201

1
@ user3150201 আপনি সম্পূর্ণ সঠিক নন। বেশিরভাগ অ-ওওপি ভাষা (এবং আমি মারাত্মক গেম বিকাশের জন্য উপযুক্ত যে কোনও বিষয়ে তর্ক করব) কাঠামো সমর্থন করে। একটি কাঠামো একটি শ্রেণীর মতো ধরণের, ঠিক এটিতে পাবলিক ভেরিয়েবল ছাড়া কিছু থাকে না। তাই এটা আপনার একটি টাইপ তৈরি করতে সম্ভব হবে Missile, যা বিভিন্ন ক্ষেত্রের মতো সঙ্গে একটি কাঠামো x, y, angleএবং velocity
ফিলিপ

@ user3150201 কাঠামো ছাড়াই এটি কীভাবে করা যায় সে সম্পর্কে একটি বিভাগের সাথে উত্তর আপডেট করেছেন।
ফিলিপ

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

2
@ জাফুর আপনি জানেন যে আপনার বক্তব্যটি বিশাল ফ্লেবাইবিট, তাই না?
ফিলিপ

6

আমি এটি নিম্নলিখিত হিসাবে না:

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

...

class Entity //let's say you had 100 instances of this
{
   int a;
   char b;
   function foo() 
   {
      .../*can access 'this' herein*/
   }
}

আপনি এটি দিয়ে প্রতিস্থাপন করতে হবে

int a[100];
char b[100];
function foo(int index);

যাতে আপনি এখন ফাংশনটিতে একটি সূচক পাস করছেন যা সাধারণত হয় তা পেতে this

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

কাঠামো বা আদিমতার অ্যারে হিসাবে সত্তা তৈরির বিষয়ে আরও তথ্যের জন্য, মিক ওয়েস্টের আপনার শ্রেণিবদ্ধের উন্নতি দেখুন


0

বিদ্যমান উত্তরগুলি ছাড়াও আপনি পদ্ধতিগত ভাষায় পলিমারফিজম কীভাবে করবেন তা জানতে চাইতে পারেন।

দুটি পন্থা রয়েছে:

ধরণের সংরক্ষণ করা হচ্ছে

এক্ষেত্রে স্ট্রাক্টটিতে টাইপ শনাক্তকারীর জন্য একটি ক্ষেত্র রয়েছে, সম্ভবত একটি এনাম, switchটাইপ সুনির্দিষ্ট ক্রিয়া করার দরকার হলে একটি বিবৃতি ব্যবহার করে তা পরীক্ষা করা হয়।

অন্য উপায়টি হ'ল:

ফাংশন পয়েন্টার সংরক্ষণ করে

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

এই ক্ষেত্রে আপনি কোনও প্রকার সংরক্ষণ করবেন না, তবে নির্দিষ্ট ক্রিয়া করে এমন কোনও ফাংশনের পয়েন্টার / রেফারেন্স সংরক্ষণ করবেন store যখন টাইপ নির্দিষ্ট ক্রিয়া করা দরকার, আপনি কেবল এই ফাংশনটি কল করেন। এটি দেখতে অনেকটা সাধারণ ভার্চুয়াল পদ্ধতির মতো।

প্রতিটি ফাংশন স্বাধীনভাবে সেট করার মাধ্যমে আপনি কৌশল বিন্যাসটি বিনামূল্যে পান।


সংঘর্ষ সনাক্তকরণের সাথে আপনার শেষ অনুচ্ছেদ সম্পর্কিত Regarding আমি মনে করি আপনার কাছে সম্ভবত একাধিক ধরণের ট্যাঙ্ক রয়েছে এবং আপনার একাধিক ধরণের ক্ষেপণাস্ত্র রয়েছে এবং এগুলির সংঘর্ষের সময় প্রতিটি সংমিশ্রণের সম্ভাব্যভাবে আলাদা ফলাফল হতে পারে। যদি আপনি এটি সন্ধান করেন তবে আপনার এমন একটি সমস্যা রয়েছে যা এখনও পর্যন্ত ওওপি ভাষাগুলি দ্বারা সমাধান হয়নি: একাধিক প্রেরণ এবং বহু-পদ্ধতিতে thisবিভিন্ন ধরণের একাধিক পরামিতি থাকতে পারে । এই সমস্যার জন্য আবার দুটি বিকল্প রয়েছে:

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