কাঠামো হিসাবে কখন আমার পয়েন্ট এবং আকারগুলি উপস্থাপন করা উচিত?


9

আমার সাধারণ রুবি 2 ডি গেম ডেভেলপমেন্ট ফ্রেমওয়ার্কের অংশ হিসাবে, আমার গেমের অবজেক্টগুলির অবস্থান (x এবং y মান) এবং আকার (প্রস্থ এবং উচ্চতা) রয়েছে have

class MyGameObject
  attr_accessor :x
  attr_accessor :y
  attr_accessor :width
  attr_accessor :height
  ...

অন্য একটি পদ্ধতি যা আমি দেখেছি তা হ'ল অবস্থানটিকে Pointকাঠামোর মতো করে এবং আকারটিকে কাঠামোর মতো আচরণ করছে Size:

Point = Struct.new(:x, :y)
Size = Struct.new(:width,:height)

class MyGameObject
  attr_accessor :position   # Point instance
  attr_accessor :size       # Size instance
  ...

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

আমার কি উল্লেখযোগ্য পার্থক্য বিবেচনা করা উচিত?

উত্তর:


8

কিছু এমনকি Rectangleক্লাস ব্যবহার :

class Rectangle
{
    float x, y, w, h;
}
class GameObject
{
    Rectangle dimensions;
}

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

আমি এই হিসাবে দুটি পৃথক ভেক্টর সঙ্গে যেতে বলব:

class Vector2
{
    float x, y;
    //helper functions like operator overload, dot, length, distance, etc.
}

class GameObject
{
    Vector2 position;
    Vector2 size;
    Vector2 direction;
}

এইভাবে আপনি জিনিসগুলির মধ্যে কোণগুলির মতো জিনিসগুলি সহজেই পরিচালনা করতে পারেন, এরকম:

GameObject foe;
GameObject player;
Vector2 dist = player.position - foe.position;
dist.normalize();
float angleBetween = acos(dist.dot(foe.direction));

পরিবর্তে আয়তক্ষেত্র থেকে ভেক্টরগুলি নিষ্কাশন করা, বা তাদের সরল ভাসমান থেকে তৈরি করা উচিত।


2

সাধারণভাবে, সর্বদা একটি পৃথক ডেটা কাঠামো ব্যবহার করুন। এটি আপনার কোডটি ব্যবহার, পড়া এবং রক্ষণাবেক্ষণে উল্লেখযোগ্যভাবে সহজ করে তোলে। আপনি কত ঘন ঘন প্রয়োজন xথেকে আলাদা yবনাম কত ঘন ঘন আপনি পণ্য বিন্দু, গণনা করতে একটি ভেক্টর অফসেট প্রয়োজন দৈর্ঘ্য ইত্যাদি না? সাধারণ ক্ষেত্রে লক্ষ্য; আপনি বার বার যে কোডটি লিখেছেন তাতে কাজ করা সহজ করে নিন, যা পয়েন্ট এবং ভেক্টরগুলির জন্য সাধারণত পৃথক উপাদানগুলির ক্রিয়াকলাপের পরিবর্তে পুরো "অবজেক্ট" এ কাজ করে।

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


+1, তবে আমি উল্লেখ করতে চাই যে প্রিপটিমাইজেশন হ'ল সমস্ত মন্দের মূল।
গুস্তাভো ম্যাকিয়েল

3
@ গুস্তাভো ম্যাসিয়েল: সত্যই। ঘটনা: ক্রুয়েলা ডি ভিল তার ব্যক্তিত্ব পরিষ্কার করার আগে তার পোশাকটি আরও অনুকূল করার চেষ্টা করছিল এবং সে কোথায় পেল সে দিকে তাকান।
শান মিডলডিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.