점과 크기는 언제 구조로 표현해야합니까?


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해야합니까? 일반적인 경우를 목표로합니다. 점과 벡터에 대해 반복적으로 작성하는 코드를 사용하여 작업하기가 더 쉬워집니다. 일반적으로 점과 벡터의 경우 개별 구성 요소에 대한 작업이 아니라 전체 "개체"에 대한 작업이됩니다.

내가 만드는 유일한 예외는 올바르게 프로파일 링 한 후 별도의 구조가 너무 느리다는 것을 알 수 있습니다. 루비와 같은 언어는 단순한 사용자 정의 "값별"을 가능하게하지 않으며, 경험상 포인트와 벡터를 "기준 별"유형으로 만드는 것은 때때로 고통스럽고 임시주의에주의를 기울이지 않고 막대한 속도 저하를 일으킬 수 있습니다. . 그것은 두개의 int 배열, 하나 가지고, 예를 들면, 유리할 수 x및 대한 하나 y의 단일 배열하도록 한 다음, Point객체; 작업하는 것이 훨씬 더 고통 스럽지만 가치가 있음을 나타내는 유효한 성능 지표가있는 경우 에만 분할 하십시오 !


+1이지만 사전 최적화는 모든 악의 근원이라고 언급하고 싶습니다.
구스타보 메이 엘

3
@GustavoMaciel : 참으로. 사실 : Cruella de Vil은 그녀의 개성을 정리하기 전에 그녀의 옷장을 최적화하려고했고, 그것이 어디로 가는지를 보았습니다.
Sean Middleditch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.