Como eu implementaria blocos gerados proceduralmente no libgdx?


10

Estou criando um simples jogo Zelda-esque de cima para baixo no libgdx e quero implementar masmorras baseadas em blocos que são geradas proceduralmente, semelhante a isso.

O Libgdx possui uma classe chamada TiledMap que parece atender às minhas necessidades, mas a documentação fora dos documentos oficiais sugere que o TiledMaps pode ser usado apenas em conjunto com arquivos .tmx ou, por outras palavras, mapas pré-projetados. Eu fiz uma boa quantidade de pesquisas no Google sem sucesso, então estou perguntando aqui como último recurso, esperando que alguém tenha experiência com o libgdx para mapas de blocos gerados dinamicamente.

editar: Eu poderia usar StaticTiledMapTiles em conjunto com o tutorial ao qual vinculei acima para alcançar meu objetivo?

Obrigado!


Você não pode gravar os dados dos mapas gerados em um arquivo .tmx e usá-los no LibGdx?
Seca

Isso é interessante. Suponho que sim, apesar de achar que isso não seria o ideal para uma geração rápida.
camden

Respostas:


5

Você pode criar mapas lado a lado sem usar .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.

Isso me deu uma ideia. No momento da pesquisa, encontrei esses exemplos de código para gerar dinamicamente o tilemap sem a necessidade de .tmxarquivo em libgdx github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/… . Obrigado.
haxpor

1

Com base nos conselhos de / r / gamedev , decidi renunciar ao uso das classes internas do TiledMap etc. da libgdx e apenas criar as minhas.

Posso entrar em mais detalhes, se solicitado, mas aqui está o que eu fiz, essencialmente.

1: Gere uma masmorra usando o algoritmo ao qual originalmente vinculei e armazene as coordenadas do bloco (não as cordas de pixel) usando uma Coordinateclasse que fiz em a HashMap<Coord, MapTile>. MapTileé apenas uma classe que possui dados sobre o tipo de bloco.

2: Na draw()função da minha classe principal, adicionei o seguinte código

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);
            }

        }

Que itera sobre todos Coordinateos elementos dungeonMape desenha o bloco (se a coordenada estiver no perfil da câmera) com um tileSizedeslocamento global .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.