通常在地图中会有很多障碍物,比如树木,房子等等。我们不希望玩家能直接穿过这些障碍,而是会受到这些障碍物的阻挡。这个时候,我们可以给地图添加碰撞箱。
普通的非大地图碰撞箱:
我们先看如何实现“非大地图”游戏的碰撞箱。效果如下:
(可以点这里查看下面作品的代码页面)
- 首先,需要给角色添加一个碰撞箱造型:
- 碰撞箱造型为角色实际参与碰撞的部分;
- 玩家的碰撞箱可以是底部的圆形区域。(也可以直接以玩家造型为碰撞箱,但通常只有底部有碰撞体积)
2.接下来,我们编写碰撞箱的碰撞代码:
a.新建私有变量“上一刻x/y”
b.如果玩家没碰到障碍,用变量记录玩家没碰到障碍的坐标;
c.如果玩家碰到了障碍,则回到上一刻没碰到障碍的位置。
- 这样,我们就实现了碰撞箱效果:
3.接下来,我们切换为玩家的造型,然后每次检测碰撞时,才将造型切换为“碰撞箱”造型:
a.切换碰撞箱造型前,先保存之前的造型;
b.检测完碰撞后,切换为原造型。
注:如果碰撞箱造型不是圆形(比如下面的方形碰撞箱,或其他不规则造型),检测碰撞前,需要先将碰撞箱方向设为90°,否则不同方向时,碰撞箱的实际碰撞体会发生变化,如下👇
因此增加下面的代码:
效果:
4.但是,上面实现的效果还不够丝滑。当玩家碰到障碍后,像粘在了障碍物上,无法往旁边移动。
a.可以进行如下改进:
- 记录当前(x, y),上一刻(x', y')
- 如果在(x, y)处碰到障碍,则移到(x, y')(只增加x)
- 如果仍碰到障碍,则移到(x', y)(只增加y)
- 如果仍碰到障碍,则移到上一刻的(x', y')(不移动)
这样,如果遇到水平或者竖直的障碍,就会先尝试水平或竖直移动,而不会被卡住。效果如下:
(不过如果是其他方向的障碍,仍然会卡住,但是相比之前效果会好一点。)
5.最终,代码看起来像这样:
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG202/Arkos/Lec3/01&type=comment"
title="{射击3-非大地图的碰撞箱}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>
本页索引