এটি উত্তর দেওয়া একটি কঠিন প্রশ্ন কারণ একটি সত্তা উপাদান সিস্টেমটি কীভাবে গঠন করা উচিত সে সম্পর্কে প্রত্যেকের নিজস্ব ধারণা। আমি যা করতে পারি তা হ'ল আমার পক্ষে আমার পক্ষে সবচেয়ে দরকারী বলে কিছু জিনিস আপনার সাথে ভাগ করে নেওয়া।
সত্তা
আমি ইসিএসের কাছে ফ্যাট-ক্লাসের পদ্ধতি গ্রহণ করি, সম্ভবত আমি প্রোগ্রামিংয়ের চূড়ান্ত পদ্ধতিগুলি অত্যন্ত অদক্ষ (মানব উত্পাদনশীলতার দিক থেকে) খুঁজে পাই। সে লক্ষ্যে, আমার কাছে একটি সত্তা হ'ল আরও বিবিধ শ্রেণীর দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত বিমূর্ত শ্রেণি। সত্তার বেশ কয়েকটি ভার্চুয়াল বৈশিষ্ট্য এবং একটি সহজ পতাকা রয়েছে যা আমাকে বলে যে এই সত্তার অস্তিত্ব থাকা উচিত কিনা। একটি রেন্ডার সিস্টেম সম্পর্কে আপনার প্রশ্নের তুলনায় তাই Entity
দেখতে দেখতে দেখতে এটি হ'ল :
public abstract class Entity {
public bool IsAlive = true;
public virtual SpatialComponent Spatial { get; set; }
public virtual ImageComponent Image { get; set; }
public virtual AnimationComponent Animation { get; set; }
public virtual InputComponent Input { get; set; }
}
উপাদান
উপাদান "মূঢ়" এ যে, তারা না না বা জানেন কিছু। তাদের অন্যান্য উপাদানগুলির সাথে কোনও রেফারেন্স নেই, এবং তাদের সাধারণত কোনও ফাংশন নেই (আমি সি # তে কাজ করি, তাই আমি গেটার / সেটারগুলি পরিচালনা করার জন্য বৈশিষ্ট্যগুলি ব্যবহার করি - যদি তাদের ফাংশন থাকে তবে তারা তাদের থাকা ডেটা পুনরুদ্ধারের আশেপাশে থাকে)।
সিস্টেম
সিস্টেমগুলি "বোকা" কম, তবে এখনও বোবা অটোমেটন। তাদের সামগ্রিক সিস্টেমের কোনও প্রসঙ্গ নেই, অন্যান্য সিস্টেমে কোনও রেফারেন্স নেই এবং কয়েকটি বাফার ছাড়া তাদের কোনও পৃথক প্রক্রিয়াজাতকরণের প্রয়োজন হতে পারে এমন কোনও ডেটা রাখেন না। সিস্টেমের উপর নির্ভর করে এটির একটি বিশেষজ্ঞ Update
, বা Draw
পদ্ধতি বা কিছু ক্ষেত্রে উভয় ক্ষেত্রে থাকতে পারে।
ইন্টারফেস
ইন্টারফেসগুলি আমার সিস্টেমে একটি মূল কাঠামো। কোনটি কী System
প্রক্রিয়া করতে পারে এবং কোনটি Entity
সক্ষম। রেন্ডারিংয়ের জন্য প্রাসঙ্গিক ইন্টারফেসগুলি হ'ল: IRenderable
এবং IAnimatable
।
ইন্টারফেসগুলি সহজভাবে সিস্টেমকে জানায় যে কোন উপাদানগুলি উপলব্ধ। উদাহরণস্বরূপ, রেন্ডারিং সিস্টেমে সত্তার বাউন্ডিং বাক্স এবং চিত্রটি আঁকতে হবে। আমার ক্ষেত্রে, এটি হবে SpatialComponent
এবং ImageComponent
। সুতরাং এটির মতো দেখাচ্ছে:
public interface IRenderable {
SpatialComponent Component { get; }
ImageComponent Image { get; }
}
রেন্ডারিং সিস্টেম
সুতরাং কীভাবে রেন্ডারিং সিস্টেম একটি সত্তা আঁকবে? এটি আসলে বেশ সহজ, সুতরাং আমি আপনাকে ধারণা দেওয়ার জন্য কেবল স্ট্রিপড ডাউন ক্লাসটি দেখাব:
public class RenderSystem {
private SpriteBatch batch;
public RenderSystem(SpriteBatch batch) {
this.batch = batch;
}
public void Draw(List<IRenderable> list) {
foreach(IRenderable obj in list) {
this.batch.draw(
obj.Image.Texture,
obj.Spatial.Position,
obj.Image.Source,
Color.White);
}
}
}
ক্লাসের দিকে তাকানো, রেন্ডার সিস্টেম এমনকি একটি Entity
কী তা জানে না । এটি সম্পর্কে যা কিছু জানে IRenderable
সেগুলি আঁকার জন্য কেবল তাদের একটি তালিকা দেওয়া হয়।
কিভাবে এটি সব কাজ করে
আমি কীভাবে নতুন গেমের অবজেক্ট তৈরি করি এবং কীভাবে সিস্টেমে তাদের ফিড করব তা বুঝতে এটি সহায়তা করতে পারে।
সত্তা তৈরি করা হচ্ছে
সমস্ত গেমের অবজেক্টস সত্তা থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং কোনও প্রয়োগযোগ্য ইন্টারফেস যা গেমের অবজেক্টটি কী করতে পারে তা বর্ণনা করে। স্ক্রিনে অ্যানিমেটেড সমস্ত কিছুর মতো দেখতে:
public class MyAnimatedWidget : Entity, IRenderable, IAnimatable {}
সিস্টেমগুলি খাওয়ানো
আমি একক তালিকায় গেম জগতের সমস্ত সত্ত্বার তালিকা রেখেছি List<Entity> gameObjects
। প্রতিটি ফ্রেম, আমি তারপরে সেই তালিকাটি পর্যালোচনা করি এবং ইন্টারফেসের ধরণের উপর ভিত্তি করে অবজেক্টের রেফারেন্সগুলি অনুলিপি করি, যেমন List<IRenderable> renderableObjects
, এবং List<IAnimatable> animatableObjects
। এই পদ্ধতিতে, যদি বিভিন্ন সিস্টেমে একই সত্তা প্রক্রিয়া করার প্রয়োজন হয় তবে তারা পারে। তারপরে আমি কেবল সেই তালিকাগুলিকে প্রতিটি সিস্টেম Update
বা Draw
পদ্ধতিতে হস্তান্তর করি এবং সিস্টেমগুলি তাদের কাজটি করতে দেয়।
অ্যানিমেশন
অ্যানিমেশন সিস্টেমটি কীভাবে কাজ করে তা আপনি জানতে আগ্রহী হতে পারেন। আমার ক্ষেত্রে আপনি আইনিমেটেবল ইন্টারফেস দেখতে চাইতে পারেন:
public interface IAnimatable {
public AnimationComponent Animation { get; }
public ImageComponent Image { get; set; }
}
এখানে লক্ষ্য করার মূল বিষয়টি হ'ল ইন্টারফেসের ImageComponent
দিকটি IAnimatable
কেবল পঠনযোগ্য নয়; এটি একটি সেটর আছে ।
আপনি যেমন অনুমান করতে পারেন, অ্যানিমেশন উপাদানটি সবেমাত্র অ্যানিমেশন সম্পর্কিত ডেটা রাখে; ফ্রেমের একটি তালিকা (যা চিত্রের উপাদানগুলি), বর্তমান ফ্রেম, প্রতি সেকেন্ডে ফ্রেমের অঙ্কন করতে হবে, শেষ ফ্রেম বর্ধনের পরে বিচ্ছিন্ন সময় এবং অন্যান্য বিকল্পসমূহ।
অ্যানিমেশন সিস্টেমটি উপস্থাপনা সিস্টেম এবং চিত্রের উপাদানগুলির সম্পর্কের সুযোগ নেয়। এটি সহজেই সত্তার চিত্রের উপাদানটি পরিবর্তন করে কারণ এটি অ্যানিমেশনের ফ্রেমটিকে বাড়িয়ে তোলে। এইভাবে, অ্যানিমেশনটি উপস্থাপনের মাধ্যমে পরোক্ষভাবে উপস্থাপন করা হয়।