Java LibGDX как проверить, стоит ли спрайт на определенной плитке, например, на двери?

#java #android #libgdx

#java #Android #libgdx

Вопрос:

Я хочу изменить карту (метод changeMapToWinter()), когда спрайт стоит на определенной плитке конкретной карты. У меня нет слоев на карте.

В настоящее время я делаю что-то подобное, если (sprite.getX()> 100 amp;amp; sprite.getX() < 200 amp;amp; sprite.getY()> 100 amp; amp; sprite.getY() <200) но, конечно, это работает только на одной карте и выглядит не слишком хорошо, и ядумаю, для этого есть лучшее решение.

     Texture img;
    TiledMap tiledMap;
    OrthographicCamera camera;
    TiledMapRenderer tiledMapRenderer;
    SpriteBatch sb;
    Texture texture;
    Sprite sprite;
    private ShapeRenderer shapeRenderer;
    private TiledMapTileLayer tileLayer;
    private TiledMap winterMap;


    @Override
    public void create() {
        float w = Gdx.graphics.getWidth();
        float h = Gdx.graphics.getHeight();
        camera = new OrthographicCamera();
        camera.setToOrtho(false, w, h);
        camera.update();
        tiledMap = new TmxMapLoader().load("untitled.tmx");
        winterMap = new TmxMapLoader().load("untitled2.tmx");
        tiledMapRenderer = new OrthogonalTiledMapRenderer(tiledMap);
        Gdx.input.setInputProcessor(this);
        sb = new SpriteBatch();
        texture = new Texture(Gdx.files.internal("bold_brown_blue-1.png"));
        sprite = new Sprite(texture);
    }

    void changeMapToWinter() {
        tiledMap.dispose();
        winterMap = new TmxMapLoader().load("untitled2.tmx");
        tiledMapRenderer = new OrthogonalTiledMapRenderer(winterMap);
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        camera.update();
        tiledMapRenderer.setView(camera);
        tiledMapRenderer.render();
        sb.begin();
        sb.draw(sprite, (int) (Gdx.app.getGraphics().getWidth() / 2) - (sprite.getWidth()), (int) (Gdx.app.getGraphics().getHeight() / 2) - (sprite.getHeight() / 2));
        sb.end();

        Vector3 click = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
        TiledMapTileLayer layer = (TiledMapTileLayer)tiledMap.getLayers().get(0);

        // WANT TO CHANGE IT
        if(sprite.getX() > 100 amp;amp; sprite.getX() < 200 amp;amp; sprite.getY() > 100 amp;amp; sprite.getY() < 200)
            changeMapToWinter();
    }
 

Комментарии:

1. Один из способов изменить этот код, чтобы иметь возможность использовать его более чем для одной карты, — добавить объект на свою карту и использовать положение этого объекта для координат вместо простого жесткого кодирования координат двери. В этом ответе объясняется, как вы можете получить объект с карты в LibGDX.

Ответ №1:

Решение, которое вы могли бы использовать, может быть примерно таким:

 Rectangle changePosition = new Rectangle(100,100,100,100);
if(sprite.getBoundingRectangle().overlaps(changePosition)) ...
 

Конструктор для прямоугольника имеет этот формат Rectangle(float x, float y, float width, float height) .

Также это будет вести себя немного иначе, чем ваш код, поскольку вы не учитывали размер спрайта, но этот код учитывает.

Кстати, у LibGDX есть полезный класс для подобных проблем, если вы не сможете найти подходящую функцию в классе Rectangle или любой другой форме, которую вы используете. Это называется Intersector .