#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 .