Add basic support for Infinite and N-repeated animations
This commit is contained in:
@@ -1,14 +1,12 @@
|
|||||||
package com.bartlomiejpluta.base.api.game.animation;
|
package com.bartlomiejpluta.base.api.game.animation;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.game.entity.Direction;
|
|
||||||
import com.bartlomiejpluta.base.api.game.entity.Movement;
|
|
||||||
import com.bartlomiejpluta.base.api.game.map.layer.object.ObjectLayer;
|
|
||||||
import com.bartlomiejpluta.base.api.internal.logic.Updatable;
|
import com.bartlomiejpluta.base.api.internal.logic.Updatable;
|
||||||
import com.bartlomiejpluta.base.api.internal.object.Placeable;
|
import com.bartlomiejpluta.base.api.internal.object.Placeable;
|
||||||
import com.bartlomiejpluta.base.api.internal.render.Renderable;
|
import com.bartlomiejpluta.base.api.internal.render.Renderable;
|
||||||
import org.joml.Vector2ic;
|
import org.joml.Vector2ic;
|
||||||
|
|
||||||
public interface Animation extends Placeable, Renderable, Updatable {
|
public interface Animation extends Placeable, Renderable, Updatable {
|
||||||
|
|
||||||
void setStepSize(float x, float y);
|
void setStepSize(float x, float y);
|
||||||
|
|
||||||
Vector2ic getCoordinates();
|
Vector2ic getCoordinates();
|
||||||
@@ -17,17 +15,11 @@ public interface Animation extends Placeable, Renderable, Updatable {
|
|||||||
|
|
||||||
void setCoordinates(int x, int y);
|
void setCoordinates(int x, int y);
|
||||||
|
|
||||||
Movement prepareMovement(Direction direction);
|
|
||||||
|
|
||||||
Movement getMovement();
|
|
||||||
|
|
||||||
void setSpeed(float speed);
|
|
||||||
|
|
||||||
void setAnimationSpeed(float speed);
|
void setAnimationSpeed(float speed);
|
||||||
|
|
||||||
boolean isMoving();
|
Integer getRepeat();
|
||||||
|
|
||||||
void onAdd(ObjectLayer layer);
|
void setRepeat(Integer repeat);
|
||||||
|
|
||||||
void onRemove(ObjectLayer layer);
|
boolean finished();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.bartlomiejpluta.base.api.game.context;
|
package com.bartlomiejpluta.base.api.game.context;
|
||||||
|
|
||||||
|
import com.bartlomiejpluta.base.api.game.animation.Animation;
|
||||||
import com.bartlomiejpluta.base.api.game.camera.Camera;
|
import com.bartlomiejpluta.base.api.game.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.game.entity.Entity;
|
import com.bartlomiejpluta.base.api.game.entity.Entity;
|
||||||
import com.bartlomiejpluta.base.api.game.gui.base.GUI;
|
import com.bartlomiejpluta.base.api.game.gui.base.GUI;
|
||||||
@@ -28,6 +29,8 @@ public interface Context extends Updatable, Renderable, Disposable {
|
|||||||
|
|
||||||
Entity createEntity(String entitySetUid);
|
Entity createEntity(String entitySetUid);
|
||||||
|
|
||||||
|
Animation createAnimation(String animationUid);
|
||||||
|
|
||||||
Image getImage(String imageUid);
|
Image getImage(String imageUid);
|
||||||
|
|
||||||
GUI newGUI();
|
GUI newGUI();
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
package com.bartlomiejpluta.base.api.game.map.layer.base;
|
package com.bartlomiejpluta.base.api.game.map.layer.base;
|
||||||
|
|
||||||
|
import com.bartlomiejpluta.base.api.game.animation.Animation;
|
||||||
import com.bartlomiejpluta.base.api.game.map.model.GameMap;
|
import com.bartlomiejpluta.base.api.game.map.model.GameMap;
|
||||||
import com.bartlomiejpluta.base.api.internal.logic.Updatable;
|
import com.bartlomiejpluta.base.api.internal.logic.Updatable;
|
||||||
import com.bartlomiejpluta.base.api.internal.render.Renderable;
|
import com.bartlomiejpluta.base.api.internal.render.Renderable;
|
||||||
|
|
||||||
public interface Layer extends Renderable, Updatable {
|
public interface Layer extends Renderable, Updatable {
|
||||||
GameMap getMap();
|
GameMap getMap();
|
||||||
|
|
||||||
|
void pushAnimation(Animation animation);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ public interface GameMap {
|
|||||||
|
|
||||||
Vector2fc getSize();
|
Vector2fc getSize();
|
||||||
|
|
||||||
|
Vector2fc getStepSize();
|
||||||
|
|
||||||
TileLayer getTileLayer(int layerIndex);
|
TileLayer getTileLayer(int layerIndex);
|
||||||
|
|
||||||
ImageLayer getImageLayer(int layerIndex);
|
ImageLayer getImageLayer(int layerIndex);
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ public class DefaultContextManager implements ContextManager {
|
|||||||
return DefaultContext.builder()
|
return DefaultContext.builder()
|
||||||
.engine(engine)
|
.engine(engine)
|
||||||
.entityManager(entityManager)
|
.entityManager(entityManager)
|
||||||
|
.animationManager(animationManager)
|
||||||
.imageManager(imageManager)
|
.imageManager(imageManager)
|
||||||
.mapManager(mapManager)
|
.mapManager(mapManager)
|
||||||
.fontManager(fontManager)
|
.fontManager(fontManager)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.bartlomiejpluta.base.engine.context.model;
|
package com.bartlomiejpluta.base.engine.context.model;
|
||||||
|
|
||||||
|
import com.bartlomiejpluta.base.api.game.animation.Animation;
|
||||||
import com.bartlomiejpluta.base.api.game.camera.Camera;
|
import com.bartlomiejpluta.base.api.game.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.game.context.Context;
|
import com.bartlomiejpluta.base.api.game.context.Context;
|
||||||
import com.bartlomiejpluta.base.api.game.entity.Entity;
|
import com.bartlomiejpluta.base.api.game.entity.Entity;
|
||||||
@@ -15,6 +16,7 @@ import com.bartlomiejpluta.base.engine.gui.manager.FontManager;
|
|||||||
import com.bartlomiejpluta.base.engine.gui.manager.WidgetDefinitionManager;
|
import com.bartlomiejpluta.base.engine.gui.manager.WidgetDefinitionManager;
|
||||||
import com.bartlomiejpluta.base.engine.gui.render.NanoVGGUI;
|
import com.bartlomiejpluta.base.engine.gui.render.NanoVGGUI;
|
||||||
import com.bartlomiejpluta.base.engine.gui.xml.inflater.Inflater;
|
import com.bartlomiejpluta.base.engine.gui.xml.inflater.Inflater;
|
||||||
|
import com.bartlomiejpluta.base.engine.world.animation.manager.AnimationManager;
|
||||||
import com.bartlomiejpluta.base.engine.world.entity.manager.EntityManager;
|
import com.bartlomiejpluta.base.engine.world.entity.manager.EntityManager;
|
||||||
import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager;
|
import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager;
|
||||||
import com.bartlomiejpluta.base.engine.world.map.manager.MapManager;
|
import com.bartlomiejpluta.base.engine.world.map.manager.MapManager;
|
||||||
@@ -38,6 +40,9 @@ public class DefaultContext implements Context {
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final EntityManager entityManager;
|
private final EntityManager entityManager;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private final AnimationManager animationManager;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private final ImageManager imageManager;
|
private final ImageManager imageManager;
|
||||||
|
|
||||||
@@ -108,6 +113,11 @@ public class DefaultContext implements Context {
|
|||||||
return entityManager.createEntity(entitySetUid);
|
return entityManager.createEntity(entitySetUid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Animation createAnimation(String animationUid) {
|
||||||
|
return animationManager.loadObject(animationUid);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getImage(@NonNull String imageUid) {
|
public Image getImage(@NonNull String imageUid) {
|
||||||
return imageManager.loadObject(imageUid);
|
return imageManager.loadObject(imageUid);
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ public class DefaultAnimationManager implements AnimationManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Vector2fc[] createFrames(int rows, int columns) {
|
private Vector2fc[] createFrames(int rows, int columns) {
|
||||||
|
log.info("Caching [{}x{}] animation ([{}] frames)", columns, rows, columns * rows);
|
||||||
|
|
||||||
var frames = new Vector2fc[rows * columns];
|
var frames = new Vector2fc[rows * columns];
|
||||||
|
|
||||||
for (int row = 0; row < rows; ++row) {
|
for (int row = 0; row < rows; ++row) {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import org.joml.Vector2fc;
|
|||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
public abstract class AnimatedSprite extends Sprite implements Updatable {
|
public abstract class AnimatedSprite extends Sprite implements Updatable {
|
||||||
private int time;
|
private int time;
|
||||||
|
protected int currentAnimationFrame;
|
||||||
|
|
||||||
public AnimatedSprite(Mesh mesh, Material material) {
|
public AnimatedSprite(Mesh mesh, Material material) {
|
||||||
super(mesh, material);
|
super(mesh, material);
|
||||||
@@ -40,8 +41,8 @@ public abstract class AnimatedSprite extends Sprite implements Updatable {
|
|||||||
if (shouldAnimate()) {
|
if (shouldAnimate()) {
|
||||||
var positions = getSpriteAnimationFramesPositions();
|
var positions = getSpriteAnimationFramesPositions();
|
||||||
var delay = getAnimationSpeed();
|
var delay = getAnimationSpeed();
|
||||||
var currentPosition = ((time % (positions.length * delay)) / delay);
|
currentAnimationFrame = ((time % (positions.length * delay)) / delay);
|
||||||
var current = positions[currentPosition];
|
var current = positions[currentAnimationFrame];
|
||||||
material.setSpritePosition(current);
|
material.setSpritePosition(current);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,31 @@
|
|||||||
package com.bartlomiejpluta.base.engine.world.animation.model;
|
package com.bartlomiejpluta.base.engine.world.animation.model;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.game.animation.Animation;
|
import com.bartlomiejpluta.base.api.game.animation.Animation;
|
||||||
import com.bartlomiejpluta.base.api.game.map.layer.object.ObjectLayer;
|
|
||||||
import com.bartlomiejpluta.base.api.util.math.MathUtil;
|
import com.bartlomiejpluta.base.api.util.math.MathUtil;
|
||||||
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
|
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
|
||||||
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh;
|
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh;
|
||||||
import com.bartlomiejpluta.base.engine.world.movement.MovableSprite;
|
import com.bartlomiejpluta.base.engine.world.movement.MovableSprite;
|
||||||
|
import lombok.Getter;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
import lombok.Setter;
|
||||||
import org.joml.Vector2fc;
|
import org.joml.Vector2fc;
|
||||||
|
|
||||||
public class DefaultAnimation extends MovableSprite implements Animation {
|
public class DefaultAnimation extends MovableSprite implements Animation {
|
||||||
private final Vector2fc[] frames;
|
private final Vector2fc[] frames;
|
||||||
|
private final int lastFrameIndex;
|
||||||
|
|
||||||
private int animationSpeed = 100;
|
private int animationSpeed = 100;
|
||||||
|
private int iteration = 0;
|
||||||
|
private boolean updated = false;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private Integer repeat = 1;
|
||||||
|
|
||||||
public DefaultAnimation(Mesh mesh, Material material, @NonNull Vector2fc[] frames) {
|
public DefaultAnimation(Mesh mesh, Material material, @NonNull Vector2fc[] frames) {
|
||||||
super(mesh, material);
|
super(mesh, material);
|
||||||
this.frames = frames;
|
this.frames = frames;
|
||||||
}
|
this.lastFrameIndex = frames.length - 1;
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setSpeed(float speed) {
|
|
||||||
framesToCrossOneTile = (int) (1 / MathUtil.clamp(speed, Float.MIN_VALUE, 1.0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -28,16 +33,6 @@ public class DefaultAnimation extends MovableSprite implements Animation {
|
|||||||
animationSpeed = (int) (1 / MathUtil.clamp(speed, Float.MIN_VALUE, 1.0));
|
animationSpeed = (int) (1 / MathUtil.clamp(speed, Float.MIN_VALUE, 1.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAdd(ObjectLayer layer) {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRemove(ObjectLayer layer) {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getAnimationSpeed() {
|
public int getAnimationSpeed() {
|
||||||
return animationSpeed;
|
return animationSpeed;
|
||||||
@@ -57,4 +52,22 @@ public class DefaultAnimation extends MovableSprite implements Animation {
|
|||||||
protected void setDefaultAnimationFrame() {
|
protected void setDefaultAnimationFrame() {
|
||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean finished() {
|
||||||
|
if (repeat == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentAnimationFrame == 0) {
|
||||||
|
updated = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentAnimationFrame == lastFrameIndex && !updated) {
|
||||||
|
++iteration;
|
||||||
|
updated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return iteration >= repeat;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package com.bartlomiejpluta.base.engine.world.map.layer.base;
|
||||||
|
|
||||||
|
import com.bartlomiejpluta.base.api.game.animation.Animation;
|
||||||
|
import com.bartlomiejpluta.base.api.game.camera.Camera;
|
||||||
|
import com.bartlomiejpluta.base.api.game.map.layer.base.Layer;
|
||||||
|
import com.bartlomiejpluta.base.api.game.map.model.GameMap;
|
||||||
|
import com.bartlomiejpluta.base.api.game.screen.Screen;
|
||||||
|
import com.bartlomiejpluta.base.api.internal.logic.Updatable;
|
||||||
|
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import org.joml.Vector2fc;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.Queue;
|
||||||
|
|
||||||
|
public abstract class BaseLayer implements Layer, Updatable {
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
protected final GameMap map;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
protected final Vector2fc stepSize;
|
||||||
|
|
||||||
|
private final Queue<Animation> animations = new LinkedList<>();
|
||||||
|
|
||||||
|
public BaseLayer(@NonNull GameMap map) {
|
||||||
|
this.map = map;
|
||||||
|
this.stepSize = map.getStepSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pushAnimation(Animation animation) {
|
||||||
|
animations.add(animation);
|
||||||
|
animation.setStepSize(stepSize.x(), stepSize.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GameMap getMap() {
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(float dt) {
|
||||||
|
for (var iterator = animations.iterator(); iterator.hasNext(); ) {
|
||||||
|
var animation = iterator.next();
|
||||||
|
animation.update(dt);
|
||||||
|
|
||||||
|
if (animation.finished()) {
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
||||||
|
for (var animation : animations) {
|
||||||
|
animation.render(screen, camera, shaderManager);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,21 +1,28 @@
|
|||||||
package com.bartlomiejpluta.base.engine.world.map.layer.color;
|
package com.bartlomiejpluta.base.engine.world.map.layer.color;
|
||||||
|
|
||||||
|
import com.bartlomiejpluta.base.api.game.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.game.map.layer.color.ColorLayer;
|
import com.bartlomiejpluta.base.api.game.map.layer.color.ColorLayer;
|
||||||
import com.bartlomiejpluta.base.api.game.map.model.GameMap;
|
import com.bartlomiejpluta.base.api.game.map.model.GameMap;
|
||||||
|
import com.bartlomiejpluta.base.api.game.screen.Screen;
|
||||||
|
import com.bartlomiejpluta.base.api.internal.object.Placeable;
|
||||||
|
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
|
||||||
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
|
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
|
||||||
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
|
import com.bartlomiejpluta.base.engine.util.mesh.MeshManager;
|
||||||
|
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
|
||||||
import com.bartlomiejpluta.base.engine.world.object.Sprite;
|
import com.bartlomiejpluta.base.engine.world.object.Sprite;
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
import org.joml.Matrix4fc;
|
||||||
|
import org.joml.Vector2fc;
|
||||||
|
|
||||||
public class DefaultColorLayer extends Sprite implements ColorLayer {
|
public class DefaultColorLayer extends BaseLayer implements ColorLayer {
|
||||||
|
private final Color color;
|
||||||
@Getter
|
private final Material material;
|
||||||
private final GameMap map;
|
|
||||||
|
|
||||||
public DefaultColorLayer(@NonNull GameMap map, @NonNull MeshManager meshManager, float red, float green, float blue, float alpha) {
|
public DefaultColorLayer(@NonNull GameMap map, @NonNull MeshManager meshManager, float red, float green, float blue, float alpha) {
|
||||||
super(meshManager.createQuad(1, 1, 0, 0), Material.colored(red, green, blue, alpha));
|
super(map);
|
||||||
this.map = map;
|
this.color = new Color(meshManager, red, green, blue, alpha);
|
||||||
|
this.material = color.getMaterial();
|
||||||
|
|
||||||
setScale(map.getWidth(), map.getHeight());
|
setScale(map.getWidth(), map.getHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,7 +57,94 @@ public class DefaultColorLayer extends Sprite implements ColorLayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(float dt) {
|
public Vector2fc getPosition() {
|
||||||
// Do nothing
|
return color.getPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPosition(float x, float y) {
|
||||||
|
color.setPosition(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPosition(Vector2fc position) {
|
||||||
|
color.setPosition(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void movePosition(float x, float y) {
|
||||||
|
color.movePosition(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void movePosition(Vector2fc position) {
|
||||||
|
color.movePosition(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getRotation() {
|
||||||
|
return color.getRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRotation(float rotation) {
|
||||||
|
color.setRotation(rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void moveRotation(float rotation) {
|
||||||
|
color.moveRotation(rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getScaleX() {
|
||||||
|
return color.getScaleX();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setScaleX(float scale) {
|
||||||
|
color.setScaleX(scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getScaleY() {
|
||||||
|
return color.getScaleY();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setScaleY(float scale) {
|
||||||
|
color.setScaleY(scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setScale(float scale) {
|
||||||
|
color.setScale(scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setScale(float scaleX, float scaleY) {
|
||||||
|
color.setScale(scaleX, scaleY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float euclideanDistance(Placeable other) {
|
||||||
|
return color.euclideanDistance(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Matrix4fc getModelMatrix() {
|
||||||
|
return color.getModelMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
||||||
|
color.render(screen, camera, shaderManager);
|
||||||
|
super.render(screen, camera, shaderManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Color extends Sprite {
|
||||||
|
public Color(@NonNull MeshManager meshManager, float red, float green, float blue, float alpha) {
|
||||||
|
super(meshManager.createQuad(1, 1, 0, 0), Material.colored(red, green, blue, alpha));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,17 +7,15 @@ import com.bartlomiejpluta.base.api.game.map.layer.image.ImageLayerMode;
|
|||||||
import com.bartlomiejpluta.base.api.game.map.model.GameMap;
|
import com.bartlomiejpluta.base.api.game.map.model.GameMap;
|
||||||
import com.bartlomiejpluta.base.api.game.screen.Screen;
|
import com.bartlomiejpluta.base.api.game.screen.Screen;
|
||||||
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
|
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
|
||||||
|
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
public class DefaultImageLayer implements ImageLayer {
|
public class DefaultImageLayer extends BaseLayer implements ImageLayer {
|
||||||
private final float mapWidth;
|
private final float mapWidth;
|
||||||
private final float mapHeight;
|
private final float mapHeight;
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final GameMap map;
|
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Getter
|
@Getter
|
||||||
private Image image;
|
private Image image;
|
||||||
@@ -40,7 +38,7 @@ public class DefaultImageLayer implements ImageLayer {
|
|||||||
private boolean parallax;
|
private boolean parallax;
|
||||||
|
|
||||||
public DefaultImageLayer(GameMap map, Image image, float opacity, float x, float y, float scaleX, float scaleY, ImageLayerMode mode, boolean parallax) {
|
public DefaultImageLayer(GameMap map, Image image, float opacity, float x, float y, float scaleX, float scaleY, ImageLayerMode mode, boolean parallax) {
|
||||||
this.map = map;
|
super(map);
|
||||||
this.mapWidth = map.getWidth();
|
this.mapWidth = map.getWidth();
|
||||||
this.mapHeight = map.getHeight();
|
this.mapHeight = map.getHeight();
|
||||||
|
|
||||||
@@ -108,11 +106,6 @@ public class DefaultImageLayer implements ImageLayer {
|
|||||||
recalculate();
|
recalculate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update(float dt) {
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
@@ -127,5 +120,7 @@ public class DefaultImageLayer implements ImageLayer {
|
|||||||
|
|
||||||
image.render(screen, camera, shaderManager);
|
image.render(screen, camera, shaderManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
super.render(screen, camera, shaderManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ import com.bartlomiejpluta.base.api.game.map.model.GameMap;
|
|||||||
import com.bartlomiejpluta.base.api.game.rule.Rule;
|
import com.bartlomiejpluta.base.api.game.rule.Rule;
|
||||||
import com.bartlomiejpluta.base.api.game.screen.Screen;
|
import com.bartlomiejpluta.base.api.game.screen.Screen;
|
||||||
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
|
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
|
||||||
|
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import org.joml.Vector2fc;
|
|
||||||
import org.joml.Vector2ic;
|
import org.joml.Vector2ic;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -20,10 +20,7 @@ import java.util.LinkedList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
|
|
||||||
public class DefaultObjectLayer implements ObjectLayer {
|
public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final GameMap map;
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final List<Entity> entities;
|
private final List<Entity> entities;
|
||||||
@@ -40,13 +37,11 @@ public class DefaultObjectLayer implements ObjectLayer {
|
|||||||
|
|
||||||
private final int rows;
|
private final int rows;
|
||||||
private final int columns;
|
private final int columns;
|
||||||
private final Vector2fc stepSize;
|
|
||||||
|
|
||||||
public DefaultObjectLayer(@NonNull GameMap map, int rows, int columns, @NonNull Vector2fc stepSize, List<Entity> entities, PassageAbility[][] passageMap) {
|
public DefaultObjectLayer(@NonNull GameMap map, int rows, int columns, List<Entity> entities, PassageAbility[][] passageMap) {
|
||||||
this.map = map;
|
super(map);
|
||||||
this.rows = rows;
|
this.rows = rows;
|
||||||
this.columns = columns;
|
this.columns = columns;
|
||||||
this.stepSize = stepSize;
|
|
||||||
this.entities = entities;
|
this.entities = entities;
|
||||||
this.passageMap = passageMap;
|
this.passageMap = passageMap;
|
||||||
}
|
}
|
||||||
@@ -126,6 +121,8 @@ public class DefaultObjectLayer implements ObjectLayer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(float dt) {
|
public void update(float dt) {
|
||||||
|
super.update(dt);
|
||||||
|
|
||||||
while (!movements.isEmpty()) {
|
while (!movements.isEmpty()) {
|
||||||
var movement = movements.poll();
|
var movement = movements.poll();
|
||||||
if (isTileReachable(movement.getTo())) {
|
if (isTileReachable(movement.getTo())) {
|
||||||
@@ -171,6 +168,8 @@ public class DefaultObjectLayer implements ObjectLayer {
|
|||||||
for (var object : entities) {
|
for (var object : entities) {
|
||||||
object.render(screen, camera, shaderManager);
|
object.render(screen, camera, shaderManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
super.render(screen, camera, shaderManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int compareObjects(Entity a, Entity b) {
|
private int compareObjects(Entity a, Entity b) {
|
||||||
|
|||||||
@@ -5,22 +5,19 @@ import com.bartlomiejpluta.base.api.game.map.layer.tile.TileLayer;
|
|||||||
import com.bartlomiejpluta.base.api.game.map.model.GameMap;
|
import com.bartlomiejpluta.base.api.game.map.model.GameMap;
|
||||||
import com.bartlomiejpluta.base.api.game.screen.Screen;
|
import com.bartlomiejpluta.base.api.game.screen.Screen;
|
||||||
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
|
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
|
||||||
|
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
|
||||||
import com.bartlomiejpluta.base.engine.world.tileset.model.Tile;
|
import com.bartlomiejpluta.base.engine.world.tileset.model.Tile;
|
||||||
import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet;
|
import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet;
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
public class DefaultTileLayer implements TileLayer {
|
public class DefaultTileLayer extends BaseLayer implements TileLayer {
|
||||||
private final TileSet tileSet;
|
private final TileSet tileSet;
|
||||||
private final Tile[][] layer;
|
private final Tile[][] layer;
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final GameMap map;
|
|
||||||
|
|
||||||
public DefaultTileLayer(@NonNull GameMap map, @NonNull TileSet tileSet, int rows, int columns) {
|
public DefaultTileLayer(@NonNull GameMap map, @NonNull TileSet tileSet, int rows, int columns) {
|
||||||
this.map = map;
|
super(map);
|
||||||
this.tileSet = tileSet;
|
this.tileSet = tileSet;
|
||||||
layer = new Tile[rows][columns];
|
layer = new Tile[rows][columns];
|
||||||
Arrays.stream(layer).forEach(tiles -> Arrays.fill(tiles, null));
|
Arrays.stream(layer).forEach(tiles -> Arrays.fill(tiles, null));
|
||||||
@@ -46,11 +43,6 @@ public class DefaultTileLayer implements TileLayer {
|
|||||||
layer[row][column] = null;
|
layer[row][column] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update(float dt) {
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
||||||
for (var row : layer) {
|
for (var row : layer) {
|
||||||
@@ -60,5 +52,7 @@ public class DefaultTileLayer implements TileLayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
super.render(screen, camera, shaderManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap {
|
|||||||
Arrays.fill(passageMap[i], 0, columns, PassageAbility.ALLOW);
|
Arrays.fill(passageMap[i], 0, columns, PassageAbility.ALLOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
var layer = new DefaultObjectLayer(this, rows, columns, stepSize, new ArrayList<>(), passageMap);
|
var layer = new DefaultObjectLayer(this, rows, columns, new ArrayList<>(), passageMap);
|
||||||
|
|
||||||
layers.add(layer);
|
layers.add(layer);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user