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


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.