LibGDX реализует прокручиваемый HexMap

В настоящее время я пытаюсь реализовать прокручиваемую hexmap с помощью LibGDX. Фреймворк имеет несколько хороших API-интерфейсов для карты, но они кажутся довольно бесполезными для того, что я хочу сделать:(

Пример вида карты, который я хотел бы. Розовый прямоугольник представляет область, фактически видимую на экране, в то время как все вокруг будет обрезано

HexMap

Это краткое изложение того, что моя карта должна уметь делать:

  1. Карта должна быть актером на экране, который можно просто нарисовать на сцене и сделать одноразовым. (Уже есть это)

  2. Карта должна быть прокручиваемой. Значит, клики и перетаскивания должны быть зарегистрированы.

  3. Отдельные фрагменты карты должны быть кликабельными. При нажатии на плитку, я хотел бы знать, что это за плитка. (Изменить: в настоящее время я могу регистрировать клики на актере, но мне нужно было бы вручную рассчитать, на какой плитке был фактически нажат. Есть ли лучший способ для этого?)

  4. Затем на карте необходимо знать, какая плитка отображается в верхнем левом или правом положении, чтобы определить, сколько плиток запрашивать у QuadTree и, в сущности, что рисовать на экране.

  5. Данные карты хранятся в квадродереве. В конце концов, есть метод, который мне придется вызывать с тем, какие плитки я хочу нарисовать, и Quadtree вернет мне тиледаты.

  6. И последнее, но не менее важное: плитки, которые выходят за границы карты, должны быть обрезаны (с меньшим приоритетом)

Сейчас. Вот что у меня сейчас есть:

http://pastebin.com/aqjSNPy3 (класс длиной 200 строк, не буду спамить здесь:))

Я уже могу нарисовать карту актера на экране. Это выглядит ужасно, но черт возьми. Не важно сейчас. Я думаю, что сейчас самое важное - зарегистрировать клики на плитках, выяснить, сколько плиток нужно отобразить / запросить и, возможно, сделать что-нибудь с камерой, чтобы сделать ее прокручиваемой?

У меня действительно немного ответов здесь. Помощь будет высоко оценена. Большое спасибо!

1 ответ

Хорошо, я пытаюсь помочь. Я в настоящее время работаю с нормальным OrthogonalTiledMapRenderer и я уверен, что вы могли бы получить хорошие очки в классе Render. Например, как проверить, видна ли плитка. Просто взгляните на репозиторий libgdx.

Вначале. dispose никогда не вызывается никак. Вы можете назвать это сами, если вам действительно не нужен ваш экран. Вы распределяете свои активы в нем, если используете его.

Итак, как получить обнаружение щелчка. Вы можете добавить слушателя к каждому актеру, например, так:

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 имеет другой функционал:

Обнаружение удара Метод удара Актера получает точку и возвращает самого глубокого актера в этой точке, или ноль, если ни один актер не был поражен. Вот метод попадания по умолчанию:

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 boolean указывает, должна ли учитываться сенсорность актера. Это позволяет обнаруживать попадания для целей, отличных от касания актеров, которые не касаются.

Когда на сцене вызывается попадание, вызывается попадание в корневую группу сцены, которая, в свою очередь, вызывает попадание на каждого ребенка. Первый найденный ненулевой актер возвращается как самый глубокий актер в иерархии, содержащей данную точку.

Отключение попадания Вам не нужно переопределять это. Это для стадии, чтобы простить прикосновение к Actors если я правильно понял


Так как же получить это scrollAble? Вам необходимо обнаружить события слайдов (как показано выше). Если есть такое событие, вам нужно переместить камеру или переместить вашу сцену / тайл-карту (по значению движения, возможно, даже при обнаружении слайда). Оба имеют одинаковый эффект. Например, вы можете изменить масштаб камеры по значению пинча.
Я перемещаю камеру в каждом цикле рендеринга, поэтому всегда центрирую моего персонажа:

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

Надеюсь, это немного поможет! Может быть, начать с Regulare Tilemap System, прежде чем начать с шестиугольника. Кажется, это немного сложнее. Но есть много учебных пособий, которые объясняют теорию и как начать создавать такую ​​систему. Даже для libgdx.

В общем, я бы сказал, что вам следует подождать с этим проектом, пока они не дадут нам Hextile API. Они работают над этим, но я уверен, что это займет некоторое время.

С уважением

Другие вопросы по тегам