2

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

我想要的地图视图示例。粉色矩形代表屏幕上实际可见的区域,而周围的一切都将被裁剪

十六进制图

这是我的地图需要能够做什么的基本概要:

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

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

  3. 各个地图图块必须是可点击的。单击一个图块时,我想知道它是什么图块。(编辑:我目前可以注册演员的点击,但我必须手动计算实际点击的图块。有没有更好的方法?)

  4. 然后,地图需要知道左上角或右上角显示的是什么图块,以确定从四叉树请求多少图块,以及在屏幕上绘制什么。

  5. 地图数据存储在四叉树中。最后,我必须使用我要绘制的图块调用一个方法,然后四叉树会将图块数据返回给我。

  6. 最后但并非最不重要的一点:应该裁剪超出地图边界的图块(优先级较低)

现在。这是我目前拥有的:

http://pastebin.com/aqjSNPy3(这个类有 200 行长,不会在这里发送垃圾邮件:))

我已经可以在屏幕上绘制地图演员了。它看起来很丑陋,但到底是什么。现在不重要了。我认为现在最重要的事情是注册对图块的点击,弄清楚要显示/请求多少图块,也许用相机做点什么让它可以滚动?

我真的有点没有答案。帮助将不胜感激。非常感谢!

4

1 回答 1

0

好的,我正在尝试提供帮助。我目前与普通人一起工作,OrthogonalTiledMapRenderer我相信您可以在 Render 课程中获得一些好成绩。例如,您如何检查图块是否可见。只需看一下 libgdx 的存储库。

首先。永远不会以dispose任何方式调用。如果您真的不再需要您的屏幕,您可以自己调用它。如果您使用它,您就可以在其中处置您的资产。

那么如何获得点击检测。您可以将 Listener 添加到每个 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正确的,以便正确触发触摸事件。

资源:libgdx/wiki/scene2d#Inputlistener

您当前hit的方法还有其他功能:

命中检测 Actor 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; }

坐标在演员的坐标系中给出。如果该点在演员的边界内,这只是返回演员。可以使用更复杂的检查,例如,如果演员是圆形的。touchable 布尔参数指示是否应该尊重演员的可触摸性。这可以实现命中检测,而不是触摸不可触摸的演员。

当在舞台上调用 hit 时,在舞台的根组上调用 hit,这反过来又在每个子节点上调用 hit。找到的第一个非空角色作为包含给定点的层次结构中最深的角色返回。

命中检测 您不需要覆盖它。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
引用了这个游戏: Mathematics并在Libgdx Post

中找到 我希望这会有所帮助!也许从一个常规的 Tilemap System 开始,然后再从六边形开始。好像难度有点大。但是有很多教程解释了理论以及如何开始创建这样的系统。即使对于 libgdx。

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

问候

于 2013-04-27T10:43:31.637 回答