一、基本要求
– 具备游戏编程的基本知识
– 了解如何处理碰撞(使用 AABB 和 SweptAABB 与地面和物体发生碰撞)
– 对键盘处理的基本了解。
– 知道如何让角色行走(速度、重力、按键控制……)
2.关于如何在游戏中制作楼梯的想法
– 在游戏中制作楼梯本质上是我让角色像上楼梯一样行走,而不是我一步步走。
您可以将楼梯的精灵加载到背景地图中或以通常的方式绘制它。
– 在这篇文章中,我将向您展示如何根据处理楼梯的起点和终点来制作楼梯。
具体思路如下:
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拉高一些,这样当你触摸它时,梯子上的状态就关闭了呢? 然而,回到我说的最初想法,
我使用底部和顶部作为进入和退出梯子的信号,这意味着它用于这两个目的。 因此,当玩家笔直站在顶部时,
我可以将顶部对象稍微放置一点。
现在您会问,为什么对象顶部位于顶部,而不是位于玩家脚的下方?
我是这样设置的,因为我希望当玩家接触到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,不能多也不能少。
此外,根据游戏的特点,您可以阻止其他问题,例如跳上梯子、击中梯子上的敌人,这样您就不会被抛出,
或与许多其他活动(行走、站立等)相关。 你应该严格控制条件。
祝你好运 :))
评论留言
暂时没有留言!