我正在使用LigGdx制作一款游戏,看起来像是一款RPG游戏。当敌人处于警戒状态时,它需要跟随玩家,但它只能向前、向后、向左和向右移动,并且在碰撞时需要绕过障碍物,寻找到达玩家的最佳路径。我在游戏开发方面是个新手,我的算法可能完全错误,所以,我真的需要帮助…
private void enemyInAlert(Enemy enemy, float delta) { detectDirection(enemy); enemyWalking(enemy, delta); if (Math.round(getDistanceXofLastPosition(enemy)) == 0 && Math.round(getDistanceYofLastPosition(enemy)) == 0) { enemy.setState(States.IDLE); lastPosition = null; }}private void detectDirection(Enemy enemy) { float diff = getDistanceXofLastPosition(enemy) - getDistanceYofLastPosition(enemy); if (diff < 0) { getDirectionX(enemy); } else if (diff > 0) { getDirectionY(enemy); }}private void getDirectionY(Enemy enemy) { int enemyY = Math.round(enemy.getY()); int lastPositionY = Math.round(lastPosition.getY()); if (enemyY < lastPositionY && enemy.isDirectionBlocked(Direction.FORWARD) == false) { //敌人需要向前走 enemy.setDirection(Direction.FORWARD); enemy.blockDirection(Direction.BACKWARD); } else if (enemyY > lastPositionY && enemy.isDirectionBlocked(Direction.FORWARD) == false) { //敌人需要向后走 enemy.setDirection(Direction.BACKWARD); enemy.blockDirection(Direction.FORWARD); } else { //敌人需要改变方向 if (enemy.isDirectionBlocked(Direction.LEFT) == false || enemy.isDirectionBlocked(Direction.LEFT) == false) { enemy.blockDirection(Direction.BACKWARD); enemy.blockDirection(Direction.FORWARD); getDirectionX(enemy); } else { sortRandomDirection(enemy); } } } private void getDirectionX(Enemy enemy) { int enemyX = Math.round(enemy.getX()); int lastPositionX = Math.round(lastPosition.getX()); if (enemyX < lastPositionX && enemy.isDirectionBlocked(Direction.RIGHT) == false) { //敌人需要向右走 enemy.setDirection(Direction.RIGHT); enemy.blockDirection(Direction.LEFT); } else if (enemyX > lastPositionX && enemy.isDirectionBlocked(Direction.LEFT) == false) { enemy.setDirection(Direction.LEFT); enemy.blockDirection(Direction.RIGHT); } else { //敌人需要改变方向 if (enemy.isDirectionBlocked(Direction.FORWARD) == false && enemy.isDirectionBlocked(Direction.BACKWARD) == false) { enemy.blockDirection(Direction.LEFT); enemy.blockDirection(Direction.RIGHT); getDirectionY(enemy); } else { sortRandomDirection(enemy); } } }
我接受建议,我可以更改所有代码,不留情面… 抱歉我的英语不好 😀
谢谢!!
编辑:现在,我正在尝试使用A*,或类似的东西。:D … 我的代码:
private void calculateRoute(Enemy enemy) { int lowerPath = getDistanceXofLastPosition(enemy.getBounds()) + getDistanceYofLastPosition(enemy.getBounds()); path = new ArrayList<Rectangle>(); Rectangle finalRect = new Rectangle(enemy.getBounds()); List<Rectangle> openList = new ArrayList<Rectangle>(); while (getDistanceXofLastPosition(finalRect) > 0 || getDistanceYofLastPosition(finalRect) > 0) { for (int i = -1; i < 2; i+= 1) { outerloop: for (int j = -1; j < 2; j+= 1) { Rectangle temp = new Rectangle(finalRect); temp.offSet(i, j); if (openList.contains(temp)) { continue; } if ((i == -1 && j == -1) || (i == 1 && j == -1) || (i == 0 && j == 0) || (i == 1 && j == -1) || (i == 1 && j == 1)) { continue; } for (Collider collider : colliders) { if (collider.isSolid() && Utils.detectCollision(temp, collider.getBounds())) { continue outerloop; } } openList.add(temp); } } int lowerDistance = Integer.MAX_VALUE; for (Rectangle rect : openList) { int distance = getDistanceXofLastPosition(rect) + getDistanceYofLastPosition(rect); distance = distance + lowerPath; if (distance < lowerDistance) { lowerDistance = distance; finalRect = rect; } } path.add(new Rectangle(finalRect)); }}
但是运行速度很慢,我可以做些什么来提高性能?
回答:
你可能需要研究一下A*算法。
你可以轻松地将你的地图转换成一个图,使用每个瓦片作为顶点,并使该顶点与所有靠近它的其他顶点通过边连接。边的成本可能是可变的,例如,在河上移动一个瓦片可能比在平地上移动一个瓦片的成本更高。
然后你可以使用路径搜索算法来寻找从一点到另一点的最佳路径。使用这种算法会有两个缺点:
- 它有很高的计算成本
- 它总是找到最优解,使你的机器人比普通玩家更聪明 🙂
如果计算和存储成本确实是个问题,你可以选择A*的变种之一,例如