我何时应将点和大小表示为结构?


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)。问题是,我不清楚这两种行为的优缺点(在游戏开发中)-我不知道为什么有些框架选择了一个而不选择了另一个。

我应该考虑重大差异吗?

Answers:


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从分离yVS多久你需要计算一个向量偏移,长度,点的产品等?针对普通情况;使您反复编写的代码更易于使用,对于点和矢量,通常将是对整个“对象”的操作,而不是对单个组件的操作。

我唯一要做的例外是,在正确分析之后,您会发现单独的结构太慢。像Ruby之类的语言无法实现简单的用户定义的“按值”,并且根据我的经验,有时将点和向量作为“按引用”类型既很痛苦,又可能在不注意临时对象的情况下大幅降低性能。例如,具有两个整数数组,一个用于x,一个用于y,然后具有一个Point对象的数组可能是有利的。使用起来比较麻烦,因此只有您拥有有效的性能指标以表明其值得时才进行拆分!


+1,但我想提一下,预优化是万恶之源。
Gustavo Maciel

3
@GustavoMaciel:的确如此。事实:克鲁埃拉·德·维尔(Cruella de Vil)只是在优化自己的衣橱之前,先清理自己的性格,然后看待她的去向。
肖恩·米德迪奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.