(Libgdx) O tmx renderiza apenas 2 blocos na tela, todo resto fica preto

Eu to aprendendo a desenvolver um jogo feito supermario através de um tutorial no youtube (https://www.youtube.com/watch?v=P8jgD-V5jG8&t=43s), o codigo que o cara disponibiliza no github É FUNCIONAL AINDA HOJE, todavia é o codigo do jogo completo e eu ainda estou na aula 6, porque foi aqui que as coisas ficaram estranhas (como você pode ver pela imagem).

Eu ficaria muito agradecido se um de vocês programadores mais experientes pudessem me ajudar me dizendo aonde errei para estar renderizando apenas 2 blocos do mapa, obrigado por tentar ajudar.

A classe principal:
`

public class MarioBros extends Game {

public SpriteBatch batch;

 public static final int V_WIDTH = 400;

  public static final int V_HEIGHT = 208;

    @Override
public void create () {
	batch = new SpriteBatch();
	setScreen(new PlayScreen(this));
}

@Override
public void render () {
	super.render(); //Delega o metodo render para as SCREENS que estão ativas.
}

@Override
public void dispose () {
	batch.dispose();

 }
}

`
A classe da tela do jogo (Aqui que eu acho que está o erro!)

`

public class PlayScreen implements Screen {
private MarioBros game;
private OrthographicCamera gamecam;
private Viewport gamePort;
private HUD hud;

private TmxMapLoader maploader;
private TiledMap map;
private OrthogonalTiledMapRenderer renderer;


public PlayScreen(MarioBros game) {
    this.game = game;

    gamecam = new OrthographicCamera();
    gamecam.position.set(gamePort.getWorldWidth() / 2, gamePort.getWorldHeight() / 2, 0);
    gamePort = new FitViewport(MarioBros.V_WIDTH, MarioBros.V_HEIGHT, gamecam);
    gamePort.apply();

    hud = new HUD(game.batch);

    // Loading the map we made in Tile
    maploader = new TmxMapLoader();
    map = maploader.load("level1.tmx");
    renderer = new OrthogonalTiledMapRenderer(map);


}

@Override
public void show() {

}

public void handleInput(float dt) {
    if (Gdx.input.isTouched())
        gamecam.position.x += 100 * dt;

}

public void update(float dt) {
    handleInput(dt);

    gamecam.update();

}

@Override
public void render(float delta) {
    update(delta);

    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    renderer.render();
    game.batch.setProjectionMatrix(hud.stage.getCamera().combined);
    hud.stage.draw();
}

@Override
public void resize(int width, int height) {
    gamePort.update(width, height);
}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {
    renderer.dispose();
 }
}

`
A classe do hud (menu superior do jogo (score, nivel, etc)):

public class HUD implements Disposable{
public Stage stage;
private Viewport viewport; // Novo viewport
private Integer worldTimer;
private float timeCount;
private Integer score;

Label countdownLabel; // Label é equivalente ao widget, nessa biblioteca gdx
Label scoreLabel;
Label timeLabel;
Label levelLabel;
Label worldLabel;
Label marioLabel;

public HUD(SpriteBatch sb){
    worldTimer = 300;
    timeCount = 0;
    score = 0;

    viewport = new FitViewport(MarioBros.V_WIDTH, MarioBros.V_HEIGHT, new OrthographicCamera());
    stage = new Stage(viewport, sb); // Stage é um bloco que você insere coisas (inicialmente soltas dentro dele)

    Table table = new Table(); // Prender os itens em uma tabela
    table.top(); //  Coloca no topo do nosso stage
    table.setFillParent(true); //  largura do nosso stage

    countdownLabel = new Label(String.format("%03d", worldTimer), new Label.LabelStyle(new BitmapFont(), Color.WHITE));
    scoreLabel = new Label(String.format("%06d", score), new Label.LabelStyle(new BitmapFont(), Color.WHITE));
    timeLabel = new Label("TIME", new Label.LabelStyle(new BitmapFont(), Color.WHITE));
    levelLabel =new Label("1-1", new Label.LabelStyle(new BitmapFont(), Color.WHITE));
    worldLabel =new Label("WORLD", new Label.LabelStyle(new BitmapFont(), Color.WHITE));
    marioLabel =new Label("MARIO", new Label.LabelStyle(new BitmapFont(), Color.WHITE));

    //expandX vai expandir X ao maximo, por isso devemos por em todos para eles dividirem igualmente o eixo X.
    table.add(marioLabel).expandX().padTop(10);
    table.add(worldLabel).expandX().padTop(10);
    table.add(timeLabel).expandX().padTop(10);
    table.row();
    table.add(scoreLabel).expandX();
    table.add(levelLabel).expandX();
    table.add(countdownLabel).expandX();

    //inserir a table no estagio
    stage.addActor(table);

}

@Override
public void dispose() {
    stage.dispose();
 }
}

Obrigado por tomar seu tempo para tentar me ajudar, eu já perdi uma semana inteira tentando resolver isso =/ (triste)

Complicado ajudar sem seguir o tutorial do início. Tem como você disponibilizar seu projeto (zipado)?

Baixei o mapa “level1,tmx” aqui ele abre normalmente no Tiled, então realmente pode ser algo no seu código, ou memso alguma configuração que está faltando no carregamento ou na libgdx, ainda mais considerando que o vídeo é de 2015 e a libgdx teve mudanças nesse meio tempo.

Abraço.

Muito obrigado por se disponibilizar a me ajudar! Gostaria de estar aprendendo mais da biblioteca todavia estou preso nesse problema… Realmente o video é de 2015, mas o código que ele disponibilizou no github dele com o jogo completo está funcionando (já testei), já inclusive comparei as classes que ele possui no codigo dele com as classes do meu codigo e tirando funcionalidades que ele ainda vai ensinar nas futuras video aulas (colisão, inimigos, score, etc…), não há nada de diferente. Vou te enviar o arquivo, novamente muito obrigado por me ajudar nisso. (O site não me permite enviar arquivos porque sou usuario novo então segue o link do meu projeto no github: https://github.com/Renan3M/Mario )

Demorei pois não tinha Eclipse com Gradle aqui.

Na classe PlayScreen, no construtor, adicionei a seguinte linha no final:

renderer.setView(gamecam);

O resultado foi:

Inclusive tem essa linha lá no github do projeto do tal BrentAureli.

Provavelmente precisa ajustar a posição da câmera em alguma outra parte do código. Creio que ele faça isso dinamicamente em outro momento, de acordo com a posição do jogador.

Como comentei antes, pode ser alguma diferença na versão da biblioteca (mas a de câmera, nesse caso, não a que carrega o tmx). Funciona certo na versão final do projeto, mas nas etapas intermediárias não. Recomendo tentar completar o projeto pra ver se é isso mesmo ou tentar contatar o autor e ver se ele explica a diferença.

Abraço.

1 curtida

Muitíssimo obrigado amigo, eu sou novo nesses fóruns de informatica e me impressiona que você tenha se dado ao trabalho de baixar meu arquivo do código e comparar com o dele, apesar de ainda faltar muitas coisas para ajustar (por exemplo a tela era pra estar se movendo à direita com o click), o fato de o mapa ter sido renderizado na tela já foi uma enorme ajuda de sua parte, se tiver alguma coisa que eu possa fazer por você (apesar de ainda não possuir muita experiência na área) é só entrar em contato.

Muito obrigado,

Renan M.

Raramente faço isso, acho que estava entediado :smiley: . . Ajudou o fato de eu ter fuçado com libGDX durante um tempo.

Abraço e boa sorte aí.