【问题标题】:LibGdx Tiled Map Rendering IssueLibGdx 平铺地图渲染问题
【发布时间】:2016-06-04 11:34:28
【问题描述】:

我正在尝试学习一本书来学习 LibGDX 游戏引擎,但我在渲染平铺地图时遇到了问题。我想我用 book 写了相同的代码,但它不能得到相同的结果。

这是一个简单的游戏,有一个角色和一张地图。当我渲染我的角色和背景时,没有问题。

它看起来像这样;

http://i66.tinypic.com/nb97nq.png

但是在我添加我的 tmx 地图屏幕后,只显示了游戏的一部分,没有地图.. 我不知道如何解决这个问题。我真的很困惑。

enter link description here

那些是我的 GameManager 和 ScreenManager 类,也许你能弄清楚我做错了什么......

public class GameManager {

static TiledMap map;
public static TiledMapRenderer renderer;/////

//region paddle
static TextureRegion leftPaddleTexture;
static TextureRegion rightPaddleTexture;
static Sprite leftPaddleSprite;
static Sprite rightPaddleSprite;
public static final float PADDLE_RESIZE_FACTOR = 700f;
public static final float PADDLE_ALPHA = 0.25f;
public static final float PADDLE_HORIZ_POS_FACTOR = 0.02f;
public static final float PADDLE_VERT_POSITION_FACTOR = 0.01f;
//endregion

static AssetManager assetManager;
static TextureAtlas texturePack;

static Bob bob;

static TextureRegion bobSpriteSheet;

public static Sprite backgroundSprite;
public static Texture backgroundTexture;

public static final float BOB_RESIZE_FACTOR = 400f;

public static void loadAssets()
{
    assetManager.load(GameConstants.backgroundImage, Texture.class);
    assetManager.load(GameConstants.texturePack, TextureAtlas.class);


    assetManager.setLoader(TiledMap.class, new TmxMapLoader(new InternalFileHandleResolver()));


    assetManager.load(GameConstants.level1, TiledMap.class);


    assetManager.finishLoading();
}

public static void initialize(float width, float height)
{



    assetManager = new AssetManager();
    loadAssets();


    map = assetManager.get(GameConstants.level1);
    renderer = new OrthogonalTiledMapRenderer(map, GameConstants.unitScale);

    GameScreen.camera.setToOrtho(false, 35,20);
    GameScreen.camera.update();


    renderer.setView(GameScreen.camera);

    texturePack = assetManager.get(GameConstants.texturePack);

    initializeLeftPaddle(width,height);
    initializeRightPaddle(width, height);

    bob = new Bob();
    bobSpriteSheet = texturePack.findRegion(GameConstants.bobSpriteSheet);
    bob.initialize(width,height,bobSpriteSheet);


    bob.bobSprite = new Sprite(bobSpriteSheet);

    //set the size of the bob
    bob.bobSprite.setSize((walkSheet.getRegionWidth()/ANIMATION_FRAME_SIZE) * (width/BOB_RESIZE_FACTOR),
            walkSheet.getRegionHeight()*(width/BOB_RESIZE_FACTOR));

    bob.bobSprite.setPosition(width / 2f, 0);

    backgroundTexture =assetManager.get(GameConstants.backgroundImage);
    backgroundSprite = new Sprite(backgroundTexture);

    backgroundSprite.setSize(width, height);

}

public static void renderGame(SpriteBatch batch)
{
   backgroundSprite.draw(batch);
    bob.update();
    bob.render(batch);
    leftPaddleSprite.draw(batch);
    rightPaddleSprite.draw(batch);

}

public static void dispose()
{
    assetManager.unload(GameConstants.backgroundImage);
  assetManager.clear();
}

public static void initializeLeftPaddle(float width, float height)
{
    leftPaddleTexture = texturePack.findRegion(GameConstants.leftPaddleImage);
    leftPaddleSprite = new Sprite(leftPaddleTexture);

    leftPaddleSprite.setSize(leftPaddleSprite.getWidth()*width/PADDLE_RESIZE_FACTOR,
            leftPaddleSprite.getHeight()*width/PADDLE_RESIZE_FACTOR);

    leftPaddleSprite.setPosition(width * PADDLE_HORIZ_POS_FACTOR, height * PADDLE_VERT_POSITION_FACTOR);

    leftPaddleSprite.setAlpha(PADDLE_ALPHA);
}

public static void initializeRightPaddle(float width, float height)
{
    rightPaddleTexture = texturePack.findRegion(GameConstants.rightPaddleImage);
    rightPaddleSprite = new Sprite(rightPaddleTexture);

    rightPaddleSprite.setSize(rightPaddleSprite.getWidth()*width/PADDLE_RESIZE_FACTOR,
            rightPaddleSprite.getHeight()*width/PADDLE_RESIZE_FACTOR);

    rightPaddleSprite.setPosition(leftPaddleSprite.getX() + leftPaddleSprite.getWidth() + width * PADDLE_HORIZ_POS_FACTOR,
            height * PADDLE_VERT_POSITION_FACTOR);

    rightPaddleSprite.setAlpha(PADDLE_ALPHA);
}

}

public class GameScreen implements Screen {

MainGame game;
SpriteBatch batch;
public static OrthographicCamera camera;

public GameScreen(MainGame game)
{
    this.game = game;
    float height = Gdx.graphics.getHeight();
    float width = Gdx.graphics.getWidth();

    camera = new OrthographicCamera(width, height);
    camera.setToOrtho(false);

    batch = new SpriteBatch();

    GameManager.initialize(width, height);

    Gdx.input.setInputProcessor(new InputManager(camera));

}

@Override
public void show() {

}

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(1,1,1,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);


    batch.setProjectionMatrix(camera.combined);


    GameManager.renderer.render();


     batch.begin();
     GameManager.renderGame(batch);
     batch.end();





}

@Override
public void resize(int width, int height) {

}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

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

}

}

希望你能帮忙,我在网站上搜索过同样的问题,但我找不到......

【问题讨论】:

  • 如果您在此处没有得到有用的问题答案,请注意 Stack Exchange Network 有一个专门处理与游戏开发相关的问题的社区,即游戏开发,您可以在其中找到更多帮助。见:gamedev.stackexchange.com
  • 谢谢,我不知道。
  • 我看到的与我所做的不同的是,我在渲染调用中设置了平铺地图渲染器的视图,因此它在每个渲染周期都发生。还有一个样本github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/…
  • 我很确定它必须在渲染调用中,因为它使用相机的当前投影矩阵。因此,如果相机位置发生变化,您需要确保在平铺地图渲染器上再次设置它。
  • 我试过了,但结果是一样的..还是谢谢..

标签: java libgdx tiled


【解决方案1】:
static TiledMap map;

让我们在 GameConstants 类中定义地图文件的路径:

public static final String level1 = "data/maps/level1.tmx";

要将地图排队等待加载,请将这些代码行添加到 loadAssets() 方法 在finishedLoading() 方法调用之前的GameManager:

// set the tiled map loader for the assetmanager
assetManager.setLoader(TiledMap.class, new TmxMapLoader(new
InternalFileHandleResolver()));
//load the tiled map
assetManager.load(GameConstants.level1, TiledMap.class);
//blocking method to load all assets
assetManager.finishLoading();

现在,您可以将地图实例加载到 initialize() 方法中: 加载资产();

// get the map instance loaded
map = assetManager.get(GameConstants.level1);

要渲染地图,我们需要一个地图渲染器。当我们使用正交地图时, Tiled 包中的 OrthogonalTiledMapRenderer 适用于此 目的。在 GameManager 类中声明它的实例:

public static OrthogonalTiledMapRenderer renderer;
// map renderer

【讨论】:

    猜你喜欢
    • 2020-08-24
    • 2014-10-23
    • 2015-09-03
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2013-06-11
    • 1970-01-01
    相关资源
    最近更新 更多