我想问一下关于游戏中敌人移动的问题,就像马里奥兄弟游戏中的乌龟那样。
我正在使用 Libgdx 开发一个类似马里奥兄弟的平台游戏。我已经制作了地面、玩家在地面上移动、游戏装饰等……但我不知道如何让敌人移动。
敌人应该在什么时候开始移动(渲染)?是经过一段时间延迟后,还是当玩家接近敌人(1-2个屏幕宽度)时,还是一直移动……
回答:
假设你有这样的图片:
当你移动角色时,可见区域会随之移动,例如你的角色总是处于中间位置。
当角色移动时,charX
会增加,当他移动了一定距离后到达一个位置,敌人就会被激活:
敌人会保持激活状态,直到角色到达这里:
实现方式可以是这样的:someOffset
可以是一个任意的常数值,你可以使用它来让敌人在进入屏幕并变得可见之前就激活。
因此,对于每一帧,你可以这样做:
if (Math.abs(enemyX - charX) <= visibleWidth / 2 + someOffset) { // 敌人在 leftLimit 和 rightLimit 之间巡逻 if (enemySpeed < 0 && enemyX < leftLimit) { enemyX = leftLimit; enemySpeed = -enemySpeed; } else if (enemySpeed > 0 && enemyX > rightLimit) { enemyX = rightLimit; enemySpeed = -enemySpeed; } enemyX += enemySpeed * delta; renderEnemy();}
[更新]
如果我没记错的话,马里奥游戏中的屏幕只能向右移动。如果马里奥向左移动,屏幕会保持不动,只允许马里奥移动到屏幕的左边缘,不能再往前。
由于他并不总是处于可见区域的相同位置,可能最好是根据可见区域的位置而不是角色的位置来激活/渲染敌人。
假设 visibleX
是可见区域左边缘(绿色矩形)的 x 位置。
在每次更新时,你可以这样做:
visibleX = Math.max(charX - visibleWidth / 2, visibleX);if (enemyX <= visibleX + visibleWidth + someOffset && enemyX >= visibleX - someOffset) { // ...}