Create GameMap object

This commit is contained in:
2021-01-30 21:40:49 +01:00
parent 18aeb06c4e
commit 4109ef653a
3 changed files with 78 additions and 22 deletions

View File

@@ -6,38 +6,47 @@ import com.bartlomiejpluta.samplegame.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.samplegame.core.ui.Window;
import com.bartlomiejpluta.samplegame.core.world.camera.Camera;
import com.bartlomiejpluta.samplegame.core.world.object.RenderableObject;
import lombok.RequiredArgsConstructor;
import com.bartlomiejpluta.samplegame.game.map.GameMap;
import lombok.AllArgsConstructor;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@RequiredArgsConstructor
@AllArgsConstructor
public class Scene implements Renderable {
private final Camera camera;
private final List<RenderableObject> objects = new ArrayList<>();
public Scene add(RenderableObject object) {
objects.add(object);
return this;
}
@Setter
private GameMap map;
@Override
public void render(Window window, ShaderManager shaderManager) {
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, camera.getProjectionMatrix(window));
shaderManager.setUniform(UniformName.UNI_VIEW_MATRIX, camera.getViewMatrix());
for(var object : objects) {
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, object.getModelMatrix());
shaderManager.setUniform(UniformName.UNI_OBJECT_COLOR, object.getMaterial().getColor());
shaderManager.setUniform(UniformName.UNI_HAS_OBJECT_TEXTURE, object.getMaterial().hasTexture());
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
renderArray(map.getLayer(0), window, shaderManager);
renderArray(map.getLayer(1), window, shaderManager);
object.render(window, shaderManager);
// The player will be here
renderArray(map.getLayer(2), window, shaderManager);
renderArray(map.getLayer(3), window, shaderManager);
}
private <T extends RenderableObject> void renderArray(T[] objects, Window window, ShaderManager shaderManager) {
for (var object : objects) {
if (object != null) {
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, object.getModelMatrix());
shaderManager.setUniform(UniformName.UNI_OBJECT_COLOR, object.getMaterial().getColor());
shaderManager.setUniform(UniformName.UNI_HAS_OBJECT_TEXTURE, object.getMaterial().hasTexture());
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
object.render(window, shaderManager);
}
}
}
@Override
public void cleanUp() {
objects.forEach(Renderable::cleanUp);
map.cleanUp();
}
}

View File

@@ -0,0 +1,47 @@
package com.bartlomiejpluta.samplegame.game.map;
import com.bartlomiejpluta.samplegame.game.tile.Tile;
import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;
public class GameMap {
private static final int LAYERS = 4;
private final Tile[][] map;
private final float scale;
@Getter
private final int rows;
@Getter
private final int cols;
public GameMap(int rows, int cols, float scale) {
this.rows = rows;
this.cols = cols;
this.scale = scale;
map = new Tile[LAYERS][rows * cols];
}
public void setTile(int layer, int row, int col, Tile tile) {
recalculateTileGeometry(tile, row, col);
map[layer][row * cols + col] = tile;
}
private void recalculateTileGeometry(Tile tile, int i, int j) {
tile.setScale(scale);
var size = tile.getSize();
var offset = size * scale;
tile.setPosition(i * offset, j * offset);
}
public Tile[] getLayer(int layer) {
return map[layer];
}
public void cleanUp() {
Arrays.stream(map).flatMap(Arrays::stream).filter(Objects::nonNull).forEach(Tile::cleanUp);
}
}

View File

@@ -41,12 +41,12 @@ public class Tile extends RenderableObject {
};
}
private static float[] getTextureCoordinates(int row, int col, int tileSize, int textureWidth, int textureHeight) {
private static float[] getTextureCoordinates(int col, int row, int tileSize, int textureWidth, int textureHeight) {
return new float[]{
(row * tileSize) / (float) textureWidth, (col * tileSize) / (float) textureHeight,
(row * tileSize) / (float) textureWidth, ((col + 1) * tileSize) / (float) textureHeight,
((row + 1) * tileSize) / (float) textureWidth, ((col + 1) * tileSize) / (float) textureHeight,
((row + 1) * tileSize) / (float) textureWidth, (col * tileSize) / (float) textureHeight
(col * tileSize) / (float) textureWidth, (row * tileSize) / (float) textureHeight,
(col * tileSize) / (float) textureWidth, ((row + 1) * tileSize) / (float) textureHeight,
((col + 1) * tileSize) / (float) textureWidth, ((row + 1) * tileSize) / (float) textureHeight,
((col + 1) * tileSize) / (float) textureWidth, (row * tileSize) / (float) textureHeight
};
}
}