【游戏开发入门】游戏中如何制作楼梯

频道:电脑救援 日期: 浏览:91

一、基本要求

– 具备游戏编程的基本知识

– 了解如何处理碰撞(使用 AABB 和 SweptAABB 与地面和物体发生碰撞)

– 对键盘处理的基本了解。

– 知道如何让角色行走(速度、重力、按键控制……)

2.关于如何在游戏中制作楼梯的想法
image.png

– 在游戏中制作楼梯本质上是我让角色像上楼梯一样行走,而不是我一步步走。
您可以将楼梯的精灵加载到背景地图中或以通常的方式绘制它。

– 在这篇文章中,我将向您展示如何根据处理楼梯的起点和终点来制作楼梯。

具体思路如下:

A。 总体设计

– 每个楼梯将有 2 个隐藏对象(即未在屏幕上绘制的对象)以及相对大小的 BoundingBox。
 楼梯的底部是StairBottom,楼梯的顶部是StairTop。
b. 处理开始走上阶梯

- 因此,当角色站在StairBottom区域并按下UP键(向上箭头)时,您就打开了角色在楼梯上的状态。
或者换句话说,当角色按下向上键时,你必须检查角色是否与 StairBottom 碰撞到 AABB? 如果是这样,
让角色开始在楼梯上行走。

补充:在这种情况下,我必须使用 AABB 而不是 Swept AABB,因为显然我的角色在单击此隐藏对象之前可能已与它发生碰撞,
因此 SweptAABB 无法检查此碰撞。 (换句话说,在重叠时使用sweepAABB是行不通的)

– 上升时,根据你的游戏,如果梯子是均匀的,你可以给vx和vy速度相同,等等。这就是攀爬部分的结束。

C。 搬运开始下楼梯

– 与开始上梯子类似,检查角色是否与楼梯顶部碰撞并按下向下键? 如果是这样,请打开梯子上的状态。

d. 在梯子上上下移动的处理

– 完成上梯子和下梯子的处理后,我会得到Being on theladder的状态,此时我只需要检查一下,
如果我在梯子上按向上键,我会让角色向上走。同样,按向下键向下走。

– 同时,还运行有关行走和站在梯子上的动画。e. 把手从梯子上取下来

– 接下来,完成下梯子的任务。如果你的角色上升并触及楼梯顶部,你就可以结束你的角色在梯子上的状态。

– 从楼梯底部的梯子上下来是类似的。

当然,处理起来还是一个难题,所以下面就讲一下。

3. 如何安装

A。 对象楼梯底部和楼梯顶部

所需属性:

x、y、width、height等物体的基本属性(这个要看你的代码,主要是考虑碰撞)

int 方向。 (楼梯方向,根据这里的游戏而定,我会根据我做的游戏约定:-1:
从楼梯脚开始从右到左的楼梯方向,1:从楼梯脚开始从左到右的方向)。

您可以自己创建这些对象并将它们添加到游戏中。 另请注意,根据上述约定,
楼梯将具有完整的 StairBottom 和 StairTop,并且具有相同的方向(方向为 -1 或 1)。

b. 对象播放器在我看来,在这个对象中应该有一个变量来控制玩家行走的楼梯方向(int DirectionStair)。
 (从顶部或底部进入梯子后立即指定楼梯方向。您可以使用它来相应地加载动画,我不会清楚地解释这部分。

– 变量管理玩家是否在梯子上(bool isOnStair)。

– 方法 SetSpeed(vx,vy);

C。 处理键盘

– 这部分你可以随意使用keydown或者keystate,因为这种情况下没有明确的对错概念,
只能说你能不能运行,能不能处理所有情况。 。

C。 1.当玩家按下UP键时

– 根据上面的思路描述,当玩家按下UP时,可能有2种情况。

第一种情况:玩家尚未在梯子上(isOnStair == false):

向AABB查询是否与StairBottom发生碰撞? 如果是,则 isOnStair = true; 和玩家->方向楼梯 = StairBottom->方向;

情况 2:玩家已经在梯子上(isOnStair == true):

为玩家提供速度,以便玩家可以向上移动。 这取决于楼梯的方向,你的代码是否改变了轴线? ETC..

玩家->SetSpeed(玩家->方向楼梯 * PLAYER_SPEED_ON_STAIR, -PLAYER_SPEED_ON_STAIR)

PLAYER_SPEED_ON_STAIR 是一个常量,用于管理梯子上的速度。
 因此,当您将 vx 设置为 player->directionStair * PLAYER_SPEED_ON_STAIR 时,您将同时推广到方向 1 和 -1 楼梯。 例如,
-1方向刻度表示方向是从右到左,然后玩家向上,这意味着玩家的x轴会减小,所以vx必须为负值,与1方向刻度类似,
vx必须为正值。 至于vy,我想你会明白的。

另外,你还需要改变播放器的方向,可能是为了动画,例如:player->SetDirection(player->directionStair);
 玩家面对的方向就是楼梯的方向。

C。 2.当玩家按下DOWN键时

当按下DOWN时,与上面基本相同,但根据您的游戏可能会有不同的情况。

一般来说,主要有3种情况:

情况1:尚未上楼梯(isOnStair == false):

向AABB查询是否与StairTop有碰撞? 如果是,则 isOnStair = true; 和玩家->方向楼梯 = StairBottom->方向;

情况 2:已经在楼梯上(isOnStair == true):

赋予玩家速度,以便玩家可以下降。 处理过程与上面类似。

玩家->SetSpeed(- 玩家->方向楼梯 * PLAYER_SPEED_ON_STAIR, PLAYER_SPEED_ON_STAIR)

PLAYER_SPEED_ON_STAIR 是一个常量,用于管理梯子上的速度。 因此,当您将 vx 设置为 -player->directionStair *
PLAYER_SPEED_ON_STAIR 时,您将概括方向 1 和 -1 楼梯。 例如,方向尺度为-1,表示方向是从右向左,那么玩家向下,
则表示玩家的x轴会增大,所以vx必须为正,同理,方向尺度为1,则vx 必须为负数。 至于 Vy,因为它正在下降,
所以我必须让 Vy 保持积极的态度。

改变玩家面向的方向:player->SetDirection(-player->directionStair);

情况3:角色像往常一样坐下。

d. 在播放器更新中处理

在我看来,玩家的更新将是处理地面碰撞、处理角色重力、根据速度计算和更新角色的 x 和 y 的地方……这就是为什么,
在大多数情况下,处理角色如何在地面上移动梯子并从梯子上下来? 都位于这里。

当玩家在梯子上时,您必须关闭重力,以避免站在梯子上时被重力拉下来。

在梯子上时,必须关闭地面碰撞处理。 避免玩家不小心接触地面时被缠住的情况。


如果玩家在梯子上(isOnStair ==true),那么您可以按如下方式考虑碰撞:

d. 1. 如果玩家正在上升

– 检查玩家是否触摸了楼梯顶部?

如果是的话,那就意味着下楼梯。 但是,在这里如果你只是关闭了梯子上的状态或者一不小心,
你的玩家就会与砖块重叠,从而导致掉落到下面地面的现象。

此时你会问,为什么不把StairTop拉高一些,这样当你触摸它时,梯子上的状态就关闭了呢? 然而,回到我说的最初想法,
我使用底部和顶部作为进入和退出梯子的信号,这意味着它用于这两个目的。 因此,当玩家笔直站在顶部时,
我可以将顶部对象稍微放置一点。

image.png

现在您会问,为什么对象顶部位于顶部,而不是位于玩家脚的下方?

我是这样设置的,因为我希望当玩家接触到Top的时候,他会站在地面上,如果按照我刚才说的,
把Top放低一点,那么当玩家还没有走完楼梯的时候,它就会站在地面上。 ... 突然,他站在了地上。 (不合理)。

好吧,在理解了 Object Top 的意图之后,我将回到如何最好地编码让角色从梯子上下来并站在地面上的问题。 当触摸上面的对象时,
我需要使用 swingAABB,以便玩家可以站在地面上。 这部分我就不解释了,因为如果你是一个能脚踏实地的玩家,你大概就明白了。

– 然而,生活并不像梦,使用sweepAABB但它仍然通过,因为一旦接触,玩家可能已经与地面重叠,
因为我将Object Top放置在它稍微接触玩家的位置。 因此,此时您可能需要将玩家拉起(y=y-……),使其勉强站在地面上。

然而,拉动多少才足够呢?

因为行走取决于速度、距离,也许每个刻度你把Top设置的高度并不理想(很可能运气不好所以没有被减去足够所以重叠继续,
但编程中的运气不好才是最终的事情)。 ),所以实际上很难准确确定。

要解决这个问题,您只需将玩家向上拖动,例如 y-=100px,然后将速度设置为非常高的下拉速度,
例如 vy = 99999.0f,然后使用 swingAABB 让玩家站在地面上,并关闭状态梯子,结束。完成下梯子的过程。
 将vy放置得极大的目的是为了在1帧内解决这个问题,以免玩家有跳起来然后慢慢落下的感觉。

– 如果不与Top发生碰撞,则x和y将正常更新x+=dx; y+=dy;

d. 2.以防玩家倒下

类似于玩家上升的情况。

你只需要检查你是否正在下降并触及底部,然后用扫频检查是否与地面发生碰撞,如果发生碰撞,
你将在梯子上结束你的旅程。 这种情况下唯一的区别是不需要拉起播放器。

– 如果不与Top发生碰撞,则x和y将正常更新x+=dx; y+=dy;

4. 先进加工

– 上面的说明非常简单,但是,要在楼梯上拥有平稳的台阶,您必须更加先进,具体来说:

- 在《恶魔城》游戏中,当玩家站在梯子附近、相反方向或梯子周围并按下按键进入梯子时,玩家会到达一定级别后才能登上梯子。
 这样做并不是多余的,而且是非常有必要的,在上梯子之前锚定一个固定点,会帮助玩家始终从那个位置开始,
否则有时候会下梯子,有时候又会往右走。

– 第二个增强功能,如果您在原始游戏中注意到,每次按向上键,玩家就会升一级。 所以你应该让你的玩家在每次按下 go 时“轮流”,
玩家必须在停止前正好走 1 步。 而且如果你更加注意的话,你会发现每个步骤的大小都是16px,所以如果你更准确的话,你应该将每个步骤限制为16px。
 但是,由于取决于土地,因此在上下过程中有时会出现偏差,因此如果一次移动超过 16px,请重置玩家的位置以消除多余部分。

简而言之,您可以:

– 编写附加函数来为玩家设置自动行走。

– 开始上楼梯时固定位置,以便始终拥有最理想的走法。

– 每个通道限制必须正好是 16px,不能多也不能少。

此外,根据游戏的特点,您可以阻止其他问题,例如跳上梯子、击中梯子上的敌人,这样您就不会被抛出,
或与许多其他活动(行走、站立等)相关。 你应该严格控制条件。

祝你好运 :))


评论留言

暂时没有留言!

我要留言