Create GameMap object
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
47
app/src/main/java/com/bartlomiejpluta/samplegame/game/map/GameMap.java
Executable file
47
app/src/main/java/com/bartlomiejpluta/samplegame/game/map/GameMap.java
Executable 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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user