forked from jzitnik/twodcraft
perf(sprites): Optimized numbers
Now numbers are lazy loaded
This commit is contained in:
parent
1c1230a1d0
commit
ca98fe7fae
@ -1,6 +1,7 @@
|
|||||||
package cz.jzitnik.game;
|
package cz.jzitnik.game;
|
||||||
|
|
||||||
import cz.jzitnik.game.sprites.*;
|
import cz.jzitnik.game.sprites.*;
|
||||||
|
import cz.jzitnik.game.sprites.ui.Number;
|
||||||
import cz.jzitnik.tui.Sprite;
|
import cz.jzitnik.tui.Sprite;
|
||||||
import cz.jzitnik.tui.SpriteList;
|
import cz.jzitnik.tui.SpriteList;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -78,6 +79,7 @@ public class SpriteLoader {
|
|||||||
BREAKING,
|
BREAKING,
|
||||||
HEART,
|
HEART,
|
||||||
HUNGER,
|
HUNGER,
|
||||||
|
NUMBER,
|
||||||
|
|
||||||
// Seeds
|
// Seeds
|
||||||
WHEAT,
|
WHEAT,
|
||||||
@ -263,6 +265,7 @@ public class SpriteLoader {
|
|||||||
SPRITES_MAP.put(SPRITES.BREAKING, new Breaking());
|
SPRITES_MAP.put(SPRITES.BREAKING, new Breaking());
|
||||||
SPRITES_MAP.put(SPRITES.HEART, new Heart());
|
SPRITES_MAP.put(SPRITES.HEART, new Heart());
|
||||||
SPRITES_MAP.put(SPRITES.HUNGER, new Hunger());
|
SPRITES_MAP.put(SPRITES.HUNGER, new Hunger());
|
||||||
|
SPRITES_MAP.put(SPRITES.NUMBER, new Number());
|
||||||
|
|
||||||
// SEEDS
|
// SEEDS
|
||||||
SPRITES_MAP.put(SPRITES.WHEAT, new Farmable("dirt.ans", "grass.ans", "sand.ans"));
|
SPRITES_MAP.put(SPRITES.WHEAT, new Farmable("dirt.ans", "grass.ans", "sand.ans"));
|
||||||
|
@ -50,7 +50,7 @@ public class Furnace implements RightClickHandler, Serializable {
|
|||||||
? spriteList.getSprite(outputItem.getItem().getFirst().getSprite())
|
? spriteList.getSprite(outputItem.getItem().getFirst().getSprite())
|
||||||
.getSprite(outputItem.getItem().getFirst().getSpriteState().get())
|
.getSprite(outputItem.getItem().getFirst().getSpriteState().get())
|
||||||
: spriteList.getSprite(outputItem.getItem().getFirst().getSprite()).getSprite(),
|
: 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++) {
|
for (int j = 0; j < CELL_HEIGHT; j++) {
|
||||||
buffer.append("\033[0m").append(" ".repeat(moveLeft));
|
buffer.append("\033[0m").append(" ".repeat(moveLeft));
|
||||||
|
@ -173,7 +173,6 @@ public class CustomAnnotationHandler implements CustomPlaceHandler {
|
|||||||
|
|
||||||
private boolean placeFarmable(Game game, int x, int y) {
|
private boolean placeFarmable(Game game, int x, int y) {
|
||||||
var blocksBottom = game.getWorld()[y + 1][x];
|
var blocksBottom = game.getWorld()[y + 1][x];
|
||||||
System.out.println("lol");
|
|
||||||
|
|
||||||
if (blocksBottom.stream().noneMatch(block -> block.getBlockId().equals("farmland"))) {
|
if (blocksBottom.stream().noneMatch(block -> block.getBlockId().equals("farmland"))) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -2,18 +2,23 @@ package cz.jzitnik.game.handlers.place;
|
|||||||
|
|
||||||
import cz.jzitnik.game.Game;
|
import cz.jzitnik.game.Game;
|
||||||
import cz.jzitnik.game.entities.Block;
|
import cz.jzitnik.game.entities.Block;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
public class DefaultPlaceHandler implements CustomPlaceHandler {
|
public class DefaultPlaceHandler implements CustomPlaceHandler {
|
||||||
@Override
|
@Override
|
||||||
public boolean place(Game game, int x, int y) {
|
public boolean place(Game game, int x, int y) {
|
||||||
var blocks = game.getWorld()[y][x];
|
var blocks = game.getWorld()[y][x];
|
||||||
var inventory = game.getInventory();
|
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());
|
blocks.removeAll(blocks.stream().filter(Block::isFlowing).toList());
|
||||||
|
|
||||||
inventory.decreaseItemInHand();
|
inventory.decreaseItemInHand();
|
||||||
|
|
||||||
|
log.info("Block {} was placed at coordinates x:{},y:{}", block.getBlockId(), x, y);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
package cz.jzitnik.game.sprites;
|
package cz.jzitnik.game.sprites;
|
||||||
|
|
||||||
import cz.jzitnik.tui.ResourceLoader;
|
|
||||||
import cz.jzitnik.tui.Sprite;
|
import cz.jzitnik.tui.Sprite;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public class Sheep extends Sprite<Sheep.SheepState> {
|
public class Sheep extends Sprite<Sheep.SheepState> {
|
||||||
public enum SheepState {
|
public enum SheepState {
|
||||||
|
@ -1,16 +1,34 @@
|
|||||||
package cz.jzitnik.game.sprites.ui;
|
package cz.jzitnik.game.sprites.ui;
|
||||||
|
|
||||||
import cz.jzitnik.tui.ResourceLoader;
|
|
||||||
import cz.jzitnik.tui.Sprite;
|
import cz.jzitnik.tui.Sprite;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.HashMap;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public class Number extends Sprite {
|
@Slf4j
|
||||||
|
public class Number extends Sprite<Number.NumberState> {
|
||||||
public enum NumberState {
|
public enum NumberState {
|
||||||
ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE,
|
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) {
|
public static String fixForHotbar(String str, int place) {
|
||||||
var parts = str.split("\n");
|
var parts = str.split("\n");
|
||||||
// Make it 50x25
|
// Make it 50x25
|
||||||
@ -30,27 +48,16 @@ public class Number extends Sprite {
|
|||||||
private String fix(String x) {
|
private String fix(String x) {
|
||||||
return 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 ");
|
// 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() {
|
public String getSprite() {
|
||||||
return fix(Objects.requireNonNull(ResourceLoader.loadResource("breaking/1.ans")));
|
return getSprite(NumberState.ZERO);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSprite(Enum key) {
|
public String getSprite(NumberState key) {
|
||||||
return fix(Objects.requireNonNull(ResourceLoader.loadResource(switch (key) {
|
log.debug("{}", key);
|
||||||
case NumberState.ZERO -> "numbers/0.ans";
|
return fix(getResource(key));
|
||||||
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);
|
|
||||||
})));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -71,7 +71,7 @@ public class CraftingTable {
|
|||||||
? spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite())
|
? spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite())
|
||||||
.getSprite(inventoryItem.getItem().getFirst().getSpriteState().get())
|
.getSprite(inventoryItem.getItem().getFirst().getSpriteState().get())
|
||||||
: spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(),
|
: 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 i = 0; i < ROW_AMOUNT; i++) {
|
||||||
for (int j = 0; j < CELL_HEIGHT; j++) {
|
for (int j = 0; j < CELL_HEIGHT; j++) {
|
||||||
|
@ -261,14 +261,14 @@ public class Inventory extends AutoTransientSupport {
|
|||||||
.get())
|
.get())
|
||||||
: spriteList.getSprite(item.getItem().getFirst().getSprite())
|
: spriteList.getSprite(item.getItem().getFirst().getSprite())
|
||||||
.getSprite(),
|
.getSprite(),
|
||||||
Numbers.getNumberSprite(item.getAmount())));
|
Numbers.getNumberSprite(item.getAmount(), spriteList)));
|
||||||
} else {
|
} else {
|
||||||
sprite = SpriteCombiner.combineTwoSprites(
|
sprite = SpriteCombiner.combineTwoSprites(
|
||||||
item.getItem().getFirst().getSpriteState().isPresent()
|
item.getItem().getFirst().getSpriteState().isPresent()
|
||||||
? spriteList.getSprite(item.getItem().getFirst().getSprite())
|
? spriteList.getSprite(item.getItem().getFirst().getSprite())
|
||||||
.getSprite(item.getItem().getFirst().getSpriteState().get())
|
.getSprite(item.getItem().getFirst().getSpriteState().get())
|
||||||
: spriteList.getSprite(item.getItem().getFirst().getSprite()).getSprite(),
|
: spriteList.getSprite(item.getItem().getFirst().getSprite()).getSprite(),
|
||||||
Numbers.getNumberSprite(item.getAmount()));
|
Numbers.getNumberSprite(item.getAmount(), spriteList));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.getItem().getFirst().getDurability() == 0
|
if (item.getItem().getFirst().getDurability() == 0
|
||||||
|
@ -58,7 +58,7 @@ public class SmallCraftingTable {
|
|||||||
? spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite())
|
? spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite())
|
||||||
.getSprite(inventoryItem.getItem().getFirst().getSpriteState().get())
|
.getSprite(inventoryItem.getItem().getFirst().getSpriteState().get())
|
||||||
: spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(),
|
: 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;
|
int counter = 0;
|
||||||
for (int i = 0; i < ROW_AMOUNT; i++) {
|
for (int i = 0; i < ROW_AMOUNT; i++) {
|
||||||
|
@ -9,7 +9,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class ResourceLoader {
|
public class ResourceLoader {
|
||||||
public static String loadResource(String fileName) {
|
public static String loadResource(String fileName) {
|
||||||
log.debug("Loading resource: {}", "textures/" + fileName);
|
log.info("Loading resource: {}", "textures/" + fileName);
|
||||||
try (InputStream inputStream = ResourceLoader.class.getClassLoader()
|
try (InputStream inputStream = ResourceLoader.class.getClassLoader()
|
||||||
.getResourceAsStream("textures/" + fileName)) {
|
.getResourceAsStream("textures/" + fileName)) {
|
||||||
if (inputStream == null) {
|
if (inputStream == null) {
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package cz.jzitnik.tui.utils;
|
package cz.jzitnik.tui.utils;
|
||||||
|
|
||||||
|
import cz.jzitnik.game.SpriteLoader;
|
||||||
import cz.jzitnik.game.sprites.ui.Number;
|
import cz.jzitnik.game.sprites.ui.Number;
|
||||||
|
import cz.jzitnik.tui.SpriteList;
|
||||||
|
|
||||||
public class Numbers {
|
public class Numbers {
|
||||||
private static Number.NumberState getNumberState(int digit) {
|
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) {
|
if (number == 1) {
|
||||||
StringBuilder sprite = new StringBuilder();
|
StringBuilder sprite = new StringBuilder();
|
||||||
for (int i = 0; i < 25; i++) {
|
for (int i = 0; i < 25; i++) {
|
||||||
@ -29,7 +31,7 @@ public class Numbers {
|
|||||||
return sprite.toString();
|
return sprite.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
Number nm = new Number();
|
var nm = spriteList.getSprite(SpriteLoader.SPRITES.NUMBER);
|
||||||
if (number <= 9) {
|
if (number <= 9) {
|
||||||
Number.NumberState numberState = getNumberState(number);
|
Number.NumberState numberState = getNumberState(number);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user