基于瓦片式地图的2D游戏视野机制

1,285次阅读
没有评论

基于瓦片式地图的2D游戏视野机制

视野的概念本身来源于现实世界,而它的底层规律则是物理意义上的光线传播机制,即光线沿直线传播且会被物体遮挡形成阴影,当特定的光线被遮挡无法抵达观察者眼睛时,即表示该部分视野被遮蔽。

如果是第一人称游戏,那么视野这个概念和机制的存在是理所当然且符合直觉的,只要场景内的物体和角色位置安排正确,渲染过程正确且光线传播符合物理定律即可。

但考虑第三人称游戏时,视野机制就会变得有些特别。

因为在第三人称状态下,玩家将可以看见“视野”本身的存在,根据游戏的具体设定,这个“视野”可以是一个圆形范围,也可以是一个扇形范围,甚至可以是三角形范围。

于是视野问题就转变成了如何定义并计算出这个“范围”,通常而言这个“范围”会被简称为FOV,即Field of View,可视范围。

在讨论瓦片式地图下的特殊视野机制前,应当先考察更一般的情况,即普通的第三人称2D游戏中,FOV的计算到底该怎么做,而作为思路的开端,我们可以基于两个前提设定进行讨论。

  1. 玩家的视野等同于以玩家为原点,360度放射的光线所照亮的区域。
  2. 能够遮挡光线的实体具备几何特征且可以被检测

虽然第三人称2D游戏本身也有多种视角,但为了简单起见,在这里先仅讨论俯视视角的情况

参考文章:点击跳转

该文的翻译版:点击跳转

该文章中描述了一种2D俯视角游戏的FOV计算方式,其思考路径和优化方案都是简单易懂且能出效果的。

有了一般性的FOV计算思路,现在就可以进入2D瓦片式地图的FOV讨论了。

首先需要确定问题,即瓦片式地图的FOV计算和普通2D的FOV计算有什么不同。

如果游戏并不需求FOV也基于地图瓦片,即那种一格一格分开的离散态,那么计算方式没有什么不同,无非就是在寻找周边遮挡物的时候并不去考虑物体的几何特征或者碰撞体顶点,而是将地图网格的格点当做顶点即可。

但若是希望FOV计算的结果基于瓦片,即得到一系列网格坐标的集合而非多边形组合,那么算法就必须做出一些适当的修改了。

思路和前文提到的参考文章中类似,即并不考虑从玩家出发能看到哪些地块,而是反向考虑哪些地块能看到玩家,通过对特定范围内的所有地块都进行相同的计算后即可得到FOV的地块集合。

具体过程大概描述如下:

  1. 找到一个待计算的FOV地块集合,通常而言是曼哈顿距离小于等于视野半径的所有地块
  2. 遍历该集合,取出每一个地块计算其对玩家所在位置的可见性(即光线是否可达)
  3. 记录下所有可见地块到结果集合

不难看出,其中的重点在于如何针对视野范围内的每个地块,基于光线是否可达计算可见性。

不同于普通2D游戏中可以通过射线检测的方式来模拟光线,基于瓦片式地图的检测必须对光线进行网格拟合。

这个拟合过程大致描述如下:

1、通过起止点坐标位置计算过两点的直线斜率(即(y2-y1)/(x2-x1))

2、根据斜率的情况做分类讨论

a) 如果斜率为零,表示这条直线水平,拟合时只需考虑X轴上的格点即可

b) 如果斜率为无穷大,表示该直线垂直,拟合时只需考虑Y轴上的格点

c) 如果斜率恰好为1,表示是一条标准对角线,拟合时考虑deltaX=deltaY的格点即可

d) 如果斜率为其它数值,表示该斜线没有特点,那就采取通用的拟合方式

3、拟合的过程中如果检测到某一格点被遮挡(即设定为阻挡视野),则中断拟合,记录检测过的格点

4、循环结束后得到所有可视格点集合

其中所谓的通用拟合方式是指如下的计算方法:

1、如果斜率大于1则先设定Y坐标为变化值,反之则设定X坐标为变化值

2、将变化值朝原点(即视野计算起始点,玩家所在坐标)位移一个单位(Y轴或者X轴其中之一)

3、计算另一轴的坐标近似值(即将变化后的值带入直线公式中计算结果并近似)

4、如果近似值和考察点的对应坐标值之间的距离大于1,则改变变化值的设定(Y轴变为X轴或者反过来)

5、重复以上步骤直至考察点与原点重合或者进入已经确认的视野范围或者遇到阻挡视野的格点

在这里贴上部分通用拟合过程的代码

var deltaX = point.x – origin.x;
var deltaY = point.y – origin.y;
var offsetX = deltaX < 0 ? 1 : -1;
var offsetY = deltaY < 0 ? 1 : -1;
if (changeX) {
// X变化,Y要近似
iter.x += offsetX;
var dy = iter.y – origin.y;
var yValue = (deltaY * 1f / deltaX) * (iter.x – point.x) + point.y;
var adaptY = dy > 0 ? Mathf.FloorToInt(yValue) : Mathf.CeilToInt(yValue);
var nq = new Square(iter.x, adaptY);
if (!checkVisibile(nq)) return false;
yValue = (deltaY * 1f / deltaX) * (iter.x – point.x + offsetX) + point.y;
if (Mathf.Abs(yValue – iter.y) >= 1f) changeX = false;
} else {
// Y变化,X要近似
iter.y += offsetY;
var dx = iter.x – origin.x;
var xValue = (deltaX * 1f / deltaY) * (iter.y – point.y) + point.x;
var adaptX = dx > 0 ? Mathf.FloorToInt(xValue) : Mathf.CeilToInt(xValue);
var nq = new Square(adaptX, iter.y);
if (!checkVisibile(nq)) return false;
xValue = (deltaX * 1f / deltaY) * (iter.y – point.y + offsetY) + point.x;
if (Mathf.Abs(xValue – iter.x) >= 1f) changeX = true;
}

全部格点拟合结束后即可找到符合要求的视野范围

以上就是作者关于瓦片式地图中的视野机制的粗浅认知和思考,作为游戏中长久存在的重要机制,视野范围的计算和应用必定有更深刻的理论和实践存在,大家如有任何讨论的想法都欢迎评论。

PS: 以上提到的视野机制在作者参与开发的游戏《边界迷航》中将有所体现,欢迎来看看或者关注一下~~

名称:《边界迷航》

Read More 

 

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)

文心AIGC

2023 年 7 月
 12
3456789
10111213141516
17181920212223
24252627282930
31  
文心AIGC
文心AIGC
人工智能ChatGPT,AIGC指利用人工智能技术来生成内容,其中包括文字、语音、代码、图像、视频、机器人动作等等。被认为是继PGC、UGC之后的新型内容创作方式。AIGC作为元宇宙的新方向,近几年迭代速度呈现指数级爆发,谷歌、Meta、百度等平台型巨头持续布局
文章搜索
热门文章
潞晨尤洋:日常办公没必要上私有模型,这三类企业才需要 | MEET2026

潞晨尤洋:日常办公没必要上私有模型,这三类企业才需要 | MEET2026

潞晨尤洋:日常办公没必要上私有模型,这三类企业才需要 | MEET2026 Jay 2025-12-22 09...
面向「空天具身智能」,北航团队提出星座规划新基准丨NeurIPS’25

面向「空天具身智能」,北航团队提出星座规划新基准丨NeurIPS’25

面向「空天具身智能」,北航团队提出星座规划新基准丨NeurIPS’25 鹭羽 2025-12-13 22:37...
钉钉又发新版本!把 AI 搬进每一次对话和会议

钉钉又发新版本!把 AI 搬进每一次对话和会议

钉钉又发新版本!把 AI 搬进每一次对话和会议 梦晨 2025-12-11 15:33:51 来源:量子位 A...
商汤Seko2.0重磅发布,合作短剧登顶抖音AI短剧榜No.1

商汤Seko2.0重磅发布,合作短剧登顶抖音AI短剧榜No.1

商汤Seko2.0重磅发布,合作短剧登顶抖音AI短剧榜No.1 十三 2025-12-15 14:13:14 ...
跳过“逐字生成”!蚂蚁集团赵俊博:扩散模型让我们能直接修改Token | MEET2026

跳过“逐字生成”!蚂蚁集团赵俊博:扩散模型让我们能直接修改Token | MEET2026

跳过“逐字生成”!蚂蚁集团赵俊博:扩散模型让我们能直接修改Token | MEET2026 一水 2025-1...
最新评论
ufabet ufabet มีเกมให้เลือกเล่นมากมาย: เกมเดิมพันหลากหลาย ครบทุกค่ายดัง
tornado crypto mixer tornado crypto mixer Discover the power of privacy with TornadoCash! Learn how this decentralized mixer ensures your transactions remain confidential.
ดูบอลสด ดูบอลสด Very well presented. Every quote was awesome and thanks for sharing the content. Keep sharing and keep motivating others.
ดูบอลสด ดูบอลสด Pretty! This has been a really wonderful post. Many thanks for providing these details.
ดูบอลสด ดูบอลสด Pretty! This has been a really wonderful post. Many thanks for providing these details.
ดูบอลสด ดูบอลสด Hi there to all, for the reason that I am genuinely keen of reading this website’s post to be updated on a regular basis. It carries pleasant stuff.
Obrazy Sztuka Nowoczesna Obrazy Sztuka Nowoczesna Thank you for this wonderful contribution to the topic. Your ability to explain complex ideas simply is admirable.
ufabet ufabet Hi there to all, for the reason that I am genuinely keen of reading this website’s post to be updated on a regular basis. It carries pleasant stuff.
ufabet ufabet You’re so awesome! I don’t believe I have read a single thing like that before. So great to find someone with some original thoughts on this topic. Really.. thank you for starting this up. This website is something that is needed on the internet, someone with a little originality!
ufabet ufabet Very well presented. Every quote was awesome and thanks for sharing the content. Keep sharing and keep motivating others.
热评文章
预见未来:96位前沿先锋超万字核心观点总结,抢抓未来产业新高地

预见未来:96位前沿先锋超万字核心观点总结,抢抓未来产业新高地

预见未来:96位前沿先锋超万字核心观点总结,抢抓未来产业新高地 henry 2025-12-11 10:27:...
Meta公开抄阿里Qwen作业,还闭源了…

Meta公开抄阿里Qwen作业,还闭源了…

Meta公开抄阿里Qwen作业,还闭源了… Jay 2025-12-11 11:48:25 来源:量子位 Ja...
MEET2026挤爆了,AI圈今年最该听的20+场演讲&对谈都在这

MEET2026挤爆了,AI圈今年最该听的20+场演讲&对谈都在这

MEET2026挤爆了,AI圈今年最该听的20+场演讲&对谈都在这 西风 2025-12-11 15:...
钉钉又发新版本!把 AI 搬进每一次对话和会议

钉钉又发新版本!把 AI 搬进每一次对话和会议

钉钉又发新版本!把 AI 搬进每一次对话和会议 梦晨 2025-12-11 15:33:51 来源:量子位 A...