晚上好(来自欧洲)。
我正在尝试使用python和pygame创建一个2D游戏引擎,
该引擎将与Unity 3D相似,但是您将只能创建2D游戏。
为了解释我的问题,我将向您展示一些我需要
继续学习之前要知道的课程。
我有一个名为Sprite的类,它代表我的游戏对象,而我们关心的方法是render方法。每秒每帧调用一次此方法,该方法将sprite对象的图像绘制到屏幕中。它还调用另一个方法更新,您可以覆盖它并为您的sprite对象创建一些逻辑(我称其为brains:p)。我也有一个Scene类,我将所有的Sprite对象存储到一个链表中。
为了渲染场景中的所有游戏对象,我使用上述算法在Scene类中创建了一个方法:
#obj is a sprite object.
#Is been called every frame per second.
for obj in gameobjects:
obj.render()
如您所见,这是渲染场景中所有游戏对象的最简单方法。这是我的问题开始的地方。如果我们说我有10.000个游戏对象进入场景,则此for循环将延迟帧,从而导致滞后问题。
我想到的一种解决方案是仅渲染我可以看到的游戏对象(位于窗口边框内的游戏对象)。效果很好,但问题是我必须检查进入场景的所有游戏对象是否在窗口分辨率之内,并仅渲染它们。所以我做了这样的事情:
#This method is been called only every time there is a movement
#action into te game causing all the game objects to change position.
for obj in all_game_objects:
if inside_resolution(obj):
render_objects.append(obj)
#Is been called every frame per second.
for obj in render_objects:
obj.render()
如您所见,我仍然需要检查所有游戏对象,所以我没有成功!
如果我能以某种方式将我的游戏对象组织到一个像二叉树之类的数据结构中,并创建一些仅返回窗口分辨率内的游戏对象的智能方法,那么我可以成功实现快速渲染系统。
所以我的整个问题是我可以使用什么数据结构来存储游戏对象?一棵树会非常快,但是如果不检查所有这些对象,我怎么能知道哪些游戏对象在屏幕分辨率之内呢?
据了解,像unity3D这样的现代游戏引擎正在使用树木渲染场景的不同区域(以及适合观看距离的区域),这就是它的工作原理。
我希望对我的问题的描述足够了。
谢谢您的耐心:p
将所有对象放置在一个二维网格中,该网格代表您的整个场景。然后,您可以轻松地仅遍历屏幕上可见的对象。现在,碰撞检测变得更加容易。
单元的大小取决于您。尝试不同的尺寸,看看哪种效果最好
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句