LibGDX实现可滚动的HexMap

时间:2013-04-26 20:23:46

标签: java libgdx hexagonal-tiles

我目前正在尝试使用LibGDX实现可滚动的hexmap。该框架有一些不错的地图apis,但它们似乎对我想做的事情毫无用处:(

  

我想要的地图视图示例。粉红色的矩形   表示屏幕上实际可见的区域   周围会被裁剪

HexMap

这是我的地图需要做的基本概述:

  1. 地图需要是屏幕上可以简单绘制的Actor 在舞台上,是一次性的。 (已经有)

  2. 地图需要可滚动。意味着点击和拖动需要 注册

  3. 单个地图图块需要是可点击的。当瓷砖是 点击,我想知道它是什么瓷砖。 (编辑:我现在可以注册演员的点击,但我必须手动计算实际点击了什么牌。有更好的方法吗?)

  4. 然后,地图需要知道顶部显示的是哪个图块 左侧或右侧位置以确定要请求的图块数量 QuadTree以及基本上在屏幕上绘制的内容。

  5. 地图数据存储在四叉树中。最后有一种方法I. 我将不得不打电话给我想要绘制的瓷砖和四叉树 将把平面图归还给我。

  6. 最后但并非最不重要的是:到达地图边界之外的瓷砖 应裁剪(优先级较低)

  7. 现在。这就是我目前所拥有的:

    http://pastebin.com/aqjSNPy3(课程长200行,不会在这里垃圾邮件:) :)

    我已经可以在屏幕上绘制地图actor了。它看起来很丑陋但是到底是什么。现在不重要了。 我认为现在最重要的事情是在瓷砖上注册点击,找出要显示/请求的瓷砖数量,并且可以用相机做些什么来使其可滚动?

    我真的很不满意。帮助将受到高度赞赏。 非常感谢!

1 个答案:

答案 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为这场比赛做准备: MathematilesLibgdx Post发现{{3}} 我希望这能有所帮助!也许从一个规则的Tilemap系统开始,因为你从六角形开始。这似乎有点难。但是有很多教程可以解释理论以及如何开始创建这样的系统。即使对于libgdx。

通常我会说你应该等到那个项目,直到他们给我们Hextile API。他们正在努力,但确实需要一些时间。

此致