2016-05-28 30 views
0

我一直在Youtube上跟随LibGDX教程,并遇到了将TiledMap渲染到我的屏幕的问题。此刻,我可以用我的HUD Java类使用LibGDX渲染地图位置的问题

public class HUD { 
public Stage stage; //the background 
private Viewport viewport; //so the HUD stays fixed and the world can move 
private int score; 
private int timer; 
private int bactoCount; 
private Texture foodTexture, antioBioBottle; 

//these are widgets 
Label antioBioTxt; 
Image antiBioImg; 
Label countDown; 
Label countTxt; 
Image foodImg; 
Label foodTxt; 
Label bactoCountLabel; 
Label bactoTxt; 
//these images need to be buttons... 


public HUD (SpriteBatch sb) { 
    foodTexture = new Texture("Bacto food.png"); 
    antioBioBottle = new Texture("Antibioticbottle.png"); 
    bactoCount = 0; 
    timer = 0; 
    viewport = new FitViewport(BactoBuds.V_WIDTH, BactoBuds.V_HEIGHT, new OrthographicCamera()); 

    stage = new Stage(viewport, sb); 
    //stage = new Stage(); 
    //use a Table to organise widgets on the stage 

    Table table = new Table(); 
    table.top(); 
    table.setFillParent(true); //the table is the size of our stage 

    antioBioTxt = new Label("Antibiotic", new Label.LabelStyle(new BitmapFont(), Color.WHITE)); 
    antiBioImg = new Image(antioBioBottle); 



    // %03d means its 3 digits long 
    //bitmap font sets the font to bit style 
    //string.format for changing from a string to a int 

    countDown = new Label(String.format("%03d", timer), new Label.LabelStyle(new BitmapFont(), Color.WHITE)); 
    countTxt = new Label("Time to flood:", new Label.LabelStyle(new BitmapFont(), Color.WHITE)); 

    foodImg = new Image(foodTexture); 
    foodTxt = new Label("Food", new Label.LabelStyle(new BitmapFont(), Color.WHITE)); 

    bactoCountLabel = new Label(String.format("%06d", bactoCount), new Label.LabelStyle(new BitmapFont(), Color.WHITE)); 
    bactoTxt = new Label("Bacteria:", new Label.LabelStyle(new BitmapFont(), Color.WHITE)); 

    //if multiple labels use expandX then they all share an equal portion of the screen 

    table.add(antioBioTxt).expandX().padTop(10); 
    table.add(foodTxt).expandX().padTop(10); 
    table.add(bactoTxt).expandX().padTop(10); 
    table.add(countTxt).expandX().padTop(10); 
    table.row(); 
    table.add(antiBioImg).expandX(); 
    table.add(foodImg).expandX(); 
    table.add(bactoCountLabel).expandX().align(Align.center); 
    table.add(countDown).expandX().align(Align.center); 

    stage.addActor(table); 


} 

}

这些精美呈现在屏幕上呈现一些标签/图像。但是,当我尝试渲染背景TMX地图图像时,它呈现在错误的位置。我一直在乱搞代码几天,试图改变地图位置的位置。在第一个例子中,我只能看到地图的一个小角落,现在我已经完成了整个渲染过程,但它只占用屏幕的1/4左右。现在我对如何进行感到不知​​所措。

public class playScreen implements Screen{ 
private BactoBuds game; 
private OrthographicCamera gamecamera; 
private Viewport gameView; 
private HUD HUD; 
private TmxMapLoader mapLoader; //loads map to screen 
private TiledMap map; //reference to map 
private OrthogonalTiledMapRenderer renderer; 




public playScreen (BactoBuds game) { 
    this.game = game; 



    gamecamera = new OrthographicCamera(); 
    gameView = new FitViewport(BactoBuds.V_WIDTH, BactoBuds.V_HEIGHT, gamecamera); 

    HUD = new HUD(game.batch); 

    mapLoader = new TmxMapLoader(); //make a new map loader, set map to maploader, then pass it to the renderer 
    map = mapLoader.load("grassy.tmx"); 
    renderer = new OrthogonalTiledMapRenderer(map); 


    gamecamera.setToOrtho(false); 
    gamecamera.position.set(gameView.getWorldWidth()/2, gameView.getWorldHeight()/2, 0); //this changes map position 
    renderer.setView(gamecamera); 

} 


@Override 
public void show() { 

} 



@Override 
public void render(float 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(); 


} 

请原谅不妥之处的编码,我很新,我还在学习最佳实践。我认为这与相机定位有关,但换出这些值并不会改变任何东西。

public class BactoBuds extends Game { 
public static final int V_WIDTH = 800; 
public static final int V_HEIGHT = 480; 
public static final String Title = "BactoBuds"; 
public SpriteBatch batch; //public to let other screens have access to images 
private Texture img; 
private Game game; 
private Screen screen; 
private OrthographicCamera camera; 

public BactoBuds() { 
    game = this; 

} 



@Override 
public void create() { 
    batch = new SpriteBatch(); 
    img = new Texture("badlogic.jpg"); 
    // change this to menuScreen later 
    setScreen(new playScreen(this)); 


} 

public void dispose() { 
    batch.dispose(); 
    img.dispose(); 
} 

@Override 
public void render() { 

    super.render(); 
} 

public void resume(){ 

} 

public void pause() { 

} 

}

感谢您的帮助!

+0

您的TiledMap有多大?如果你需要扩展。您可以在OrthogonalTiledMapRenderer构造函数中设置一个比例尺 –

+0

感谢您的回复。我最终将背景图像更改为纹理,但是如果我将代码更改回来,我一定会在缩放之前进行。我记得试图使用scaledViewPort或一些这样的无济于事。 设置“float unitScale”时,通常是写成类似2或2f的东西吗?还是在我使用它之前需要声明它? (对不起,对于noob问题) – Jediworm

回答

0

您需要在render方法中调用camera.update()。

+0

感谢您的回复!我尝试将gamecamera.update()添加到render方法,然后添加到playscreen java类中的playscreen方法。但是这并没有改变背景地图的位置。然后,我在我的主要BactoBuds java类中将camera.update()添加到render方法,但它只是使用“java.lang.NullPointerException”崩溃应用程序 – Jediworm

0

您是否试过移动相机?如果只有地图的1/4可见,则您的相机可能会以0,0为中心,而您的地图将该地图用作纹理的左下角原点。

尝试camera.position.set(BactoBuds.V_WIDTH/2,BactoBuds.V_HEIGHT/2,0);