- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以我使用 Slick2D 制作游戏。它有一个 TiledMap 和实体(与任何其他游戏一样),我想要一种使用 A* 的方法。我真的不知道如何使用它,因为我找不到解释。
对于那些不使用 Slick 的人来说,它已经有我使用的 AStarPathFinding 和 TiledMap 类。
最佳答案
这是一个简单的示例,说明 Slick2D 中的 A-star 路径查找是如何工作的。在真实游戏中,您可能会更实际地实现 TileBasedMap
接口(interface),该接口(interface)实际上会在您的游戏使用的任何 map 结构中查找可访问性。您还可以根据例如您的 map 地形返回不同的成本。
import org.newdawn.slick.util.pathfinding.AStarPathFinder;
import org.newdawn.slick.util.pathfinding.Mover;
import org.newdawn.slick.util.pathfinding.Path;
import org.newdawn.slick.util.pathfinding.PathFindingContext;
import org.newdawn.slick.util.pathfinding.TileBasedMap;
public class AStarTest {
private static final int MAX_PATH_LENGTH = 100;
private static final int START_X = 1;
private static final int START_Y = 1;
private static final int GOAL_X = 1;
private static final int GOAL_Y = 6;
public static void main(String[] args) {
SimpleMap map = new SimpleMap();
AStarPathFinder pathFinder = new AStarPathFinder(map, MAX_PATH_LENGTH, false);
Path path = pathFinder.findPath(null, START_X, START_Y, GOAL_X, GOAL_Y);
int length = path.getLength();
System.out.println("Found path of length: " + length + ".");
for(int i = 0; i < length; i++) {
System.out.println("Move to: " + path.getX(i) + "," + path.getY(i) + ".");
}
}
}
class SimpleMap implements TileBasedMap {
private static final int WIDTH = 10;
private static final int HEIGHT = 10;
private static final int[][] MAP = {
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,1,1,1,1},
{1,0,1,1,1,0,1,1,1,1},
{1,0,1,1,1,0,0,0,1,1},
{1,0,0,0,1,1,1,0,1,1},
{1,1,1,0,1,1,1,0,0,0},
{1,0,1,0,0,0,0,0,1,0},
{1,0,1,1,1,1,1,1,1,0},
{1,0,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,1,1,0}
};
@Override
public boolean blocked(PathFindingContext ctx, int x, int y) {
return MAP[y][x] != 0;
}
@Override
public float getCost(PathFindingContext ctx, int x, int y) {
return 1.0f;
}
@Override
public int getHeightInTiles() {
return HEIGHT;
}
@Override
public int getWidthInTiles() {
return WIDTH;
}
@Override
public void pathFinderVisited(int x, int y) {}
}
在您的游戏中,您可能还希望让寻路角色类实现 Mover
接口(interface),以便您可以将其作为用户数据对象而不是 null
传递给findPath
调用。这将使该对象通过 ctx.getMover()
从 blocked
和 cost
方法可用。这样你就可以让一些移动器忽略一些,否则会阻挡,障碍物等。(想象一个飞行角色或两栖车辆可以在水中或在其他阻挡墙壁上方移动。)我希望这能给出一个基本的想法。
编辑我现在注意到您特别提到您正在使用 TiledMap
类。该类没有实现TileBasedMap
接口(interface),不能直接与Slick2D中的A-star实现一起使用。 (Tiled map 在默认情况下没有任何阻塞 的概念,这是执行路径查找时的关键。)因此,您必须自己实现这一点,使用您自己的标准来判断何时 tile 阻塞或不是以及遍历它们应该花费多少。
编辑 2
您可以通过多种方式定义 block 阻塞 的概念。下面介绍了一些相对直接的方法:
在平铺 map 格式中,您可以指定多个图层。您可以只为阻塞图 block 指定一层,然后根据如下内容实现 TileBasedMap
:
class LayerBasedMap implements TileBasedMap {
private TiledMap map;
private int blockingLayerId;
public LayerBasedMap(TiledMap map, int blockingLayerId) {
this.map = map;
this.blockingLayerId = blockingLayerId;
}
@Override
public boolean blocked(PathFindingContext ctx, int x, int y) {
return map.getTileId(x, y, blockingLayerId) != 0;
}
@Override
public float getCost(PathFindingContext ctx, int x, int y) {
return 1.0f;
}
@Override
public int getHeightInTiles() {
return map.getHeight();
}
@Override
public int getWidthInTiles() {
return map.getWidth();
}
@Override
public void pathFinderVisited(int arg0, int arg1) {}
}
在分块 map 格式中,每个分块类型都可以选择具有用户定义的属性。您可以轻松地将 blocking
属性添加到应该阻塞的图 block ,然后在您的 TileBasedMap
实现中检查它。例如:
class PropertyBasedMap implements TileBasedMap {
private TiledMap map;
private String blockingPropertyName;
public PropertyBasedMap(TiledMap map, String blockingPropertyName) {
this.map = map;
this.blockingPropertyName = blockingPropertyName;
}
@Override
public boolean blocked(PathFindingContext ctx, int x, int y) {
// NOTE: Using getTileProperty like this is slow. You should instead cache the results.
// For example, set up a HashSet<Integer> that contains all of the blocking tile ids.
return map.getTileProperty(map.getTileId(x, y, 0), blockingPropertyName, "false").equals("true");
}
@Override
public float getCost(PathFindingContext ctx, int x, int y) {
return 1.0f;
}
@Override
public int getHeightInTiles() {
return map.getHeight();
}
@Override
public int getWidthInTiles() {
return map.getWidth();
}
@Override
public void pathFinderVisited(int arg0, int arg1) {}
}
还有很多其他选择。例如,您可以为图层本身设置属性,而不是将图层 ID 设置为阻挡层,以指示它是否是阻挡层。
此外,上述所有示例都只考虑了阻塞与非阻塞tiles。当然,您在 map 上也可能有阻塞和非阻塞对象。您也可能有其他玩家或 NPC 等正在阻挡。所有这些都需要以某种方式处理。但是,这应该可以帮助您入门。
关于java - A* 寻路 - Java,Slick2D 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9742039/
粗略地说,单向数据绑定(bind)只是与 ng-model 绑定(bind)。当涉及 Controller 时,在页面内和 2-way 内。有人可以向我解释这个概念,以便我真正了解如何看待它吗?还有什
我想知道是否有任何替代 2 向 SSL 的方法。 2 向 SSL 是确保客户端和服务器可信通信的唯一选择吗?我有一个自签名证书供我的客户使用,我能否将自签名证书重新用于 2 种 SSL 方式,还是应该
如果是这样,你如何设置认证证书,你需要什么文件?是 .pfx 吗?您将如何在浏览器中安装它?一直试图通过浏览器测试 2 路 ssl。我有一个网络服务,尝试连接时总是返回认证身份验证失败。 最佳答案 扩
我希望能够对 XHTML 文档进行三向合并: 从文档的一些原始副本开始 一个用户编辑原始文档的副本 另一个用户编辑原始文档的单独副本 需要一个工具来合并(自动和/或可视化)两个用户所做的更改。 注意:
我有 4 张 table : ad (id, ...) website (id, title, URL, ...) space (id, website_id, ...) ad_space_count
我在 java 中有一个无状态服务,部署在 tomcat 网络服务器中,我还配置了 2 路 ssl 验证。到目前为止,一切正常。当我有一个新客户端时,我只需要将新客户端证书放入我的 trustore
我已经创建了一个带有证书的信任库和带有私钥的 keystore 。我已经放置了以下代码,加载了 trsustore 管理器和 keystore 管理器,然后创建了 SSL 上下文的实例。 每当我向网络
如果我在仅服务器身份验证中正确理解 SSL/TLS,握手后,服务器会向客户端发送它的公钥和由 CA 签名的数字签名证书。如果客户端有这个 CA 的公钥,它就可以解密证书并与服务器建立信任。如果它不信任
我有 Nginx,它使用双向 TLS 代理从客户端到 IBM DataPower 的请求。 从 Nginx 向 IBM DP 发送消息时出现错误:sll server (SERVER) ssl pee
我刚刚开始了一个项目,让我的雇主成为一个管理软件。我有一个琐碎但可能很简单的查询,我似乎找不到任何相关信息。 在对象之间建立“具有”关系的两种方式是否谨慎/良好做法。例如,Client 对象“有一个”
我在设置双向 SSL 身份验证时遇到问题。 我需要从 wso2 企业集成商访问 HTTPS 端点。 服务提供商给了我一个 pfx keystore ,其中包含我必须提供给服务器的证书和私钥。 我在我的
我正在为小型 PoC 构建 AWS Lambda 服务。 PoC 中的流程是: 通过 POST 获取(文本)输入, 执行小字符串操作 + 将操纵值存储到 DynamoDB 中,然后 通过 HTTP P
我的任务是在 Java 上下文中实现双向 TLS。我找到了一个示例 ( https://www.opencodez.com/java/implement-2-way-authentication-us
我正在尝试测试一个非常简单的双向 IM 应用程序。客户端在 android 上,服务器在我的 PC(java)上。我已经在 PC 到 PC 之间用 java 测试了这个应用程序,它工作正常。 但是在我
我有 java web 服务支持2-way ssl auth。所以我有客户端 keystore (client.p12),服务器证书在受信任的存储区中,服务器 keystore 中的客户端证书在受信任
通过 HTTPS 使用 Web 服务 我们有一个我们正在使用的网络服务。 Webservice 可以在 HTTP 和 HTTPS 协议(protocol)上运行。使用 HTTP 没问题,但如何使用 H
我在 Node.js 上有一个后端服务器,我正在尝试在 Nginx 和这个后端服务器之间设置 2 路 SSL。 但是我得到一个错误:2015/11/02 06:51:02 [错误] 12840#128
我一直在尝试连接到启用了 2 路 SSL 的服务端点。我正在使用 Spring resttemplate。我已将证书添加到 keystore 中,但出现以下错误: >org.springframewo
从 CherryPy 3.0 开始,只需指向服务器证书和私钥即可启用单向 SSL,如下所示: import cherrypy class HelloWorld(object): def ind
这个问题来自:MySQL Number of Days inside a DateRange, inside a month (Booking Table) 我有一个包含以下数据的表: CREATE
我是一名优秀的程序员,十分优秀!