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

В рамках моей простой платформы разработки игр 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). Проблема в том, что мне не совсем понятны преимущества и недостатки обоих поведений (в разработке игр) - я не знаю, почему некоторые рамки выбрали один, а не другой.

Есть ли существенные различия, которые я должен рассмотреть?

9 голосов | спросил Oxide 9 J000000Tuesday13 2013, 09:53:47

2 ответа


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));

вместо того, чтобы извлекать векторы из прямоугольников или создавать их из простых float.

ответил Gustavo Maciel 9 J000000Tuesday13 2013, 10:35:04
2

В общем, всегда используйте отдельную структуру данных. Это делает ваш код значительно проще в использовании, чтении и обслуживании. Как часто вам нужно x отдельно от y vs, как часто вам нужно вычислять векторное смещение, длину, точечный продукт и т. д.? Цель для общего дела; сделать код, с которым вы пишете, с легкостью работать, что для точек и векторов, как правило, будет работать со всем «объектом», а не с операциями с отдельными компонентами.

Единственное исключение, которое я бы сделал, - после правильного профилирования , вы обнаружите, что отдельная структура слишком медленная. Языки, такие как Ruby, не делают простой пользовательский «по значению» возможным, и, по моему опыту, наличие точек и векторов является «побочным» типом - это одновременно и боль, и может быть массовым замедлением без особого внимания временным , Например, может быть выгодно иметь два массива ints, один для x и один для y, то для получения одного массива объектов Point; гораздо больнее работать, хотя для этого нужно только разделить , если у вас есть допустимые показатели производительности, чтобы указать, что это стоит!

ответил Sean Middleditch 9 J000000Tuesday13 2013, 22:27:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132