与xna中的对象交互

时间:2014-09-29 07:44:11

标签: class xna collision

我是使用xna的新手,我想让我的玩家与同一类的多重墙碰撞。所以我环顾四周,我明白这样做的最好方法是创建一个包含墙id的变量列表,然后创建一个循环遍历所有变量,然后返回碰撞对象的变量。 我的问题是,如果有更快更有效的方法吗?我的意思是,如果我有10000个对象,循环可能会导致大量的内存使用。 Thx提前

2 个答案:

答案 0 :(得分:2)

选项1)如果这10000个对象是某个级别的墙,那么你应该使用某种网格(就像这个非常古老的例子:https://en.wikipedia.org/wiki/The_Legend_of_Zelda#mediaviewer/File:Legend_of_Zelda_NES.PNG) 使用网格,您只需检查与相邻对象的碰撞,或仅检查附近的对象。

选项2)如果这10000个物体是更自由移动的敌人或子弹,那么你也可以先计算距离,只检查碰撞物体是否在附近。

但请问您为什么使用XNA?我曾经使用过XNA 4.x,但据我所知,它已经死了(http://www.computerandvideogames.com/389018/microsoft-email-confirms-plan-to-cease-xna-support)。如果您是XNA的新手,我会建议使用其他软件制作游戏(如Unity3D)。在Unity3D中,碰撞检测的难点是为您完成的(具有用于碰撞检测的标准功能),Unity3D也适用于C#(如XNA)

答案 1 :(得分:0)

您总是希望进行最少量的处理才能完成工作。对于平铺的2D游戏,您通常具有2维网格。当玩家想要在某个瓷砖上行走时,您可以检查该瓷砖是否允许在那里行走。在这种情况下,您只需检查一个瓷砖。如果您有很多NPC,您可以将地图划分为多个部分,并跟踪NPC的部分内容。现在你只需对你所在区域内的敌人进行碰撞检测。

当您需要昂贵的碰撞,像素完美或多边形碰撞时,您应首先检查物体是否接近于具有简单半径floatBoundingSphere的物体,然后才会继续进行更昂贵的碰撞检测。

对于几乎任何事情都是如此,如果你有一个100x100的tilemap但只需要为屏幕绘制20x10,那么你应该只通过计算渲染那部分。在虚幻中,映射器创建不可见的框,当在这些框内时,它仅绘制地图的某个部分并且仅检查这些框内的碰撞。 GameDev就是让事情顺利进行的诀窍。