hareqj   ♂  喵他  
 编程让人生更优雅

Godot3D简单FPS射击游戏入门3--初步移动视角

作者:多能豆
3D  单机游戏  第三人称RPG 
既然要移动视角,那么肯定要捕获光标(即鼠标指针),那就得用到Input类下的get_mouse_mode和set_mouse_mode
其中我们需要知道的参数只有两个:
Input.MOUSE_MODE_CAPTURED捕获
Input.MOUSE_MODE_VISIBLE释放
在脚本中添加以下代码:


这样,在节点加载完成时,就会将鼠标模式改成“捕获”(将光标隐藏,并固定在中心)
这样是将鼠标捕获了,可你会发现:你不能关闭游戏了!因为光标固定在中心!
当然,你可以通过键盘关闭游戏。但,这对玩家来说是糟糕的体验!


所以你还得添加这段代码到_process()函数下:


就是每帧检测你是否按下绑定的按键,按下后则获取鼠标模式并判读是否为“释放”,如果是(真)则将鼠标模式设置为“捕获”。如果不是(假)则将鼠标模式设置为“释放”
这样,你就可以正常地游玩了。


接下来我们就说一下:怎么移动视角?
我们只需要认识“欧拉角”就行了,


编辑器中的欧拉角:


红色:X轴,“上下点头”
绿色:Y轴,“左右摇头”
蓝色:Z轴,额...算了,想不出形容词


听起来好像只需要转转XYZ轴,但实际麻烦多了
而其中新手最容易出问题的是“轴顺序”问题:
1.先向前10像素,再向右5像素
2.先向右5像素,再向前10像素
上面两个例子好像终点相同,可在欧拉角中,三个轴所经过的区域是个球面!而球面是曲面!它并不平整,所以轴的旋转是有顺序的!


了解欧拉角后,我们直接来看一下视角旋转的代码:


注:我们这里并不是将旋转作用于一个节点的,而是:左右旋转时,旋转KinematicBody;上下旋转时,旋转eye
这样可以显得更自然,并且为简化了后续操作(如全局坐标移动)


短短5行代码,含金量却很高
首先,声明一个“光标移动速度”为0.2
然后,调用内置函数_input()它在玩家输入时被调用,它可以传入一个参数,这个参数为:当前玩家输入类型(如,按键输入,鼠标点击,鼠标移动)
接下来,做一个判断:参数event是否为属于InputEventMouseMotion类
(底下的relative属性属于InputEventMouseMotion类,为了防止玩家输入其他类型时报错[如鼠标点击],所以判断)
并且此时的鼠标模式为“捕获”


后两行解释
relative属性返回的是此时鼠标相对于上一帧的位置(二维向量)
例:鼠标相对于上一帧向左移动了10,则返回(-10,0),而relative.x即为-10
然后将其乘以“鼠标移动速度”
再乘-1(变为相反数)因为欧拉角“向左为正”,而编辑器中“向左为负”
然后用deg2rad()将它们转化为弧度,这一步并不重要,只不过是因为即使将relative乘0.2,它的值以弧度来说,依旧大的出奇,而我并不喜欢将“鼠标速度”设置得特别小(例如0.025),所以我默认它是角度,以此来降低灵敏度。当然你完全可以修改mouse_speed的值来替代这一步。
rotate_y和rotate_x就是以y和x轴旋转


这样,人物就可以在三维世界中自由得观察了


虽然人物可以观察四周了,但你会发现,人物不会朝着看的方向行进,这是因为move_and_slide()是按照全局坐标移动的,下节我们就研究一下“全局坐标”


补:关于视角限制问题
我们可以通过clamp()方法控制"eye"的rotation属性来实现
clamp()方法我之前在2D移动中讲述过
而rotation属性则是一个节点被旋转的弧度(最大为pi,最小为-pi)
我们可以通过写rotation.x获得单一轴旋转的弧度
我一开始直接将其写在_input()函数下:


可....


会出现闪屏

究其原因,是在下疏忽大意了:
clamp()方法get_node("eye").rotate_x的前面。这意味这在移动完视角后,只有再调用_input()函数时才会将event.relative.x的值修改


解决方法
clamp()放到get_node("eye").rotate_x的下面。这样,每次移动完视角后,都会直接运行clamp()。这样就没问题了



[举报]  赞↑ [0 踩↓ [0
暂无评论
[声明]

初衷和宗旨:共同努力,推动Godot游戏引擎在国内的普及和发展.
1.本站所有内容皆为用户发布,如有涉嫌侵权请联系hareqj#163.com,告知内容右上角所在编号以及侵权证据.
2.禁止发布色情/暴恐/时政/商广/带网址或二维码水印/涉嫌隐私或未经授权的私人图片.
3.举报和投稿:hareqj#163.com

Godot中文社区QQ群
Copyright Godot中文社区 Godott.com All Rights Reserved.
京ICP备13032831号