Коли я повинен представляти точки і розміри як структури?


9

Як частина моєї простої рамки розробки ігор Ruby 2D, мої ігрові об'єкти мають положення (значення x та y) та розмір (ширина та висота).

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
  ...

Деякі рамки використовують колишні (я думаю, GDX, Gosu ...). Інші використовують останнє (cocos2d-iphone). Проблема полягає в тому, що мені не зовсім зрозуміло переваги та недоліки обох форм поведінки (в розвитку ігор) - я не знаю, чому деякі рамки обрали одну, а не іншу.

Чи є суттєві відмінності, які я повинен врахувати?

Відповіді:


8

Деякі навіть використовують Rectangleклас:

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

Це просто вибір дизайну, це насправді не має значення. Якщо ви робите власний код, зробіть те, що вам здається більш комфортним. Якщо ви використовуєте якісь API, фреймворк чи механізм, або редагуєте / модеруєте гру, намагайтеся відповідати решті коду і так само, як у сусідньому коді.

Я б сказав, щоб поїхати з двома окремими векторами, як ось цей:

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 vs, як часто потрібно обчислювати зміщення вектора, довжину, крапковий добуток тощо? Мета загальної справи; зробити код, з яким ви пишете неодноразово, простіше працювати, що для точок і векторів, як правило, буде операціями над усім "об'єктом", а не операціями з окремими компонентами.

Єдиний виняток, який я зробив би, - після правильного профілювання , ви вважаєте, що окрема структура занадто повільна. Такі мови, як Ruby, не роблять можливим просте "визначене користувачем" можливе, і, на мій досвід, наявність точок і векторів типу "посилання" - це болі часом і можуть бути масовим уповільненням без уважної уваги до часописів . Наприклад, може бути вигідним, наприклад, мати два масиви ints, один для xі один для y, а потім мати один масив Pointоб'єктів; з цим набагато більше болю, хоча так розбивайтеся лише тоді, якщо у вас є дійсні показники ефективності, щоб вказати, що це варто!


+1, але я хотів би зазначити, що попередня оптимізація - корінь усього зла.
Gustavo Maciel

3
@GustavoMaciel: справді. Факт: Круелла де Віль просто намагалася оптимізувати свій гардероб, перш ніж прибирати свою особистість, і подивитися, куди це дісталося.
Шон Міддлідч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.