找一种2D的游戏。可以冒险岛手动升级路线的。不要...

视线和光线:如何给游戏添加 2D 可见性和阴影效果 - 文章 - 伯乐在线
& 视线和光线:如何给游戏添加 2D 可见性和阴影效果
各位好!今天,我将告诉你如何做这样的事情:(在框中四处移动你的鼠标)
这种效果用于我新开发的开源游戏《》。许多其他的 2D 游戏(如Monaco,Gish)也都有。如果按着本教程来实现……也许下个就是你的游戏!
我将展示我在学习如何实现这种效果过程中的步骤和所发生的错误。首先,给一些样板代码。下面只是演示绘制了一堆线段并跟踪鼠标位置。(注:有四个线段为边框)
接下来介绍数学知识。别担心,这里只是复习下入门的代数而已。
我们需要找出射线和所有线段的最近交叉点。任何线段可以被写成参数形式:
点 + 方向 * T
点 + 方向 * T
这儿我们给出 4 组方程来描述射线和线段的 x 和 y 变量:
射线 X = r_px+r_dx*T1
射线 Y = r_py+r_dy*T1
线段 X = s_px+s_dx*T2
线段 Y = s_py+s_dy*T2
射线 X = r_px+r_dx*T1射线 Y = r_py+r_dy*T1线段 X = s_px+s_dx*T2线段 Y = s_py+s_dy*T2
注:在我们做任何事情之前,请检查以确保射线和线段不是平行的,也就是说,它们的方向是不一样的。如果它们是平行的,那就没有交集。好了,继续。
如果射线和线段相交,其 x 和 y 变量是相同的:
r_px+r_dx*T1 = s_px+s_dx*T2
r_py+r_dy*T1 = s_py+s_dy*T2
r_px+r_dx*T1 = s_px+s_dx*T2r_py+r_dy*T1 = s_py+s_dy*T2
我们做个小小的符号移位来求解 T1 和 T2
// Isolate T1 for both equations, getting rid of T1
// 从两个等式中独立出T1,移去T1
T1 = (s_px+s_dx*T2-r_px)/r_dx = (s_py+s_dy*T2-r_py)/r_dy
// Multiply both sides by r_dx * r_dy
// 两边同乘上 r_dx * r_dy
s_px*r_dy + s_dx*T2*r_dy - r_px*r_dy = s_py*r_dx + s_dy*T2*r_dx - r_py*r_dx
// Solve for T2!
// 解出T2!
T2 = (r_dx*(s_py-r_py) + r_dy*(r_px-s_px))/(s_dx*r_dy - s_dy*r_dx)
// Plug the value of T2 to get T1
// 代入T2,解出T1
T1 = (s_px+s_dx*T2-r_px)/r_dx
123456789101112131415
// Isolate T1 for both equations, getting rid of T1// 从两个等式中独立出T1,移去T1 T1 = (s_px+s_dx*T2-r_px)/r_dx = (s_py+s_dy*T2-r_py)/r_dy&// Multiply both sides by r_dx * r_dy// 两边同乘上 r_dx * r_dys_px*r_dy + s_dx*T2*r_dy - r_px*r_dy = s_py*r_dx + s_dy*T2*r_dx - r_py*r_dx&// Solve for T2!// 解出T2!T2 = (r_dx*(s_py-r_py) + r_dy*(r_px-s_px))/(s_dx*r_dy - s_dy*r_dx)&// Plug the value of T2 to get T1// 代入T2,解出T1T1 = (s_px+s_dx*T2-r_px)/r_dx
确保 T1&0 并且 0&T2&1。如果不是,则可认为射线和线段没有交点,不可能有交集。但如果是,那太好了!你已经找到了一个交点。现在只要使用同一条射线与其它线段进行计算,就能找到最近的交点。(这个值就是最小T1值)
这就是所有的数学知识了:(将鼠标移到下面的框里)
哇!现在用这些东西让我们找一些乐子!我投了50条向各个方向的光线:
于是我想,我可以简单地连接这些射线与线段的点,就能获得不错的可见性多边形。但是,最终它看起来像……
织网。但这并不重要,即使我使用360条射线来模拟360度,它仍然看上去很不靠谱。这是我最大的绊脚石,直到我意识到我不可能四面八方都投射到。我只需投射到线段的两端点。对每一个(唯一的)线段端点,朝它直接投射射线,再加上两条偏移为+/- 0.00001弧度的射线。这两条额外的射线会打在给定线段后面的墙上。
接下来,按照射线的角度对交点进行排序。这让我可以简单地按顺时针方向连接各个点,并绘制出平滑的可见性多边形,比如这样的:
终于来了!为了实际上看起来更好些。为了绘制额外的可见性多边形,我们再在位置上稍微偏移投射射线,可以创造出“模糊”阴影,像下面一样。红点表示11原点 – 是的,这有11个可见性多边形!
当这一切完成后,我画了这两张图像…
…并混合在一起,利用模糊阴影作为一个alpha遮罩。我已经向您展示了跟页面顶部相似的令人毛骨悚然的画面,只不过这里是一个不同的迭代,用了多个光源。
多个光源。投射阴影。一个巨大的激光炸弹。显示出你的主角/敌人看的到或看不到的区域。2D可见性/照明效果可以非常灵活得进行合适的创意,可以为您的游戏增加很多额外的魅力。
*完全是一个技术术语 (译者注:原本是圣经创世纪里的一句话)
作者的开源地址:
关于作者:
可能感兴趣的话题
good,效果不错,原理清晰
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
基于Direct3D的2D游戏开发实现.pdf 54页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:200 &&
你可能关注的文档:
··········
··········
BasedDirect3D
Programming
Major:ComputerTechnology
Name&HuiJuanHU
ProfessorZhou
Supervisor:ViceQing
seemsthatthe3D
regions PC—games’marketprosperous,it
replacegames.However,2Dgames
vanished,they
fieldssuchasCasual
Games.But
technologygames developedenough,whilegames’Sdeveloping
technicalthresholdiS
short,the
lower,the flexible,the
stillliketo
lessandthe
requiredrelatively
manygamecompanies
better.What’S
thereactionoftheChinese
developgames
more,from
market,2D
arestillbelovedthe
Online,etc.
by gamefans,e.g.DNF,FreeFantacy
DirectDraw
Beforethe200
softwaremost
gameproducers
sinceDirectX8.0had
eliminatedthe
intheDirectX.But
completely
components
Direc.tDraw
正在加载中,请稍后...

我要回帖

更多关于 冒险岛手动升级路线 的文章

 

随机推荐