(libgdx) Почему мой спрайт выглядит таким большим? - PullRequest
0 голосов
/ 12 октября 2019

В настоящее время я пытаюсь изучить игровой движок LibGDX для Java. Я использую мозаичную карту, каждая из которых имеет размер 32 * 32 пикселя. У меня также есть спрайт персонажа размером 48 * 64. В моей игре я определяю один юнит как одну плитку на карте. По какой-то причине моя карта отображается правильно, но спрайт игрока отображается ненормально большим вместо ожидаемого размера примерно в 2 квадратных единицы.

Я пытался найти похожие проблемы в Интернете, но ничего не могу найтитак же, как моя проблема. Я знаю, что это как-то связано с масштабированием, которое я использую, но я не знаю хорошего способа решить это.

Конечно, можно просто уменьшить спрайт игрока при его рисовании с помощью функции batch.draw (), но мне кажется, что в этом нет необходимости.

@ Переопределить publicvoid create () {

    world = new World(new Vector2(0, -20), true); //Create Box2d world
    debugRenderer = new Box2DDebugRenderer();

    player1 = new Player();

    camera = new OrthographicCamera(WORLD_WIDTH, WORLD_HEIGHT); //Create the camera I'm using, with width = height = 20

    map = new TmxMapLoader().load("maps/Maptest.tmx"); //Load a map created in Tiled
    this.mapObjects = map.getLayers().get(0).getObjects();
    ObjectMapper.createShapes(this.mapObjects, this.world); //Load shapes from map for collision management
    ObjectMapper.setSpawn(player1, mapObjects, world); //Set spawnpoint from object in the Tiled map

    batch = new SpriteBatch();
    renderer = new OrthogonalTiledMapRenderer(map, 1/PPT); //Create a tiled map renderer with unit scale 1/32


    camera.update();
}



@Override
public void render () {
    player1.update(); //Update player position

    camera.position.set(player1.getX(), player1.getY(), 0); //Set position to players position
    camera.update();



    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    renderer.setView(camera); //Set renderer's view to camera view
    renderer.render();
    camera.update();
    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    batch.draw(player1.getSprite(), player1.getX()-player1.getSprite().getWidth()/2, player1.getY()-player1.getSprite().getHeight()/2); //Draw player sprite
    batch.end();
    System.out.println(player1.getX() + " " + player1.getY());
    world.step(1/60f, 6, 2); //Iterate one step with Box2d world
    debugRenderer.render(world, camera.combined); //Draw shapes

    long javaHeap = Gdx.app.getJavaHeap();
    long nativeHeap = Gdx.app.getNativeHeap();
}


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

    camera.viewportWidth = WORLD_WIDTH;                 // 20 units
    camera.viewportHeight = (float)WORLD_HEIGHT*height/width;
    camera.update();

}

Я ожидаю, что спрайт будет примерно того же размера, что и хитбокс игрока (круговая форма), радиус которого равен единице. Вместо этого он становится очень большим:

https://i.gyazo.com/6d814d10cd5f9bec322b601d538cb9ee.png

В то время как полный спрайт выглядит так:

https://i.gyazo.com/03178769d4a3b4beaba1612c76d37386.png

Заранее спасибо :)

1 Ответ

0 голосов
/ 12 октября 2019

Я бы вообще не использовал класс Sprite. В LibGDX он был создан как высокооптимизированный объект, но он связывает актив (TextureRegion) с объектом игровой модели (положение, размер и т. Д.) И нарушает композицию по руководству наследования. Это также вызывает много вопросов здесь о StackOverflow, потому что люди не понимают, что он наследуется от TextureRegion, но не предназначен для отрисовки путем передачи его в SpriteBatch (он не должен рассматриваться как TextureRegion). Чтобы нарисовать правильно, вы должны позвонить sprite.draw(batch), а не batch.draw(sprite, ...).

У вас уже есть класс Player. Он должен просто ссылаться на TextureRegion вместо Sprite. Вы можете задать классу Player свой размер и позицию (размер, который вы действительно хотите, чтобы он был).

...