perf(sprites): Optimized numbers

Now numbers are lazy loaded
This commit is contained in:
Jakub Žitník 2025-03-25 12:58:14 +01:00
parent 1c1230a1d0
commit ca98fe7fae
Signed by: jzitnik
GPG Key ID: C577A802A6AF4EF3
11 changed files with 45 additions and 31 deletions

View File

@ -1,6 +1,7 @@
package cz.jzitnik.game;
import cz.jzitnik.game.sprites.*;
import cz.jzitnik.game.sprites.ui.Number;
import cz.jzitnik.tui.Sprite;
import cz.jzitnik.tui.SpriteList;
import lombok.extern.slf4j.Slf4j;
@ -78,6 +79,7 @@ public class SpriteLoader {
BREAKING,
HEART,
HUNGER,
NUMBER,
// Seeds
WHEAT,
@ -263,6 +265,7 @@ public class SpriteLoader {
SPRITES_MAP.put(SPRITES.BREAKING, new Breaking());
SPRITES_MAP.put(SPRITES.HEART, new Heart());
SPRITES_MAP.put(SPRITES.HUNGER, new Hunger());
SPRITES_MAP.put(SPRITES.NUMBER, new Number());
// SEEDS
SPRITES_MAP.put(SPRITES.WHEAT, new Farmable("dirt.ans", "grass.ans", "sand.ans"));

View File

@ -50,7 +50,7 @@ public class Furnace implements RightClickHandler, Serializable {
? spriteList.getSprite(outputItem.getItem().getFirst().getSprite())
.getSprite(outputItem.getItem().getFirst().getSpriteState().get())
: spriteList.getSprite(outputItem.getItem().getFirst().getSprite()).getSprite(),
Numbers.getNumberSprite(outputItem.getAmount())).split("\n");
Numbers.getNumberSprite(outputItem.getAmount(), spriteList)).split("\n");
for (int j = 0; j < CELL_HEIGHT; j++) {
buffer.append("\033[0m").append(" ".repeat(moveLeft));

View File

@ -173,7 +173,6 @@ public class CustomAnnotationHandler implements CustomPlaceHandler {
private boolean placeFarmable(Game game, int x, int y) {
var blocksBottom = game.getWorld()[y + 1][x];
System.out.println("lol");
if (blocksBottom.stream().noneMatch(block -> block.getBlockId().equals("farmland"))) {
return false;

View File

@ -2,18 +2,23 @@ package cz.jzitnik.game.handlers.place;
import cz.jzitnik.game.Game;
import cz.jzitnik.game.entities.Block;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class DefaultPlaceHandler implements CustomPlaceHandler {
@Override
public boolean place(Game game, int x, int y) {
var blocks = game.getWorld()[y][x];
var inventory = game.getInventory();
var block = inventory.getItemInHand().get().getBlock().get();
blocks.add(inventory.getItemInHand().get().getBlock().get());
blocks.add(block);
blocks.removeAll(blocks.stream().filter(Block::isFlowing).toList());
inventory.decreaseItemInHand();
log.info("Block {} was placed at coordinates x:{},y:{}", block.getBlockId(), x, y);
return true;
}

View File

@ -1,10 +1,8 @@
package cz.jzitnik.game.sprites;
import cz.jzitnik.tui.ResourceLoader;
import cz.jzitnik.tui.Sprite;
import java.util.HashMap;
import java.util.Optional;
public class Sheep extends Sprite<Sheep.SheepState> {
public enum SheepState {

View File

@ -1,16 +1,34 @@
package cz.jzitnik.game.sprites.ui;
import cz.jzitnik.tui.ResourceLoader;
import cz.jzitnik.tui.Sprite;
import lombok.extern.slf4j.Slf4j;
import java.util.Objects;
import java.util.HashMap;
import java.util.Optional;
public class Number extends Sprite {
@Slf4j
public class Number extends Sprite<Number.NumberState> {
public enum NumberState {
ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE,
}
public Number() {
loadResources(new HashMap<>() {
{
put(NumberState.ZERO, "numbers/0.ans");
put(NumberState.ONE, "numbers/1.ans");
put(NumberState.TWO, "numbers/2.ans");
put(NumberState.THREE, "numbers/3.ans");
put(NumberState.FOUR, "numbers/4.ans");
put(NumberState.FIVE, "numbers/5.ans");
put(NumberState.SIX, "numbers/6.ans");
put(NumberState.SEVEN, "numbers/7.ans");
put(NumberState.EIGHT, "numbers/8.ans");
put(NumberState.NINE, "numbers/9.ans");
}
}, NumberState.class);
}
public static String fixForHotbar(String str, int place) {
var parts = str.split("\n");
// Make it 50x25
@ -30,27 +48,16 @@ public class Number extends Sprite {
private String fix(String x) {
return x;
// return x.replaceAll("\033\\[38;5;1;48;5;16m", "\033[0m").replaceAll("\033\\[38;5;16;48;5;16m▓", "\033[0m ");
// // TODO: Fix issue with sprite size decreasing
// TODO: Fix issue with sprite size decreasing
}
public String getSprite() {
return fix(Objects.requireNonNull(ResourceLoader.loadResource("breaking/1.ans")));
return getSprite(NumberState.ZERO);
}
public String getSprite(Enum key) {
return fix(Objects.requireNonNull(ResourceLoader.loadResource(switch (key) {
case NumberState.ZERO -> "numbers/0.ans";
case NumberState.ONE -> "numbers/1.ans";
case NumberState.TWO -> "numbers/2.ans";
case NumberState.THREE -> "numbers/3.ans";
case NumberState.FOUR -> "numbers/4.ans";
case NumberState.FIVE -> "numbers/5.ans";
case NumberState.SIX -> "numbers/6.ans";
case NumberState.SEVEN -> "numbers/7.ans";
case NumberState.EIGHT -> "numbers/8.ans";
case NumberState.NINE -> "numbers/9.ans";
default -> throw new IllegalStateException("Unexpected value: " + key);
})));
public String getSprite(NumberState key) {
log.debug("{}", key);
return fix(getResource(key));
}
@Override

View File

@ -71,7 +71,7 @@ public class CraftingTable {
? spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite())
.getSprite(inventoryItem.getItem().getFirst().getSpriteState().get())
: spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(),
Numbers.getNumberSprite(inventoryItem.getAmount())).split("\n")).orElse(null);
Numbers.getNumberSprite(inventoryItem.getAmount(), spriteList)).split("\n")).orElse(null);
for (int i = 0; i < ROW_AMOUNT; i++) {
for (int j = 0; j < CELL_HEIGHT; j++) {

View File

@ -261,14 +261,14 @@ public class Inventory extends AutoTransientSupport {
.get())
: spriteList.getSprite(item.getItem().getFirst().getSprite())
.getSprite(),
Numbers.getNumberSprite(item.getAmount())));
Numbers.getNumberSprite(item.getAmount(), spriteList)));
} else {
sprite = SpriteCombiner.combineTwoSprites(
item.getItem().getFirst().getSpriteState().isPresent()
? spriteList.getSprite(item.getItem().getFirst().getSprite())
.getSprite(item.getItem().getFirst().getSpriteState().get())
: spriteList.getSprite(item.getItem().getFirst().getSprite()).getSprite(),
Numbers.getNumberSprite(item.getAmount()));
Numbers.getNumberSprite(item.getAmount(), spriteList));
}
if (item.getItem().getFirst().getDurability() == 0

View File

@ -58,7 +58,7 @@ public class SmallCraftingTable {
? spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite())
.getSprite(inventoryItem.getItem().getFirst().getSpriteState().get())
: spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(),
Numbers.getNumberSprite(inventoryItem.getAmount())).split("\n")).orElse(null);
Numbers.getNumberSprite(inventoryItem.getAmount(), spriteList)).split("\n")).orElse(null);
int counter = 0;
for (int i = 0; i < ROW_AMOUNT; i++) {

View File

@ -9,7 +9,7 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ResourceLoader {
public static String loadResource(String fileName) {
log.debug("Loading resource: {}", "textures/" + fileName);
log.info("Loading resource: {}", "textures/" + fileName);
try (InputStream inputStream = ResourceLoader.class.getClassLoader()
.getResourceAsStream("textures/" + fileName)) {
if (inputStream == null) {

View File

@ -1,6 +1,8 @@
package cz.jzitnik.tui.utils;
import cz.jzitnik.game.SpriteLoader;
import cz.jzitnik.game.sprites.ui.Number;
import cz.jzitnik.tui.SpriteList;
public class Numbers {
private static Number.NumberState getNumberState(int digit) {
@ -19,7 +21,7 @@ public class Numbers {
};
}
public static String getNumberSprite(int number) {
public static String getNumberSprite(int number, SpriteList spriteList) {
if (number == 1) {
StringBuilder sprite = new StringBuilder();
for (int i = 0; i < 25; i++) {
@ -29,7 +31,7 @@ public class Numbers {
return sprite.toString();
}
Number nm = new Number();
var nm = spriteList.getSprite(SpriteLoader.SPRITES.NUMBER);
if (number <= 9) {
Number.NumberState numberState = getNumberState(number);