我目前正在尝试使用LibGDX实现可滚动的hexmap。该框架有一些不错的地图apis,但它们似乎对我想做的事情毫无用处:(
我想要的地图视图示例。粉红色的矩形 表示屏幕上实际可见的区域 周围会被裁剪
这是我的地图需要做的基本概述:
地图需要是屏幕上可以简单绘制的Actor 在舞台上,是一次性的。 (已经有)
地图需要可滚动。意味着点击和拖动需要 注册
单个地图图块需要是可点击的。当瓷砖是 点击,我想知道它是什么瓷砖。 (编辑:我现在可以注册演员的点击,但我必须手动计算实际点击了什么牌。有更好的方法吗?)
然后,地图需要知道顶部显示的是哪个图块 左侧或右侧位置以确定要请求的图块数量 QuadTree以及基本上在屏幕上绘制的内容。
地图数据存储在四叉树中。最后有一种方法I. 我将不得不打电话给我想要绘制的瓷砖和四叉树 将把平面图归还给我。
最后但并非最不重要的是:到达地图边界之外的瓷砖 应裁剪(优先级较低)
现在。这就是我目前所拥有的:
http://pastebin.com/aqjSNPy3(课程长200行,不会在这里垃圾邮件:) :)
我已经可以在屏幕上绘制地图actor了。它看起来很丑陋但是到底是什么。现在不重要了。 我认为现在最重要的事情是在瓷砖上注册点击,找出要显示/请求的瓷砖数量,并且可以用相机做些什么来使其可滚动?
我真的很不满意。帮助将受到高度赞赏。 非常感谢!
答案 0 :(得分:0)
好的,我想帮忙。我目前使用普通OrthogonalTiledMapRenderer
,我相信你可以在Render课上获得一些好处。例如,如何检查图块是否可见。只需看看libgdx的存储库。
首先。永远不会以任何方式调用dispose
。如果你真的不再需要你的屏幕,你可以自己调用它。如果您使用它,您可以将资产存入其中。
那么如何进行点击检测。您可以将侦听器添加到每个Actor,例如:
actor.addListener(new InputListener() {
public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
System.out.println("down");
return true;
}
public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
System.out.println("up");
}
})
您可以像这样添加更多听众。例如,ActorGestureListener()
来删除捏等等。
确保使用cam.unproject
权限,以便正确触发touchevents。
资源:libgdx/wiki/scene2d#Inputlistener
您当前的方法hit
还有其他功能:
命中检测 Actor命中方法接收一个点并返回最深的actor 那一点,如果没有玩家被击中,则为null。这是默认命中 方法:
public Actor hit (float x, float y, boolean touchable) {
if (touchable && getTouchable() != Touchable.enabled) return null;
return x >= 0 && x < width && y >= 0 && y < height ? this : null; }
坐标在actor的坐标系中给出。这个 如果该点在actor的边界内,则简单地返回actor。 可以使用更复杂的检查,例如,如果演员是圆的。 可触摸的布尔参数指示演员的可触摸性 应该受到尊重。这使得命中检测能够用于其他目的 而不是触及那些不可触摸的演员。
在舞台上调用hit时,会在舞台的根目录上调用hit 小组,反过来打电话给每个孩子。第一个非null演员 找到的结果是作为演员在包含的层次结构中最深处返回的 给定点。
Hit detaction
您不需要覆盖它。如果我做对了,它可以让Actors
触及一个阶段。
那么如何让它滚动?您需要检测幻灯片事件(如上所示)。如果出现此类事件,您需要移动相机或移动舞台/平铺图(即使在检测到幻灯片时也可以通过移动的值)。两者都有相同的效果。例如,在捏合时,您可以通过捏合值更改相机的变焦。
我会在每个渲染周期中移动相机,因此始终以我的角色为中心:
this.gameCam.position.x = this.character.getX()
+ this.character.sprite.getWidth() / 2;
this.gameCam.position.y = this.character.getY()
+ this.character.sprite.getHeight() / 2;
另外仔细看看这个存储库!这是一款来自游戏的Hexmap:
Hexmap为这场比赛做准备:
Mathematiles,Libgdx Post发现{{3}}
我希望这能有所帮助!也许从一个规则的Tilemap系统开始,因为你从六角形开始。这似乎有点难。但是有很多教程可以解释理论以及如何开始创建这样的系统。即使对于libgdx。
通常我会说你应该等到那个项目,直到他们给我们Hextile API。他们正在努力,但确实需要一些时间。
此致