ポイントとサイズをいつ構造体として表す必要がありますか?


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、フレームワークまたはエンジンを使用している場合、またはゲームの編集/改造を行っている場合は、コードの残りの部分と一貫していて、近くのコードと同じようにしてください。

私はこのように2つの別々のベクトルで行くと言います:

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、ベクトルのオフセット、長さ、内積などを計算する必要がある頻度 一般的なケースを目指してください。繰り返し作成するコードを簡単に操作できるようにします。これは、ポイントとベクトルの場合、通常、個々のコンポーネントに対する操作ではなく、「オブジェクト」全体に対する操作になります。

私がする唯一の例外は、適切にプロファイリングした後、個別の構造が遅すぎることです。Rubyのような言語では、単純なユーザー定義の「値による」が可能ではありません。私の経験では、ポイントとベクトルを「参照による」型にすることは、両方とも時として苦痛であり、一時的なものに注意を払わなければ大幅な速度低下になる可能性があります。たとえば、for xとforの2つのint配列がありy、次にPointオブジェクトの単一配列があると有利です。作業するのははるかに面倒ですが、分割するのは、それが価値があることを示す有効なパフォーマンスメトリックがある場合のみにしてください。


+1、しかし私は事前最適化がすべての悪の根であることを述べたいと思います。
Gustavo Maciel 2013

3
@GustavoMaciel:確かに。事実:Cruella de Vilは、性格を片付ける前にワードローブを最適化し、それが彼女をどこに導いたかを調べようとしていました。
Sean Middleditch 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.