当前位置: 首页 > 编程语言 > C#

XNA2D鼠标选择分享

时间:2023-04-10 21:32:18 C#

XNA2D鼠标选择我正在使用XNA开发一个简单的2D即时战略游戏。现在我已经到了需要能够单击一个单元或建筑物的sprite并能够引用与该sprite关联的对象的地步。根据我过去三天所做的研究,我发现了很多关于如何在3D中进行“鼠标选择”的参考资料,但这些参考资料似乎并不适用于我的情况。我知道的另一种方法是简单地拥有世界上所有“可选”对象的数组,当玩家点击精灵时,它会根据数组中所有对象的位置检查鼠标位置。我对这种方法的问题是,如果单元和建筑物的数量增长到更大的数量,它会变得相当慢。(看起来也不是很优雅)那我还能怎么办呢?(请注意,我还研究了使用哈希表将对象与sprite位置相关联的想法,并使用2D数组,其中数组中的每个位置代表世界中的一个像素。同样,它们看起来相当笨拙做事。)对于多达数百个单位,如果命中区域是圆形或矩形,它应该足够快,只需对世界上所有单位进行线性搜索O(n)。特别是看到每次点击一个而不是每帧一个。如果您的单位不是圆形或矩形,首先检查边界圆或矩形,如果通过则检查更复杂的边界形状。有关更详细的答案,这是我对类似空间分区问题的回答。在那里我提到了分桶网格和四叉树作为性能优化的潜在结构。但是,在您进行测试并且确实存在性能问题之前,您永远不应该执行性能优化!如果您有一个管理drawabel对象的类,则可以使用每次创建新对象时递增的静态int,并将旧对象保存为drawabel对象中Color的本地实例。然后你可以使用.Net类型转换器来制作它的bye数组并返回,不记得它的名称和我手机上的火车所以无法检查你。当你从字节数组构建颜色时,记得最大化alpha通道,如果你碰巧得到太多对象,你可能会超过你可以使用的索引..不知道该怎么做......可能再次拥有你所有的对象Re-从0:0:0:255获取新颜色,因为希望一些旧颜色不再使用:P不确定我做很多事情的意义,但因为我在火车上,所以我可以给你,抱歉:)您可以使用像素完美拾取,它可以很好地扩展到大量对象(并且具有像素完美的优势)。基本上,您使用每个对象的独特颜色渲染场景。然后将backbuffer解析成纹理并返回纹理数据,最后你只需要检查鼠标下方的像素即可找出鼠标悬停在什么对象上。您可以对获得的信息变得聪明,您可以只请求鼠标悬停的单个像素。颜色[]像素=新颜色[1];texture.GetData(pixel,mousePosition.Y*texture.Width+mousePosition.x,1);//pixel[0]==鼠标悬停的项目的颜色。你现在可以在字典中查找它,你应该小心不要这样做阻塞管道(导致CPU等待GPU渲染东西)。做到这一点的最好方法是在两个渲染目标之间交换,并始终从最后一帧使用的渲染目标交换GetData,这意味着数据是一个过时的帧,但没有人反应足够快以得到通知。回复您的评论的附录。要为每个对象分配唯一的颜色,只需为每个对象添加一个字节。当该字节溢出时,增加另一个字节,当一个字节溢出时增加另一个;然后您可以将这三个字节用作红色、绿色和蓝色。请记住将alpha保持在最大值,您不需要任何透视对象!解析后备缓冲区在XNA4中略有改变。现在你必须渲染到rendertarget并修复它。这很容易做到,ShawnHargreaves在这里概述注意—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: