Jak zaimplementować generowane proceduralnie kafelki w libgdx?


11

Tworzę prostą grę typu Zelda-esque z góry na dół w libgdx i chcę wdrożyć lochy oparte na kafelkach, które są generowane proceduralnie, podobnie do tego.

Libgdx ma klasę o nazwie TiledMap, która wydaje się pasować do moich potrzeb, jednak dokumentacja poza oficjalnymi dokumentami sugeruje, że TiledMaps można używać tylko w połączeniu z plikami .tmx lub innymi słowy, wstępnie zaprojektowanymi mapami. Zrobiłem sporo Google'a bezskutecznie, więc pytam tutaj w ostateczności, mając nadzieję, że ktoś ma doświadczenie w używaniu libgdx do dynamicznie generowanych map kafelków.

edycja: Czy mogę użyć StaticTiledMapTiles w połączeniu z samouczkiem, do którego dowiązałem powyżej, aby osiągnąć swój cel?

Dzięki!


Czy nie możesz zapisać danych wygenerowanych map do pliku .tmx i użyć ich w LibGdx?
Suszy

To interesujące. Myślę, że mógłbym, chociaż wydaje mi się, że nie byłoby to idealne rozwiązanie do szybkiego generowania.
camden

Odpowiedzi:


7

Możesz tworzyć kafelkowe mapy bez używania .tmx.

TiledMap map = new TileMap();
MapLayers layers = map.getLayers();

TiledMapTileLayer layer1 = new TiledMapTileLayer(width, height, tile_width, tile_height);
Cell cell = new Cell();

cell.setTile(new StaticTiledMapTile(texture_region));
layer1.setCell(x, y, cell);

layers.addLayer(layer1);

Each of these classes are in the docs for libgdx.

1
To daje mi pomysł. W trakcie poszukiwań znalazłem ten przykładowy kod do dynamicznego generowania mapy tilemap bez potrzeby korzystania z .tmxpliku z libgdx github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/… . Dzięki.
haxpor

1

Opierając się na radach / r / gamedev , postanowiłem zrezygnować z korzystania z wbudowanych klas libgdx itp. I po prostu zbudować własne.

Mogę wprowadzić bardziej szczegółowe informacje na żądanie, ale w zasadzie oto co zrobiłem.

1: Wygeneruj loch używając algorytmu, z którym pierwotnie się połączyłem, i przechowuj współrzędne kafelków (nie współrzędne pikseli), używając Coordinateklasy, którą wykonałem w HashMap<Coord, MapTile>. MapTileto tylko klasa, która ma dane o typie kafelka.

2: W draw()funkcji mojej głównej klasy dodałem następujący kod

ConcurrentHashMap<Coord, MapTile> dungeonMap = dungeonGen.getMap();
        for(Entry<Coord, MapTile> entry : dungeonMap.entrySet()){
            Coord coord = entry.getKey();
            MapTile tile = entry.getValue();

            if((inCameraFrustum(coord.getX() * tileSize, coord.getY() * tileSize, 100))){
                game.batch.draw(dungeonGen.getTileTexture(tile),
                        coord.getX() * tileSize, coord.getY() * tileSize);
            }

        }

Które iteruje się w każdym Coordinatemiejscu dungeonMapi rysuje kafelek (jeśli współrzędna znajduje się w frustum kamery) z globalnym tileSizeprzesunięciem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.