Refactor world-related objects | move them to :game module

This commit is contained in:
2021-02-16 18:05:27 +01:00
parent 7e89bedffc
commit a40ec1f45a
28 changed files with 222 additions and 210 deletions

View File

@@ -21,34 +21,32 @@ public class Mesh implements Renderable, Disposable {
private final int elementsCount;
public Mesh(float[] vertices, float[] texCoords, int[] elements) {
try(var stack = MemoryStack.stackPush()) {
elementsCount = elements.length;
var verticesBuffer = stack.mallocFloat(vertices.length);
var texCoordsBuffer = stack.mallocFloat(texCoords.length);
var elementsBuffer = stack.mallocInt(elementsCount);
verticesBuffer.put(vertices).flip();
texCoordsBuffer.put(texCoords).flip();
elementsBuffer.put(elements).flip();
elementsCount = elements.length;
var vboId = 0;
try(var stack = MemoryStack.stackPush()) {
vaoId = glGenVertexArrays();
glBindVertexArray(vaoId);
int vboId = glGenBuffers();
vboIds.add(vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW);
glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, 0);
// Vertices VBO
vboId = glGenBuffers();
vboIds.add(vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, texCoordsBuffer, GL_STATIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, stack.mallocFloat(vertices.length).put(vertices).flip(), GL_STATIC_DRAW);
glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, 0);
// Texture Coordinates VBO
vboId = glGenBuffers();
vboIds.add(vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, stack.mallocFloat(texCoords.length).put(texCoords).flip(), GL_STATIC_DRAW);
glVertexAttribPointer(1, 2, GL_FLOAT, false, 0, 0);
// Elements VBO
vboId = glGenBuffers();
vboIds.add(vboId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementsBuffer, GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, stack.mallocInt(elementsCount).put(elements).flip(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
@@ -58,17 +56,23 @@ public class Mesh implements Renderable, Disposable {
@Override
public void render(Window window, Camera camera, ShaderManager shaderManager) {
glBindVertexArray(vaoId);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glDrawElements(GL_TRIANGLES, elementsCount, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindVertexArray(0);
}
@Override
public void dispose() {
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

View File

@@ -3,10 +3,10 @@ package com.bartlomiejpluta.base.core.world.camera;
import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.object.PositionableObject;
import com.bartlomiejpluta.base.core.world.object.Model;
import org.joml.Matrix4f;
public class Camera extends PositionableObject {
public class Camera extends Model {
private final Matrix4f projectionMatrix = new Matrix4f();
private final Matrix4f viewMatrix = new Matrix4f();

View File

@@ -1,49 +0,0 @@
package com.bartlomiejpluta.base.core.world.movement;
import lombok.AccessLevel;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.joml.Vector2i;
@Data
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
public class Movement {
private final MovableObject object;
private final Direction direction;
private boolean performed = false;
public boolean perform() {
performed = object.move(direction);
return performed;
}
public Vector2i getSourceCoordinate() {
return new Vector2i(object.getCoordinates());
}
public Vector2i getTargetCoordinate() {
return direction.asIntVector().add(object.getCoordinates());
}
public Movement getAnother() {
return object.prepareMovement(direction);
}
}
//@Data
//public class Movement {
// private final MovableObject object;
// private final Direction direction;
// private final Vector2i source;
// private final Vector2i target;
//
// Movement(MovableObject object, Direction direction) {
// this.object = object;
// this.direction = direction;
// this.source = new Vector2i(object.getCoordinates());
// this.target = direction.asIntVector().add(source);
// }
//
// public boolean perform() {
// return object.move(direction);
// }
//}

View File

@@ -9,7 +9,7 @@ import org.joml.Vector2f;
import static java.lang.Math.toRadians;
@EqualsAndHashCode
public abstract class PositionableObject {
public abstract class Model {
private final Matrix4f modelMatrix = new Matrix4f();
@Getter
@@ -27,42 +27,42 @@ public abstract class PositionableObject {
@Setter
protected float scaleY = 1.0f;
public PositionableObject setPosition(float x, float y) {
public Model setPosition(float x, float y) {
position.x = x;
position.y = y;
return this;
}
public PositionableObject setPosition(Vector2f position) {
public Model setPosition(Vector2f position) {
this.position.x = position.x;
this.position.y = position.y;
return this;
}
public PositionableObject movePosition(float x, float y) {
public Model movePosition(float x, float y) {
position.x += x;
position.y += y;
return this;
}
public PositionableObject movePosition(Vector2f position) {
public Model movePosition(Vector2f position) {
this.position.x += position.x;
this.position.y += position.y;
return this;
}
public PositionableObject moveRotation(float rotation) {
public Model moveRotation(float rotation) {
this.rotation += rotation;
return this;
}
public PositionableObject setScale(float scale) {
public Model setScale(float scale) {
this.scaleX = scale;
this.scaleY = scale;
return this;
}
public PositionableObject setScale(float scaleX, float scaleY) {
public Model setScale(float scaleX, float scaleY) {
this.scaleX = scaleX;
this.scaleY = scaleY;
return this;

View File

@@ -14,7 +14,8 @@ import lombok.Setter;
@RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true)
public abstract class RenderableObject extends PositionableObject implements Renderable {
public abstract class Sprite extends Model implements Renderable {
@NonNull
protected final Mesh mesh;

View File

@@ -1,18 +0,0 @@
package com.bartlomiejpluta.base.core.world.tileset.model;
import com.bartlomiejpluta.base.core.gl.object.material.Material;
import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.world.object.RenderableObject;
import lombok.Getter;
@Getter
public class Tile extends RenderableObject {
private final int width;
private final int height;
Tile(Mesh mesh, Material material, int width, int height) {
super(mesh, material);
this.width = width;
this.height = height;
}
}

View File

@@ -1,38 +0,0 @@
package com.bartlomiejpluta.base.core.world.tileset.model;
import com.bartlomiejpluta.base.core.gl.object.material.Material;
import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.gl.object.texture.Texture;
import lombok.Getter;
public class TileSet {
private final Texture texture;
private final int rows;
private final int columns;
private final float columnStep;
private final float rowStep;
private final Mesh mesh;
@Getter
private final int tileWidth;
@Getter
private final int tileHeight;
public TileSet(Mesh mesh, Texture texture, int rows, int columns, int tileWidth, int tileHeight) {
this.texture = texture;
this.rows = rows;
this.columns = columns;
this.columnStep = 1/(float) columns;
this.rowStep = 1/(float) rows;
this.tileWidth = tileWidth;
this.tileHeight = tileHeight;
this.mesh = mesh;
}
public Tile getTile(int row, int column) {
var material = Material.textured(texture);
material.setSpritePosition(column * columnStep, row * rowStep);
return new Tile(mesh, material, tileWidth, tileHeight);
}
}

View File

@@ -1,9 +1,10 @@
package com.bartlomiejpluta.base.core.image;
package com.bartlomiejpluta.base.game.image.manager;
import com.bartlomiejpluta.base.core.gl.object.material.Material;
import com.bartlomiejpluta.base.core.gl.object.texture.TextureManager;
import com.bartlomiejpluta.base.core.util.math.MathUtil;
import com.bartlomiejpluta.base.core.util.mesh.MeshManager;
import com.bartlomiejpluta.base.game.image.model.Image;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -1,6 +1,7 @@
package com.bartlomiejpluta.base.core.image;
package com.bartlomiejpluta.base.game.image.manager;
import com.bartlomiejpluta.base.core.gc.Cleanable;
import com.bartlomiejpluta.base.game.image.model.Image;
public interface ImageManager extends Cleanable {
Image createImage(String imageFileName);

View File

@@ -1,16 +1,16 @@
package com.bartlomiejpluta.base.core.image;
package com.bartlomiejpluta.base.game.image.model;
import com.bartlomiejpluta.base.core.gl.object.material.Material;
import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.world.object.RenderableObject;
import com.bartlomiejpluta.base.core.world.object.Sprite;
import lombok.Getter;
@Getter
public class Image extends RenderableObject {
public class Image extends Sprite {
private final int initialWidth;
private final int initialHeight;
Image(Mesh mesh, Material texture, int initialWidth, int initialHeight) {
public Image(Mesh mesh, Material texture, int initialWidth, int initialHeight) {
super(mesh, texture);
this.initialWidth = initialWidth;
this.initialHeight = initialHeight;

View File

@@ -1,18 +1,18 @@
package com.bartlomiejpluta.base.core.world.animation;
package com.bartlomiejpluta.base.game.world.animation;
import com.bartlomiejpluta.base.core.gl.object.material.Material;
import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.core.world.object.RenderableObject;
import com.bartlomiejpluta.base.core.world.object.Sprite;
import lombok.EqualsAndHashCode;
import org.joml.Vector2f;
@EqualsAndHashCode(callSuper = true)
public abstract class AnimationableObject extends RenderableObject {
public abstract class AnimatedSprite extends Sprite {
public AnimationableObject(Mesh mesh, Material material) {
public AnimatedSprite(Mesh mesh, Material material) {
super(mesh, material);
}

View File

@@ -1,6 +1,6 @@
package com.bartlomiejpluta.base.game.world.entity.config;
import com.bartlomiejpluta.base.core.world.movement.Direction;
import com.bartlomiejpluta.base.game.world.movement.Direction;
import lombok.Data;
import org.joml.Vector2i;
import org.springframework.boot.context.properties.ConfigurationProperties;

View File

@@ -3,12 +3,11 @@ package com.bartlomiejpluta.base.game.world.entity.manager;
import com.bartlomiejpluta.base.core.gl.object.material.Material;
import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.util.mesh.MeshManager;
import com.bartlomiejpluta.base.core.world.map.GameMap;
import com.bartlomiejpluta.base.game.world.map.GameMap;
import com.bartlomiejpluta.base.game.world.entity.config.EntitySpriteConfiguration;
import com.bartlomiejpluta.base.game.world.entity.model.Entity;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.joml.Vector2f;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

View File

@@ -2,7 +2,7 @@ package com.bartlomiejpluta.base.game.world.entity.manager;
import com.bartlomiejpluta.base.core.gc.Cleanable;
import com.bartlomiejpluta.base.core.gl.object.material.Material;
import com.bartlomiejpluta.base.core.world.map.GameMap;
import com.bartlomiejpluta.base.game.world.map.GameMap;
import com.bartlomiejpluta.base.game.world.entity.model.Entity;
public interface EntityManager extends Cleanable {

View File

@@ -2,8 +2,8 @@ package com.bartlomiejpluta.base.game.world.entity.model;
import com.bartlomiejpluta.base.core.gl.object.material.Material;
import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.world.movement.Direction;
import com.bartlomiejpluta.base.core.world.movement.MovableObject;
import com.bartlomiejpluta.base.game.world.movement.Direction;
import com.bartlomiejpluta.base.game.world.movement.MovableSprite;
import com.bartlomiejpluta.base.game.world.entity.config.EntitySpriteConfiguration;
import lombok.EqualsAndHashCode;
import lombok.Getter;
@@ -13,7 +13,7 @@ import org.joml.Vector2f;
import java.util.Map;
@EqualsAndHashCode(callSuper = true)
public class Entity extends MovableObject {
public class Entity extends MovableSprite {
private final Map<Direction, Integer> spriteDirectionRows;
private final int defaultSpriteColumn;

View File

@@ -1,4 +1,4 @@
package com.bartlomiejpluta.base.core.world.map;
package com.bartlomiejpluta.base.game.world.layer.base;
import com.bartlomiejpluta.base.core.gl.render.Renderable;
import com.bartlomiejpluta.base.core.logic.Updatable;

View File

@@ -1,10 +1,12 @@
package com.bartlomiejpluta.base.core.world.map;
package com.bartlomiejpluta.base.game.world.layer.image;
import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.image.Image;
import com.bartlomiejpluta.base.game.image.model.Image;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.game.world.layer.base.Layer;
import com.bartlomiejpluta.base.game.world.map.GameMap;
public class ImageLayer implements Layer {

View File

@@ -1,30 +1,30 @@
package com.bartlomiejpluta.base.core.world.map;
package com.bartlomiejpluta.base.game.world.layer.object;
import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.core.world.movement.Direction;
import com.bartlomiejpluta.base.core.world.movement.MovableObject;
import com.bartlomiejpluta.base.game.world.layer.base.Layer;
import com.bartlomiejpluta.base.game.world.movement.Direction;
import com.bartlomiejpluta.base.game.world.movement.MovableSprite;
import org.joml.Vector2i;
import java.util.List;
public class ObjectLayer implements Layer {
private final List<MovableObject> objects;
private final List<MovableSprite> objects;
private final PassageAbility[][] passageMap;
public ObjectLayer(List<MovableObject> objects, PassageAbility[][] passageMap) {
public ObjectLayer(List<MovableSprite> objects, PassageAbility[][] passageMap) {
this.objects = objects;
this.passageMap = passageMap;
}
public void addObject(MovableObject object) {
public void addObject(MovableSprite object) {
objects.add(object);
}
public void removeObject(MovableObject object) {
public void removeObject(MovableSprite object) {
objects.remove(object);
}

View File

@@ -1,4 +1,4 @@
package com.bartlomiejpluta.base.core.world.map;
package com.bartlomiejpluta.base.game.world.layer.object;
public enum PassageAbility {
BLOCK,

View File

@@ -1,30 +1,31 @@
package com.bartlomiejpluta.base.core.world.map;
package com.bartlomiejpluta.base.game.world.layer.tile;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.core.world.tileset.model.Tile;
import org.joml.Vector2f;
import com.bartlomiejpluta.base.game.world.layer.base.Layer;
import com.bartlomiejpluta.base.game.world.tileset.model.Tile;
import java.util.Arrays;
public class TileLayer implements Layer {
private final Tile[][] layer;
private final Vector2f stepSize;
private final float scale;
private final int rows;
private final int columns;
public TileLayer(Tile[][] layer, Vector2f stepSize, float scale) {
this.layer = layer;
this.stepSize = stepSize;
this.scale = scale;
public TileLayer(int rows, int columns) {
this.rows = rows;
this.columns = columns;
layer = new Tile[rows][columns];
Arrays.stream(layer).forEach(tiles -> Arrays.fill(tiles, null));
}
public void setTile(int row, int column, Tile tile) {
layer[row][column] = tile;
recalculateTileGeometry(tile, row, column);
}
private void recalculateTileGeometry(Tile tile, int row, int column) {
tile.setScale(scale);
tile.setPosition(column * stepSize.x, row * stepSize.y);
if(tile != null) {
tile.setCoordinates(row, column);
}
}
@Override

View File

@@ -1,16 +1,21 @@
package com.bartlomiejpluta.base.core.world.map;
package com.bartlomiejpluta.base.game.world.map;
import com.bartlomiejpluta.base.core.gl.render.Renderable;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.image.Image;
import com.bartlomiejpluta.base.game.image.model.Image;
import com.bartlomiejpluta.base.core.logic.Updatable;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.core.world.movement.MovableObject;
import com.bartlomiejpluta.base.core.world.movement.Movement;
import com.bartlomiejpluta.base.core.world.tileset.model.Tile;
import com.bartlomiejpluta.base.core.world.tileset.model.TileSet;
import com.bartlomiejpluta.base.game.world.layer.base.Layer;
import com.bartlomiejpluta.base.game.world.layer.image.ImageLayer;
import com.bartlomiejpluta.base.game.world.layer.object.ObjectLayer;
import com.bartlomiejpluta.base.game.world.layer.object.PassageAbility;
import com.bartlomiejpluta.base.game.world.layer.tile.TileLayer;
import com.bartlomiejpluta.base.game.world.movement.MovableSprite;
import com.bartlomiejpluta.base.game.world.movement.Movement;
import com.bartlomiejpluta.base.game.world.tileset.model.TileSet;
import lombok.Getter;
import lombok.NonNull;
import org.joml.Vector2f;
import java.util.ArrayList;
@@ -18,10 +23,10 @@ import java.util.Arrays;
import java.util.List;
public class GameMap implements Renderable, Updatable {
private final TileSet tileSet;
private final List<Layer> layers = new ArrayList<>();
private final float scale;
@NonNull
private final TileSet tileSet;
@Getter
private final int rows;
@@ -32,12 +37,11 @@ public class GameMap implements Renderable, Updatable {
@Getter
private final Vector2f stepSize;
public GameMap(TileSet tileSet, int rows, int columns, float scale) {
public GameMap(TileSet tileSet, int rows, int columns) {
this.tileSet = tileSet;
this.scale = scale;
this.rows = rows;
this.columns = columns;
this.stepSize = new Vector2f(this.scale * this.tileSet.getTileWidth(), this.scale * this.tileSet.getTileHeight());
this.stepSize = new Vector2f(tileSet.getTileSet().getSpriteSize());
}
@Override
@@ -70,7 +74,7 @@ public class GameMap implements Renderable, Updatable {
}
public GameMap createTileLayer() {
layers.add(new TileLayer(new Tile[rows][columns], stepSize, scale));
layers.add(new TileLayer(rows, columns));
return this;
}
@@ -81,13 +85,13 @@ public class GameMap implements Renderable, Updatable {
return this;
}
public GameMap addObject(int layerIndex, MovableObject object) {
public GameMap addObject(int layerIndex, MovableSprite object) {
((ObjectLayer) layers.get(layerIndex)).addObject(object);
return this;
}
public GameMap removeObject(int layerIndex, MovableObject object) {
public GameMap removeObject(int layerIndex, MovableSprite object) {
((ObjectLayer) layers.get(layerIndex)).removeObject(object);
return this;
@@ -95,11 +99,24 @@ public class GameMap implements Renderable, Updatable {
public GameMap setPassageAbility(int layerIndex, int row, int column, PassageAbility passageAbility) {
((ObjectLayer) layers.get(layerIndex)).setPassageAbility(row, column, passageAbility);
return this;
}
public GameMap setTile(int layerIndex, int row, int column, Tile tile) {
((TileLayer) layers.get(layerIndex)).setTile(row, column, tile);
public GameMap setTile(int layerIndex, int row, int column, int tileId) {
((TileLayer) layers.get(layerIndex)).setTile(row, column, tileSet.tileById(tileId));
return this;
}
public GameMap setTile(int layerIndex, int row, int column, int tileSetRow, int tileSetColumn) {
((TileLayer) layers.get(layerIndex)).setTile(row, column, tileSet.tileAt(tileSetRow, tileSetColumn));
return this;
}
public GameMap clearTile(int layerIndex, int row, int column) {
((TileLayer) layers.get(layerIndex)).setTile(row, column, null);
return this;
}

View File

@@ -1,4 +1,4 @@
package com.bartlomiejpluta.base.core.world.movement;
package com.bartlomiejpluta.base.game.world.movement;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;

View File

@@ -1,16 +1,16 @@
package com.bartlomiejpluta.base.core.world.movement;
package com.bartlomiejpluta.base.game.world.movement;
import com.bartlomiejpluta.base.core.gl.object.material.Material;
import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.logic.Updatable;
import com.bartlomiejpluta.base.core.world.animation.AnimationableObject;
import com.bartlomiejpluta.base.game.world.animation.AnimatedSprite;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import org.joml.Vector2f;
import org.joml.Vector2i;
@EqualsAndHashCode(callSuper = true)
public abstract class MovableObject extends AnimationableObject implements Updatable {
public abstract class MovableSprite extends AnimatedSprite implements Updatable {
private final Vector2f coordinateStepSize;
private int moveTime = 0;
@@ -62,18 +62,18 @@ public abstract class MovableObject extends AnimationableObject implements Updat
return true;
}
public MovableObject setCoordinates(int x, int y) {
public MovableSprite setCoordinates(int x, int y) {
coordinates.x = x;
coordinates.y = y;
setPosition((x + 0.5f) * coordinateStepSize.x, (y + 0.5f) * coordinateStepSize.y);
return this;
}
public MovableObject setCoordinates(Vector2i coordinates) {
public MovableSprite setCoordinates(Vector2i coordinates) {
return setCoordinates(coordinates.x, coordinates.y);
}
public MovableObject(Mesh mesh, Material material, Vector2f coordinateStepSize) {
public MovableSprite(Mesh mesh, Material material, Vector2f coordinateStepSize) {
super(mesh, material);
this.coordinateStepSize = coordinateStepSize;
setCoordinates(0, 0);

View File

@@ -0,0 +1,31 @@
package com.bartlomiejpluta.base.game.world.movement;
import lombok.AccessLevel;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.joml.Vector2i;
@Data
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
public class Movement {
private final MovableSprite object;
private final Direction direction;
private boolean performed = false;
public boolean perform() {
performed = object.move(direction);
return performed;
}
public Vector2i getSourceCoordinate() {
return new Vector2i(object.getCoordinates());
}
public Vector2i getTargetCoordinate() {
return direction.asIntVector().add(object.getCoordinates());
}
public Movement another() {
return object.prepareMovement(direction);
}
}

View File

@@ -1,8 +1,8 @@
package com.bartlomiejpluta.base.core.world.tileset.manager;
package com.bartlomiejpluta.base.game.world.tileset.manager;
import com.bartlomiejpluta.base.core.gl.object.texture.TextureManager;
import com.bartlomiejpluta.base.core.util.mesh.MeshManager;
import com.bartlomiejpluta.base.core.world.tileset.model.TileSet;
import com.bartlomiejpluta.base.game.world.tileset.model.TileSet;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -11,6 +11,8 @@ import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import static java.lang.String.format;
@Slf4j
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@@ -21,15 +23,16 @@ public class DefaultTileSetManager implements TileSetManager {
@Override
public TileSet createTileSet(String tileSetFileName, int rows, int columns) {
var tileset = tileSets.get(tileSetFileName);
var key = format("%dx%d__%s", rows, columns, tileSetFileName);
var tileset = tileSets.get(key);
if(tileset == null) {
log.info("Loading [{}] tileset to cache", tileSetFileName);
var texture = textureManager.loadTexture(tileSetFileName);
var tileWidth = texture.getWidth() / columns;
var tileHeight = texture.getHeight() / rows;
var mesh = meshManager.createQuad(tileWidth, tileHeight, 0, 0);
tileset = new TileSet(mesh, texture, rows, columns, tileWidth, tileHeight);
if (tileset == null) {
var texture = textureManager.loadTexture(tileSetFileName, rows, columns);
var size = texture.getSpriteSize();
var mesh = meshManager.createQuad(size.x, size.y, 0, 0);
tileset = new TileSet(texture, mesh);
log.info("Loading [{}] tileset to cache under the key: [{}]", tileSetFileName, key);
tileSets.put(key, tileset);
}
return tileset;

View File

@@ -1,7 +1,7 @@
package com.bartlomiejpluta.base.core.world.tileset.manager;
package com.bartlomiejpluta.base.game.world.tileset.manager;
import com.bartlomiejpluta.base.core.gc.Cleanable;
import com.bartlomiejpluta.base.core.world.tileset.model.TileSet;
import com.bartlomiejpluta.base.game.world.tileset.model.TileSet;
public interface TileSetManager extends Cleanable {
TileSet createTileSet(String tileSetFileName, int rows, int columns);

View File

@@ -0,0 +1,36 @@
package com.bartlomiejpluta.base.game.world.tileset.model;
import com.bartlomiejpluta.base.core.gl.object.material.Material;
import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.gl.object.texture.Texture;
import com.bartlomiejpluta.base.core.world.object.Sprite;
import lombok.Getter;
@Getter
public class Tile extends Sprite {
private final int id;
private final int tileSetRow;
private final int tileSetColumn;
public Tile setCoordinates(int row, int column) {
var stepSize = material.getTexture().getSpriteSize();
setPosition(column * stepSize.x, row * stepSize.y);
return this;
}
public Tile(Mesh mesh, Texture tileSet, int id) {
super(mesh, Material.textured(tileSet));
this.id = id;
this.tileSetRow = id / tileSet.getColumns();
this.tileSetColumn = id % tileSet.getColumns();
material.setSpritePosition(tileSetColumn, tileSetRow);
}
public Tile(Mesh mesh, Texture tileSet, int row, int column) {
super(mesh, Material.textured(tileSet));
this.tileSetRow = row;
this.tileSetColumn = column;
this.id = row * tileSet.getColumns() + column;
material.setSpritePosition(tileSetColumn, tileSetRow);
}
}

View File

@@ -0,0 +1,21 @@
package com.bartlomiejpluta.base.game.world.tileset.model;
import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.gl.object.texture.Texture;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public class TileSet {
private final Texture tileSet;
private final Mesh mesh;
public Tile tileById(int id) {
return new Tile(mesh, tileSet, id);
}
public Tile tileAt(int row, int column) {
return new Tile(mesh, tileSet, row, column);
}
}