Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2D游戏引擎如何组织游戏对象?_Python_Pygame - Fatal编程技术网

Python 2D游戏引擎如何组织游戏对象?

Python 2D游戏引擎如何组织游戏对象?,python,pygame,Python,Pygame,晚上好(来自欧洲) 我正在尝试使用python和pygame创建一个2D游戏引擎,这将起作用 类似于,但您只能创建2D游戏。 为了解释我的问题,我将向您展示一些您需要的课程 在我继续之前先知道 我有一个名为Sprite的类,它代表我的游戏对象,我们关心的方法是渲染方法。此方法已被调用 每秒一帧,并将精灵对象的图像绘制到屏幕中。 它还调用另一个方法update,您可以覆盖该方法并创建一些 你的精灵对象的逻辑(我称之为大脑:p)。我还有一个类Scene,其中我将所有精灵对象存储到一个链接列表中 为了

晚上好(来自欧洲)

我正在尝试使用python和pygame创建一个2D游戏引擎
,这将起作用 类似于,但您只能创建2D游戏。
为了解释我的问题,我将向您展示一些您需要的课程
在我继续之前先知道


我有一个名为Sprite的类,它代表我的游戏对象,我们关心的方法是渲染方法。此方法已被调用 每秒一帧,并将精灵对象的图像绘制到屏幕中。 它还调用另一个方法update,您可以覆盖该方法并创建一些 你的精灵对象的逻辑(我称之为大脑:p)。我还有一个类Scene,其中我将所有精灵对象存储到一个链接列表中

为了渲染场景中的所有游戏对象,我使用上述算法在场景类中创建了一个方法:

#obj is a sprite object.
#Is been called every frame per second.
for obj in gameobjects:
    obj.render()
如您所见,这是渲染我场景中所有游戏对象的最简单方法。这就是我的问题开始的地方。如果我们说我有10000场比赛 进入该循环场景的对象将延迟帧,从而导致延迟问题

我考虑的一个解决方案是只渲染 我可以看到(窗口边框内的游戏对象)。这很有效 但问题是,我必须检查所有进入我的 场景将位于窗口分辨率内,并仅渲染它们。所以我做了这样的事情:

#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

将所有对象放置在二维网格中,网格代表整个场景。然后,您可以轻松地仅迭代屏幕上可见的内容。现在碰撞检测变得更容易了


单元格的大小由您决定。尝试不同的大小,看看哪一种效果最好

四叉树是一种相对常见的快速确定空间某些部分中的对象的方法。您是否尝试渲染10000个对象,并确信渲染循环是应用程序的主要瓶颈?如果你没有,那么这只是另一个例子。大多数渲染库的效率足以无障碍地渲染10000个对象。如果您完全确定渲染循环造成了性能瓶颈,那么您只应该让其他人投入时间来帮助您。哦,如果实际上是瓶颈,您可能希望在不同的线程中执行所有渲染。如果问题出在你身上,你所做的事情实际上是提高性能的最简单的方法。您必须遍历每个对象并运行其更新方法,所以为什么不执行这个小检查呢?实际上,您可以将所有渲染代码移动到
摄影机
或类似的类,并且每个对象都可以通知每个摄影机是否已离开或进入其视口。在调用render之前,将对每个对象运行此检查。您是对的。问题不仅在于渲染,还在于碰撞检测。碰撞可能会造成很多延迟,但我并不关心。除了渲染,渲染方法也可以运行昂贵的算法(我称之为brains:p),我不知道这些算法的代码,因为游戏程序员将创建它们。因此,引擎运行的次数越少,对可怜的ram越好:p我将检查这些四叉树,以前从未听过它们:p