Introduce pushToScene() and removeFromScene() Entity's methods

This commit is contained in:
2021-02-01 13:19:54 +01:00
parent 44e875299a
commit 8e2c63aac7
9 changed files with 57 additions and 18 deletions

View File

@@ -3,9 +3,11 @@ package com.bartlomiejpluta.base.core.world.animation;
import com.bartlomiejpluta.base.core.gl.object.material.Material; 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.mesh.Mesh;
import com.bartlomiejpluta.base.core.world.object.RenderableObject; import com.bartlomiejpluta.base.core.world.object.RenderableObject;
import lombok.EqualsAndHashCode;
import org.joml.Vector2f; import org.joml.Vector2f;
import org.joml.Vector2i; import org.joml.Vector2i;
@EqualsAndHashCode(callSuper = true)
public abstract class AnimationableObject extends RenderableObject { public abstract class AnimationableObject extends RenderableObject {
protected final Vector2i spriteSheetDimension; protected final Vector2i spriteSheetDimension;

View File

@@ -1,10 +1,10 @@
package com.bartlomiejpluta.base.core.world.camera; package com.bartlomiejpluta.base.core.world.camera;
import com.bartlomiejpluta.base.core.ui.Window; import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.world.object.Object; import com.bartlomiejpluta.base.core.world.object.PositionableObject;
import org.joml.Matrix4f; import org.joml.Matrix4f;
public class Camera extends Object { public class Camera extends PositionableObject {
private final Matrix4f projectionMatrix = new Matrix4f(); private final Matrix4f projectionMatrix = new Matrix4f();
private final Matrix4f viewMatrix = new Matrix4f(); private final Matrix4f viewMatrix = new Matrix4f();

View File

@@ -4,11 +4,12 @@ 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.mesh.Mesh;
import com.bartlomiejpluta.base.core.logic.Updatable; import com.bartlomiejpluta.base.core.logic.Updatable;
import com.bartlomiejpluta.base.core.world.animation.AnimationableObject; import com.bartlomiejpluta.base.core.world.animation.AnimationableObject;
import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import org.joml.Vector2f; import org.joml.Vector2f;
import org.joml.Vector2i; import org.joml.Vector2i;
@EqualsAndHashCode(callSuper = true)
public abstract class MovableObject extends AnimationableObject implements Updatable { public abstract class MovableObject extends AnimationableObject implements Updatable {
private final Vector2f coordinateStepSize; private final Vector2f coordinateStepSize;

View File

@@ -1,5 +1,6 @@
package com.bartlomiejpluta.base.core.world.object; package com.bartlomiejpluta.base.core.world.object;
import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.joml.Matrix4f; import org.joml.Matrix4f;
@@ -7,7 +8,8 @@ import org.joml.Vector2f;
import static java.lang.Math.toRadians; import static java.lang.Math.toRadians;
public abstract class Object { @EqualsAndHashCode
public abstract class PositionableObject {
private final Matrix4f modelMatrix = new Matrix4f(); private final Matrix4f modelMatrix = new Matrix4f();
@Getter @Getter
@@ -21,31 +23,31 @@ public abstract class Object {
@Setter @Setter
protected float scale = 1.0f; protected float scale = 1.0f;
public Object setPosition(float x, float y) { public PositionableObject setPosition(float x, float y) {
position.x = x; position.x = x;
position.y = y; position.y = y;
return this; return this;
} }
public Object setPosition(Vector2f position) { public PositionableObject setPosition(Vector2f position) {
this.position.x = position.x; this.position.x = position.x;
this.position.y = position.y; this.position.y = position.y;
return this; return this;
} }
public Object movePosition(float x, float y) { public PositionableObject movePosition(float x, float y) {
position.x += x; position.x += x;
position.y += y; position.y += y;
return this; return this;
} }
public Object movePosition(Vector2f position) { public PositionableObject movePosition(Vector2f position) {
this.position.x += position.x; this.position.x += position.x;
this.position.y += position.y; this.position.y += position.y;
return this; return this;
} }
public Object moveRotation(float rotation) { public PositionableObject moveRotation(float rotation) {
this.rotation += rotation; this.rotation += rotation;
return this; return this;
} }

View File

@@ -5,6 +5,7 @@ import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.gl.render.Renderable; import com.bartlomiejpluta.base.core.gl.render.Renderable;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager; import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.ui.Window; import com.bartlomiejpluta.base.core.ui.Window;
import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
@@ -12,7 +13,8 @@ import org.joml.Vector2f;
import org.joml.Vector4f; import org.joml.Vector4f;
@RequiredArgsConstructor @RequiredArgsConstructor
public abstract class RenderableObject extends Object implements Renderable { @EqualsAndHashCode(callSuper = true)
public abstract class RenderableObject extends PositionableObject implements Renderable {
private final Mesh mesh; private final Mesh mesh;
@Getter @Getter

View File

@@ -10,6 +10,7 @@ import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.core.world.map.GameMap; import com.bartlomiejpluta.base.core.world.map.GameMap;
import com.bartlomiejpluta.base.core.world.object.RenderableObject; import com.bartlomiejpluta.base.core.world.object.RenderableObject;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.util.ArrayList; import java.util.ArrayList;
@@ -22,6 +23,7 @@ public class Scene implements Renderable {
private final List<AnimationableObject> objects = new ArrayList<>(); private final List<AnimationableObject> objects = new ArrayList<>();
@Setter @Setter
@Getter
private GameMap map; private GameMap map;
public Scene addObject(AnimationableObject object) { public Scene addObject(AnimationableObject object) {
@@ -29,6 +31,11 @@ public class Scene implements Renderable {
return this; return this;
} }
public Scene removeObject(AnimationableObject object) {
objects.remove(object);
return this;
}
@Override @Override
public void render(Window window, ShaderManager shaderManager) { public void render(Window window, ShaderManager shaderManager) {
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, camera.getProjectionMatrix(window)); shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, camera.getProjectionMatrix(window));

View File

@@ -3,11 +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.material.Material;
import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh; import com.bartlomiejpluta.base.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.core.util.mesh.MeshManager; import com.bartlomiejpluta.base.core.util.mesh.MeshManager;
import com.bartlomiejpluta.base.game.world.entity.model.Entity; import com.bartlomiejpluta.base.core.world.scene.Scene;
import com.bartlomiejpluta.base.game.world.entity.config.EntitySpriteConfiguration; import com.bartlomiejpluta.base.game.world.entity.config.EntitySpriteConfiguration;
import com.bartlomiejpluta.base.game.world.entity.model.Entity;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.joml.Vector2f;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -19,8 +19,8 @@ public class DefaultEntityManager implements EntityManager {
private final EntitySpriteConfiguration configuration; private final EntitySpriteConfiguration configuration;
@Override @Override
public Entity createEntity(Material material, Vector2f coordinateStepSize) { public Entity createEntity(Material material, Scene scene) {
return new Entity(buildMesh(material), material, coordinateStepSize, configuration); return new Entity(scene, buildMesh(material), material, scene.getMap().getStepSize(), configuration);
} }
private Mesh buildMesh(Material material) { private Mesh buildMesh(Material material) {

View File

@@ -2,9 +2,10 @@ package com.bartlomiejpluta.base.game.world.entity.manager;
import com.bartlomiejpluta.base.core.gc.Cleanable; import com.bartlomiejpluta.base.core.gc.Cleanable;
import com.bartlomiejpluta.base.core.gl.object.material.Material; import com.bartlomiejpluta.base.core.gl.object.material.Material;
import com.bartlomiejpluta.base.core.world.scene.Scene;
import com.bartlomiejpluta.base.game.world.entity.model.Entity; import com.bartlomiejpluta.base.game.world.entity.model.Entity;
import org.joml.Vector2f; import org.joml.Vector2f;
public interface EntityManager extends Cleanable { public interface EntityManager extends Cleanable {
Entity createEntity(Material material, Vector2f coordinateStepSize); Entity createEntity(Material material, Scene scene);
} }

View File

@@ -4,15 +4,23 @@ 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.mesh.Mesh;
import com.bartlomiejpluta.base.core.world.movement.Direction; import com.bartlomiejpluta.base.core.world.movement.Direction;
import com.bartlomiejpluta.base.core.world.movement.MovableObject; import com.bartlomiejpluta.base.core.world.movement.MovableObject;
import com.bartlomiejpluta.base.core.world.scene.Scene;
import com.bartlomiejpluta.base.game.world.entity.config.EntitySpriteConfiguration; import com.bartlomiejpluta.base.game.world.entity.config.EntitySpriteConfiguration;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.joml.Vector2f; import org.joml.Vector2f;
import java.util.Map; import java.util.Map;
@EqualsAndHashCode(exclude = "scene", callSuper = true)
public class Entity extends MovableObject { public class Entity extends MovableObject {
private final Map<Direction, Integer> spriteDirectionRows; private final Map<Direction, Integer> spriteDirectionRows;
private final int defaultSpriteColumn; private final int defaultSpriteColumn;
private final Scene scene;
@Getter
private boolean onScene;
@Setter @Setter
private int animationSpeed = 100; private int animationSpeed = 100;
@@ -66,9 +74,25 @@ public class Entity extends MovableObject {
return framesToCrossOneTile; return framesToCrossOneTile;
} }
public Entity(Mesh mesh, Material material, Vector2f coordinateStepSize, EntitySpriteConfiguration configuration) { public void pushToScene() {
if(!onScene) {
scene.addObject(this);
onScene = true;
}
}
public void removeFromScene() {
if(onScene) {
scene.removeObject(this);
onScene = false;
}
}
public Entity(Scene scene, Mesh mesh, Material material, Vector2f coordinateStepSize, EntitySpriteConfiguration configuration) {
super(mesh, material, coordinateStepSize, configuration.getDimension().asVector()); super(mesh, material, coordinateStepSize, configuration.getDimension().asVector());
defaultSpriteColumn = configuration.getDefaultSpriteColumn(); this.scene = scene;
spriteDirectionRows = configuration.getSpriteDirectionRows(); this.defaultSpriteColumn = configuration.getDefaultSpriteColumn();
this.spriteDirectionRows = configuration.getSpriteDirectionRows();
this.onScene = false;
} }
} }