Create action log panel in HUD
This commit is contained in:
BIN
data.mv.db
BIN
data.mv.db
Binary file not shown.
@@ -11,7 +11,7 @@ import com.bartlomiejpluta.base.lib.animation.AnimationRunner;
|
||||
import com.bartlomiejpluta.demo.runner.DemoRunner;
|
||||
import com.bartlomiejpluta.demo.world.weapon.Weapon;
|
||||
|
||||
public class Character extends EntityDelegate {
|
||||
public abstract class Character extends EntityDelegate {
|
||||
private static final Logger log = LoggerFactory.getLogger(Character.class);
|
||||
protected final Context context;
|
||||
protected final DemoRunner runner;
|
||||
@@ -72,6 +72,8 @@ public class Character extends EntityDelegate {
|
||||
}
|
||||
|
||||
protected void die() {
|
||||
log.info(toString() + " died with HP = " + hp);
|
||||
log.info(getName() + " died with HP = " + hp);
|
||||
}
|
||||
|
||||
public abstract String getName();
|
||||
}
|
||||
@@ -23,9 +23,13 @@ public class Enemy extends Character implements NPC {
|
||||
private AI ai = NoopAI.INSTANCE;
|
||||
private final AnimationRunner dieAnimation;
|
||||
|
||||
@Getter
|
||||
private final String name;
|
||||
|
||||
public Enemy(@NonNull Context context, @NonNull EnemyModel template) {
|
||||
super(context, context.createEntity(template.getEntitySet()));
|
||||
this.template = template;
|
||||
name = template.getName();
|
||||
hp = template.getHp();
|
||||
setSpeed(template.getSpeed());
|
||||
setAnimationSpeed(template.getAnimationSpeed());
|
||||
@@ -58,14 +62,9 @@ public class Enemy extends Character implements NPC {
|
||||
|
||||
ai = NoopAI.INSTANCE;
|
||||
|
||||
getLayer().handleEvent(new EnemyDiedEvent(this));
|
||||
dieAnimation.run(context, getLayer(), this);
|
||||
context.playSound(template.getDieSound());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return template.getName() + "@" + hashCode();
|
||||
context.fireEvent(new EnemyDiedEvent(this));
|
||||
}
|
||||
|
||||
public Enemy followAndAttack(Character target, int range) {
|
||||
|
||||
@@ -17,4 +17,9 @@ public class Player extends Character {
|
||||
super.die();
|
||||
runner.returnToStartMenu();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Player";
|
||||
}
|
||||
}
|
||||
22
src/main/java/com/bartlomiejpluta/demo/event/HitEvent.java
Normal file
22
src/main/java/com/bartlomiejpluta/demo/event/HitEvent.java
Normal file
@@ -0,0 +1,22 @@
|
||||
package com.bartlomiejpluta.demo.event;
|
||||
|
||||
import lombok.*;
|
||||
|
||||
import com.bartlomiejpluta.base.api.event.*;
|
||||
import com.bartlomiejpluta.base.lib.event.*;
|
||||
import com.bartlomiejpluta.demo.entity.Character;
|
||||
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
public class HitEvent extends BaseEvent {
|
||||
public static final EventType<HitEvent> TYPE = new EventType<>("HIT_EVENT");
|
||||
|
||||
private final Character attacker;
|
||||
private final Character target;
|
||||
private final int damage;
|
||||
|
||||
@Override
|
||||
public EventType<HitEvent> getType() {
|
||||
return TYPE;
|
||||
}
|
||||
}
|
||||
@@ -10,19 +10,61 @@ import com.bartlomiejpluta.base.api.input.*;
|
||||
import com.bartlomiejpluta.demo.runner.DemoRunner;
|
||||
import com.bartlomiejpluta.demo.entity.*;
|
||||
|
||||
import com.bartlomiejpluta.demo.event.*;
|
||||
import com.bartlomiejpluta.demo.util.LimitedQueue;
|
||||
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class HUD extends BorderLayout {
|
||||
private static final int MAX_LOG_SIZE = 10;
|
||||
private static final float LOG_VISIBILITY_DURATION = 8000f;
|
||||
private static final float LOG_VISIBILITY_FADING_OUT = 1000f;
|
||||
private final DemoRunner runner;
|
||||
private final Player player;
|
||||
private final Runtime runtime;
|
||||
private LimitedQueue<String> log = new LimitedQueue<>(MAX_LOG_SIZE);
|
||||
|
||||
private float logVisibilityDuration = 0f;
|
||||
|
||||
@Ref("debug")
|
||||
private Label debugLbl;
|
||||
|
||||
@Ref("log")
|
||||
private Label logLbl;
|
||||
|
||||
public HUD(Context context, GUI gui) {
|
||||
super(context, gui);
|
||||
this.runner = (DemoRunner) context.getGameRunner();
|
||||
this.player = runner.getPlayer();
|
||||
this.runtime = Runtime.getRuntime();
|
||||
context.addEventListener(HitEvent.TYPE, this::logHitEvent);
|
||||
context.addEventListener(EnemyDiedEvent.TYPE, this::logEnemyDiedEvent);
|
||||
}
|
||||
|
||||
private void logHitEvent(HitEvent event) {
|
||||
log.add(String.format("%s hits %s with damage = %d", event.getAttacker().getName(), event.getTarget().getName(), event.getDamage()));
|
||||
updateLog();
|
||||
}
|
||||
|
||||
private void updateLog() {
|
||||
logLbl.setText(log.stream().collect(Collectors.joining("\n")));
|
||||
logVisibilityDuration = LOG_VISIBILITY_DURATION;
|
||||
}
|
||||
|
||||
private void logEnemyDiedEvent(EnemyDiedEvent event) {
|
||||
log.add(String.format("%s has died with HP = %d", event.getEnemy().getName(), event.getEnemy().getHp()));
|
||||
updateLog();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(float dt) {
|
||||
super.update(dt);
|
||||
|
||||
if(logVisibilityDuration > 0) {
|
||||
logVisibilityDuration -= dt * 1000;
|
||||
} else {
|
||||
logVisibilityDuration = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -41,6 +83,8 @@ public class HUD extends BorderLayout {
|
||||
pos.x(), pos.y())
|
||||
);
|
||||
|
||||
logLbl.setAlpha(Math.min(1f, logVisibilityDuration / LOG_VISIBILITY_FADING_OUT));
|
||||
|
||||
super.draw(screen, gui);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.bartlomiejpluta.demo.util;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.LinkedList;
|
||||
|
||||
@AllArgsConstructor
|
||||
public class LimitedQueue<E> extends LinkedList<E> {
|
||||
private int limit;
|
||||
|
||||
@Override
|
||||
public boolean add(E o) {
|
||||
super.add(o);
|
||||
|
||||
while (size() > limit) {
|
||||
super.remove();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,8 @@ import com.bartlomiejpluta.demo.database.model.MeleeWeaponModel;
|
||||
import com.bartlomiejpluta.demo.entity.Character;
|
||||
import com.bartlomiejpluta.demo.util.DiceRoller;
|
||||
|
||||
import com.bartlomiejpluta.demo.event.HitEvent;
|
||||
|
||||
public class MeleeWeapon implements Weapon {
|
||||
private final Random random = new Random();
|
||||
private final Context context;
|
||||
@@ -43,9 +45,12 @@ public class MeleeWeapon implements Weapon {
|
||||
var facingNeighbour = attacker.getCoordinates().add(attacker.getFaceDirection().vector, new Vector2i());
|
||||
for(var entity : attacker.getLayer().getEntities()) {
|
||||
if(entity.getCoordinates().equals(facingNeighbour) && entity.isBlocking() && entity instanceof Character) {
|
||||
((Character) entity).hit(roller.roll());
|
||||
animation.run(context, entity.getLayer(), entity);
|
||||
var character = (Character) entity;
|
||||
var damage = roller.roll();
|
||||
character.hit(damage);
|
||||
animation.run(context, character.getLayer(), character);
|
||||
context.playSound(sound);
|
||||
context.fireEvent(new HitEvent(attacker, character, damage));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,12 +5,14 @@ import java.util.Random;
|
||||
import lombok.*;
|
||||
import com.bartlomiejpluta.base.api.context.Context;
|
||||
import com.bartlomiejpluta.base.api.entity.Entity;
|
||||
import com.bartlomiejpluta.base.api.move.Direction;
|
||||
import com.bartlomiejpluta.base.api.move.*;
|
||||
import com.bartlomiejpluta.base.lib.animation.*;
|
||||
import com.bartlomiejpluta.demo.database.model.RangedWeaponModel;
|
||||
import com.bartlomiejpluta.demo.entity.Character;
|
||||
import com.bartlomiejpluta.demo.util.DiceRoller;
|
||||
|
||||
import com.bartlomiejpluta.demo.event.HitEvent;
|
||||
|
||||
public class RangedWeapon implements Weapon {
|
||||
private final Random random = new Random();
|
||||
private final Context context;
|
||||
@@ -44,12 +46,14 @@ public class RangedWeapon implements Weapon {
|
||||
this.punchSound = template.getPunchSound();
|
||||
}
|
||||
|
||||
private void onHit(Entity entity) {
|
||||
if(entity.isBlocking() && entity instanceof Character) {
|
||||
var character = (Character) entity;
|
||||
character.hit(roller.roll());
|
||||
private void onHit(Movable attacker, Entity target) {
|
||||
if(target.isBlocking() && target instanceof Character) {
|
||||
var character = (Character) target;
|
||||
var damage = roller.roll();
|
||||
character.hit(damage);
|
||||
punchAnimation.run(context, character.getLayer(), character);
|
||||
context.playSound(punchSound);
|
||||
context.fireEvent(new HitEvent((Character) attacker, character, damage));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,21 @@
|
||||
width="1f"
|
||||
height="1f">
|
||||
|
||||
<base:BorderLayout-BottomLeft>
|
||||
|
||||
<base:Label
|
||||
ref="log"
|
||||
font=""2261c04f-b02e-4486-b388-8a0fa41622e9""
|
||||
widthMode="SizeMode.ABSOLUTE"
|
||||
width="400f"
|
||||
height="25f"
|
||||
margin="10f"
|
||||
alignment="GUI.ALIGN_BOTTOM | GUI.ALIGN_LEFT"
|
||||
color="0xFFFFFF"
|
||||
fontSize="15f"/>
|
||||
|
||||
</base:BorderLayout-BottomLeft>
|
||||
|
||||
<base:BorderLayout-BottomRight>
|
||||
|
||||
<base:Label
|
||||
|
||||
Reference in New Issue
Block a user