package com.galvarez.ttw.rendering;
import com.artemis.Aspect;
import com.artemis.ComponentMapper;
import com.artemis.Entity;
import com.artemis.annotations.Wire;
import com.artemis.systems.EntityProcessingSystem;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.galvarez.ttw.EntityFactory;
import com.galvarez.ttw.model.map.MapPosition;
import com.galvarez.ttw.model.map.MapTools;
import com.galvarez.ttw.rendering.IconsSystem.Type;
import com.galvarez.ttw.rendering.components.FadingMessage;
import com.galvarez.ttw.rendering.components.MutableMapPosition;
import com.galvarez.ttw.utils.FloatPair;
import com.galvarez.ttw.utils.Font;
@Wire
public final class FadingMessageRenderSystem extends EntityProcessingSystem {
private ComponentMapper<MutableMapPosition> mmpm;
private ComponentMapper<FadingMessage> fmm;
private IconsSystem icons;
private final SpriteBatch batch;
private final OrthographicCamera camera;
private final BitmapFont font;
@SuppressWarnings("unchecked")
public FadingMessageRenderSystem(OrthographicCamera camera, SpriteBatch batch) {
super(Aspect.getAspectForAll(MutableMapPosition.class, FadingMessage.class));
this.batch = batch;
this.camera = camera;
font = Font.IRIS_UPC.get();
font.setUseIntegerPositions(false);
}
public void createFadingIcon(Type icon, Color color, MapPosition pos, float duration) {
EntityFactory.createFadingTileIcon(world, icons.getTexture(icon), color, pos.x, pos.y, duration);
}
@Override
protected void begin() {
batch.setProjectionMatrix(camera.combined);
batch.begin();
batch.setColor(1, 1, 1, 1);
}
@Override
protected void process(Entity e) {
MutableMapPosition position = mmpm.get(e);
FadingMessage message = fmm.get(e);
FloatPair drawPosition = MapTools.world2window(position.x, position.y);
if (message.label != null)
drawLabel(drawPosition, message);
if (message.icon != null)
drawIcon(drawPosition, message);
position.x += message.vx * world.getDelta();
position.y += message.vy * world.getDelta();
message.currentTime += world.getDelta();
if (message.currentTime >= message.duration)
e.deleteFromWorld();
}
private void drawLabel(FloatPair drawPosition, FadingMessage message) {
float posX = drawPosition.x - message.label.length() * font.getSpaceWidth();
float posY = drawPosition.y;
Color color = message.color;
font.setColor(color.r, color.g, color.b, 1f - message.currentTime / message.duration);
font.draw(batch, message.label, posX, posY);
}
private void drawIcon(FloatPair drawPosition, FadingMessage message) {
float posX = drawPosition.x - message.icon.getRegionWidth() / 2;
float posY = drawPosition.y;
Color color = message.color;
Color oldColor = batch.getColor();
batch.setColor(color.r, color.g, color.b, 1f - message.currentTime / message.duration);
batch.draw(message.icon, posX, posY);
batch.setColor(oldColor);
}
@Override
protected void end() {
batch.end();
}
}