将“真实单位”缩放为像素的通用模式?


10

这是对另一个问题的后续问题。

我想知道是否存在一个通用/典型/最佳模式来缩放我对世界的表示(当前为160Kmx160Km)以使其适合绘图区域(当前为800x600像素)。

我可以想到至少四种不同的方法:

天真(到目前为止我的方式)。我实现了一个全局函数sc(vector),该函数将简单地返回传入的向量的按比例缩小的副本。这当然有效,但是必须我编写如下代码:

drawCircle(sc(radius), sc(position))

包装功能。我可以定义几个函数,每个函数都包装原始的中间件。例如,我可以定义myDrawCircle先缩放需要缩放的参数,然后再调用drawCircle后者。这可能会使我的代码更具可读性,并且更易于维护,但是我应该编写很多包装函数,听起来很傻。

功能装饰器。我可以简单地装饰现有的中间件功能,对所有属于这个类的一个实例参数提供自动缩放Vector3D,但问题是,这些功能也使用相同的参数是工作list还是Vector2D也和装饰就没有办法知道哪些列表需要缩放(例如半径),哪些​​不缩放(RGB值)。

表面初始化。在定义要绘制的表面时,我可以定义比例因子(这样我就可以使用米而不是像素作为参数)。这将对我透明地工作,并且是我选择的解决方案,但是当然应该在中间件中实现,因此这不是一个真正的选择。

...无论如何:由于这是一个非常普遍的问题,所以我想知道是否存在一种可以很好地解决我未能找到的问题的既定模式。

PS:对于这个项目,我正在使用python(与pygame一起使用),但是-尽管对python / pygame特定的答案非常,但我对模式的一般/高级描述而不是其具体实现更感兴趣。

预先感谢您的时间和专业知识。

Answers:


6

这样做的标准方法是设置一个转换矩阵以在渲染期间进行转换。对于3D渲染,它是摄影机的视图变换矩阵。

大多数2D API都有一种指定视图变换的方式,既可以是2x3矩阵,也可以是单独的缩放,平移和旋转。

快速浏览pygame文档建议您必须自己实现视图转换矩阵。它是否允许您从其表面类派生您自己的类以使您能够添加该功能?


您的回答非常有用(+1)。我可以对表面类进行子类化,但是我需要更多时间来探索我是否可以实现您的帖子中指示的内容。我一般对游戏编程和图形游戏还是很陌生的,您是否有一些链接建议您介绍这种矩阵方法(或者甚至仅是涉及使用矩阵缩放表面的数学方法)?谢谢!
mac

1
由于它是2D的,并且涉及旋转,因此 @mac基本上是说要包装函数,您可以在这些包装器中使用简单的比例划分。通常使用完整矩阵的原因是大多数API都有一个控制视口的矩阵,但是pygame似乎没有,因此您必须自己做一层。
Patrick Hughes

2

由于这是一个非常常见的问题,所以我想知道是否存在一种可以很好地解决我未能找到的问题的既定模式。

通常,人们不会尝试在2D游戏中执行运行时缩放。我不同意这是一个普遍的问题。如果人们想要迷你地图或其他固定的缩放比例,通常会为此目的制作一组新的图形。在2D游戏中,您几乎不需要任何例程即可在2种不同的缩放级别下运行。

如果您使用3D API,则可以免费获得此功能-只需更改相机/视口参数即可。

PyGame是一个非常古老的API,不幸的是它仅真正适用于2D。即使您可以为不同的缩放级别设计适当的缩放系统,性能也不会足够好,外观可能会令人无法接受。

我建议,如果要放大和缩小很多,请尽快使用现代3D API。我会推荐pyglet,但可能还会有其他人。


感谢您的回答(+1)。我pyglets过去已经使用过3D模拟。它肯定比强大pygame,但是对2D的支持比in中的支持低得多pygame。可用的文档/示例也不太详细,这对我来说实在是太糟糕了,因为我是游戏开发的初学者,我确实需要了解最常执行的操作的基础。:)至于pygame的“年龄”:您是对的。一个现代化正在进行不过!:)
mac

至于:“很少有人需要任何一个例程即可在2个不同的缩放级别上运行”。从您的评论中我不明白这是什么:指向“常见”的指针是什么?
Mac

在pyglet比pygame更底层的情况下,您要执行哪些2D操作?两者都可以让您用1行代码绘制一个精灵。当您更改2D游戏的窗口大小时,像素与世界单位的比例几乎总是保持不变。因此,您最终只能绘制更多的精灵:您不会以不同的方式绘制它们。
Kylotan

从底层的角度来看:我并不是两个库中任何一个的真正专家,但在pyglet中,我无法即开即用地复制pygame提供的组渲染行为(pygame.sprite.LayeredUpdates例如)。至于不变的比例:我明白你的意思。您描述的行为不是我要复制的行为,但我理解您的意思,感谢您的澄清!:)
mac

pyglet拥有OrderedGroup对象-文档是在这里,如果你或其他人有兴趣:pyglet.org/doc/programming_guide/displaying_images.html#sprites
Kylotan
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.