Работать с плитками в сетке с промежутками между ними сложнее, чем кажется.
Во-первых, есть вещи, которые нужно решить. Размер всей доски определяется размером отдельной плитки, или размер плитки зависит от размера доски?
- Плитка не должна расширяться Box, плитка может быть лучше представлена прямоугольником, Box жить в трех измерениях, плитка не.
Плитка должна расширяться com.badlogic.gdx.math.Rectangle.
2. Я предполагаю, что Tiles.WIDTH
и Tiles.HEIGHT
указывают размер доски.
TILE_SIZE не равно Tiles.WIDTH / tiles[0].length
, не может, потому что доска больше из-за промежутков между тайлами.
@Override
public void show() {
Gdx.input.setInputProcessor(this);
camera = new OrthographicCamera();
batch = new SpriteBatch();
tiles = new Tile[5][5];
float gapSize = 10f;
TILE_SIZE = ((Tiles.WIDTH - ((tiles[0].length-1) * gapSize ))) / tiles[0].length;
boardOffset = 2;
camera.viewportHeight = Tiles.HEIGHT + boardOffset;
camera.viewportWidth = Tiles.WIDTH + boardOffset;
camera.position.x = Tiles.WIDTH/2;
camera.position.y = Tiles.HEIGHT/2;
camera.update();
//Create the tiles
for (int row = 0; row < tiles.length; row++) {
for (int col = 0; col < tiles[0].length; col++) {
tiles[row][col] = new Tile(col * (TILE_SIZE + gapSize), row * (TILE_SIZE + gapSize) + boardOffset , TILE_SIZE, TILE_SIZE);
}
}
Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 0);
}
Я переместил Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 0);
в метод show, потому что я не вижу причины устанавливать один и тот же цвет в каждом кадре.
Также не забудьте camera.update()
, если вы манипулировали его компонентами. Просто сделайте все манипуляции, а затем обновите перед использованием.
3. Я изменил класс плитки
public class Tile extends Rectangle {
private TextureRegion lit;
private TextureRegion dark;
private boolean selected;
public Tile(float x, float y, float width, float height) {
this.x = x;
this.y = y;
this.width = width ;
this.height = height;
lit = Tiles.getLit();
dark = Tiles.getDark();
// set bounds of Sprite
}
public void setSelected(boolean b) {
selected = b;
}
public boolean getSelected() {
return selected;
}
public void render(Batch batch, float delta) {
if (selected) {
batch.draw(lit, x, y , width, height);
}
else {
batch.draw(dark, x, y , width, height);
}
}
}
Размер и положение плитки представлены прямоугольником, поэтому нарисуйте ее в том же месте и в том же размере, что и прямоугольник.
То же самое здесь:
public Tile(float x, float y, float width, float height) {
this.x = x;
this.y = y;
this.width = width ;
this.height = height;
lit = Tiles.res.getAtlas("pack").findRegion("lit");
dark = Tiles.res.getAtlas("pack").findRegion("dark");
// set bounds of Sprite
}
Не изменять данные.
4. Я также изменил ввод
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
if (pointer < 2) {
mouse.x = screenX;
mouse.y = screenY;
camera.unproject(mouse);
if (mouse.x > 0 && mouse.x < Tiles.WIDTH && mouse.y >= boardOffset && mouse.y < boardOffset + Tiles.HEIGHT) {
for (int r = 0; r < tiles.length; r++) {
for (int c = 0; c < tiles.length; c++) {
if (tiles[r][c].contains(mouse.x, mouse.y)) {
tiles[r][c].setSelected(true);
}
}
}
}
}
return false;
}
Я проверяю каждый прямоугольник каждой плитки, чтобы точка приземления была внутри прямоугольника.
Может быть, более быстрый метод, но компьютер быстр в эти дни.
Также ваша мышь vector3 может быть финальной.