XNA 2D鼠标采摘 - c#

我正在使用XNA开发一个简单的2D实时策略游戏。现在,我已经达到了需要单击某个单元或建筑物的精灵并能够引用与该精灵关联的对象的地步。
在过去三天的研究中,我发现了很多有关如何在3D模式下进行“鼠标拾取”的参考,但这似乎不适用于我的情况。
我知道,执行此操作的另一种方法是简单地拥有世界上所有“可选”对象的数组,并且当玩家单击精灵时,它会根据数组中所有对象的位置检查鼠标的位置。我使用这种方法的问题是,如果单元和建筑物的数量增加到更多,它将变得相当慢。 (它看起来也不是很优雅),那么我还有什么其他方法可以做到这一点。 (请注意,我还研究了使用哈希表将对象与子画面位置相关联,并使用二维数组,其中数组中的每个位置代表世界上一个像素的想法。再次,它们看起来更像是笨拙的做事方式。)

参考方案

对于最多数百个单位,如果点击区域是圆形或矩形,那么它应该足够快,可以简单地对世界上所有单位进行线性搜索O(n)。尤其是每次点击一次,而不是每帧一次。

如果您的单位不是圆形或矩形,请先检查边界圆或矩形,如果通过,则检查更复杂的边界形状。

有关更详细的答案,请here's my answer to a similar question有关空间分区。在那里,我提到了桶形网格和四叉树作为优化性能的潜在结构。

但是,除非经过测试并确实存在性能问题,否则切勿进行性能优化!

XNA Keyboard.GetState()不返回所有按下的键 - c#

我正在学习XNA(v。4.0),并且正在使用键盘上的箭头键移动精灵,并在保持空格的同时使字符冲刺。以下是我的代码来确定按下了哪些键:currentKBState = Keyboard.GetState(); bool right = currentKBState.IsKeyDown(Keys.Right); bool left = currentKBStat…

XNA初始化和LoadContent之间的差异 - c#

Initialize和LoadContent有什么区别?我试图通过将事物从LoadContent移到Initialize并来回移动来制动XNA游戏,但是只要您以正确的方式调用事物,无论我放在哪里都可以。 参考方案 documentation for LoadContent指出 此方法由Initialize调用documentation for Initial…

XNA中任意大小,位置和旋转矩形的碰撞检测 - c#

我正在C#中使用xna,在我的游戏中,我将有各种各样的太空飞船在各处飞行。它们各自在空间中具有任意旋转,大小和位置,我需要一种方法来确定它们何时发生碰撞。理想情况下,该方法将分别使用两个矩形,两个双精度数和两个Vector2分别用于大小,旋转和位置,并返回一个布尔值,指示它们是否相交。 参考方案 看看这些链接:Collision Detection Over…

随机角度发生器 - c#

我有一个角度说60度,想在间隔[-120,120]内生成随机角度,其中间隔以60度为中心,现在为[-60,180]我在下面的代码:http://www.cs.princeton.edu/introcs/22library/StdRandom.java.html我很困惑,因为有人说高斯分布在[0,1]之内。如何通过范围[-120,120]?60度角是对象的相对…

Vector2.Normalize函数,对对角线输出感到困惑 - c#

我的问题是使用Vector2.Normalize函数时(专门在XNA中)可能是我对向量数学的理解不佳,但据我所知,归一化为您提供方向或渐变。如果您在单个方向(例如,左右上下)上应用速度,它只会针对特定轴和对我有意义的方向返回正或负1。但是,如果我要对对角移动的vector2进行归一化,则每隔1个单位向右说1个单位。它返回这个。{X:0.7071068 Y:0…