寻找在正方形中生成敌人的可用空间。
2014-2-18 14:51:26
收藏:0
阅读:97
评论:2
我有一个区域,需要生成敌人,使其看起来很好(它们在围墙后面),我不希望敌人互相重叠,所以我想知道有没有好的方法来处理这个问题?
http://sv.tinypic.com/r/2zowwu1/8
我创建了一个函数,检查下一个盒子(下一个敌人)是否适合所有可能的位置(像素级别),但这太慢了,因为这是移动应用程序,敌人有时会快速生成。肯定有一个好的公式可以计算下一个敌人适合的不同边界吧?
点赞
用户869951
如果每个敌人占据表面积E,而你的区域有表面积S,那么E/S就是一个敌人占据你区域的比例。假设E/S非常小,否则你将很难在不重叠的情况下放置许多敌人。因此,如果E/S很小,并且你有N个敌人,而n*E/S仍然相对较小(比如1/10),那么你有很好的机会随机选择一个位置,然后检查你的敌人列表,看看你的新敌人x是否在半径R之内与任何其他敌人。如果没有,在试试新的随机位置。如果你的敌人列表按照它们的x坐标排序,那么这部分会很快,你平均会节省一半的列表时间。使用第二个表根据y排序。通常情况下,性能是以内存为代价的(当基于可用信息数量时,正如本例)。所以:
- 通过将它们放入两个表中来记录你创建的敌人:一个表按x排序,另一个表按y排序
- 选择下一个敌人要生成的位置:x,y
- 在表1中找到两个边界x的敌人:新的敌人是否比它们之一更接近距离R(敌人大小)(sqrt((x-xi)^2+(y-yi)^2),其中xi,yi是表中的敌人)?检查任何其他所需的条件。
- 如果测试失败,请选择新的x,y并从步骤4重复
- 如果测试通过,请保存将插入新敌人的索引,然后为y重复上述测试,使用y表:
- 在表2中找到两个边界y的敌人:新的敌人是否比它们之一更接近距离R(敌人大小)(sqrt((x-xi)^2+(y-yi)^2),其中xi,yi是表中的敌人)?
- 如果测试失败,请选择新的y并从步骤6重复;如果只选择新的y,则重复步骤6
- 如果测试通过,请保存将插入新敌人的索引
- 在表1中的保存的索引1和在表2中的保存的索引2处插入新敌人
2014-02-18 16:14:15
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
有几个好的解决方案。
快速易用。您只需检查边界即可。对于每个正方形敌人,您有2个点。您可以轻松测试两个矩形是否相交,如果排序您的x坐标,则可以检查它们之间的间隙。如果间隙更大,则下一个敌人的宽度-检查y间隙,然后在那里生成它。
将生成位置分割为常规网格,在敌人边界内标记为已占用。不检查像素,而是检查单元格以找到可以生成的位置。
|-----|-----|-----| | 1 +-|-2-+ | 3 | // 1,2,4,5被占用。非常简单的检查。 | | | | | | // 您有时需要更新该信息。 |---|-|---+-|-----| | 4 +---5-+ | 6 | | | | | |-----|-----|-----|如果生成点很大,请考虑使用四叉树将其分割成段,然后检查它们以找到适合的位置。