Cleaned json code and added sprite variants

This commit is contained in:
2026-04-03 00:14:58 -03:00
parent 458d30f107
commit fee4237e91
13 changed files with 76 additions and 28 deletions

View File

@@ -11,11 +11,27 @@
"height": 350 "height": 350
}, },
"sprites": [ "sprites": [
{ "type": "BORDER", "group": "cameras", "key": "borderline", "frame": 0, "x": 0, "y": 0, "zIndex": 0 }, { "type": "BORDER", "group": "cameras","variant": {
{ "type": "MAP", "group": "cameras", "key": "map", "frame": 0, "x": 550, "y": 310, "fromTop": true, "zIndex": 1 }, "spriteKey": "borderline",
"frame": 0
}, "x": 0, "y": 0, "zIndex": 0 },
{ "type": "MAP", "group": "cameras", "variant": {
"spriteKey": "map",
"frame": 0
}, "x": 550, "y": 310, "fromTop": true, "zIndex": 1 },
{ "type": "LABEL", "x": 550, "y": 280, "fromTop": true, "zIndex": 2 }, { "type": "LABEL", "x": 550, "y": 280, "fromTop": true, "zIndex": 2 },
{ "type": "REC", "group": "cameras", "key": "recordSprite", "frame": 0, "x": 40, "y": 40, "fromTop": true, "zIndex": 3 },
{ "type": "SIGNAL_INTERRUPTED", "group": "cameras", "key": "signalInterrupted", "frame": 0, "x": 0, "y": 80, "fromTop": true, "centerX": true, "zIndex": 10 } { "type": "REC", "group": "cameras", "variant": {
"spriteKey": "recordSprite",
"frame": 0
}, "x": 40, "y": 40, "fromTop": true, "zIndex": 3 },
{ "type": "SIGNAL_INTERRUPTED", "group": "cameras", "variant": {
"spriteKey": "signalInterrupted",
"frame": 0
}, "x": 0, "y": 80, "fromTop": true, "centerX": true, "zIndex": 10 }
], ],
"cameras": [ "cameras": [
{ {

View File

@@ -22,7 +22,7 @@
}, },
"ranges": { "ranges": {
"inside": { "base": "sprites/office/inside/", "start": 0, "end": 4 }, "inside": { "base": "sprites/office/inside/{i}.png", "start": 0, "end": 4 },
"hallway": { "base": "sprites/office/hallway/", "start": 0, "end": 10 }, "hallway": { "base": "sprites/office/hallway/", "start": 0, "end": 10 },
"rightVents": { "base": "sprites/office/right_vents/", "start": 0, "end": 2 }, "rightVents": { "base": "sprites/office/right_vents/", "start": 0, "end": 2 },
"leftVents": { "base": "sprites/office/left_vents/", "start": 0, "end": 2 }, "leftVents": { "base": "sprites/office/left_vents/", "start": 0, "end": 2 },

View File

@@ -7,6 +7,7 @@ import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.Json;
import io.github.eldek0.asset.group.*; import io.github.eldek0.asset.group.*;
import io.github.eldek0.config.FrameRange;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
@@ -61,6 +62,7 @@ public class GameAssetManager {
/** Queue all in-game assets for async loading. Call update() each frame until done. */ /** Queue all in-game assets for async loading. Call update() each frame until done. */
public void loadGameAssets() { public void loadGameAssets() {
json.setIgnoreUnknownFields(true); json.setIgnoreUnknownFields(true);
json.addClassTag("FrameRange", FrameRange.class);
monitorData = load("monitor.json", MonitorAssets.Data.class); monitorData = load("monitor.json", MonitorAssets.Data.class);
officeData = load("office.json", OfficeAssets.Data.class); officeData = load("office.json", OfficeAssets.Data.class);
@@ -185,6 +187,11 @@ public class GameAssetManager {
// ========================================================= // =========================================================
public float getProgress() { return manager.getProgress(); } public float getProgress() { return manager.getProgress(); }
public void finishLoading(){ manager.finishLoading(); fetchAll(); } public void finishLoading(){
public void dispose() { manager.dispose(); } manager.finishLoading();
fetchAll();
}
public void dispose(){
manager.dispose();
}
} }

View File

@@ -8,23 +8,23 @@ public abstract class AssetBase {
public abstract static class Data {} public abstract static class Data {}
protected void queueRange(AssetManager m, FrameRange r) { protected void queueRange(AssetManager m, FrameRange r) {
for (int i = r.start; i <= r.end; i++) m.load(r.base + i + ".png", Texture.class); for (int i = r.start; i <= r.end; i++) m.load(r.path(i), Texture.class);
} }
protected Texture[] fetchRange(AssetManager m, FrameRange r) { protected Texture[] fetchRange(AssetManager m, FrameRange r) {
Texture[] arr = new Texture[r.end - r.start + 1]; Texture[] arr = new Texture[r.end - r.start + 1];
for (int i = r.start; i <= r.end; i++) for (int i = r.start; i <= r.end; i++)
arr[i - r.start] = m.get(r.base + i + ".png", Texture.class); arr[i - r.start] = m.get(r.path(i), Texture.class);
return arr; return arr;
} }
protected void disposeRange(AssetManager m, FrameRange r) { protected void disposeRange(AssetManager m, FrameRange r) {
for (int i = r.start; i <= r.end; i++) m.unload(r.base + i + ".png"); for (int i = r.start; i <= r.end; i++) m.unload(r.path(i));
} }
protected boolean isRangeLoaded(AssetManager m, FrameRange r) { protected boolean isRangeLoaded(AssetManager m, FrameRange r) {
for (int i = r.start; i <= r.end; i++) for (int i = r.start; i <= r.end; i++)
if (!m.isLoaded(r.base + i + ".png")) return false; if (!m.isLoaded(r.path(i))) return false;
return true; return true;
} }
} }

View File

@@ -25,7 +25,7 @@ public class BatteryAssets extends AssetBase implements AssetBundle<BatteryAsset
public void queue(AssetManager manager, Data data) { public void queue(AssetManager manager, Data data) {
manager.load(data.flashlightLabel, Texture.class); manager.load(data.flashlightLabel, Texture.class);
for (int i = data.stages.start; i <= data.stages.end; i++) for (int i = data.stages.start; i <= data.stages.end; i++)
manager.load(data.stages.base + i + ".png", Texture.class); manager.load(data.stages.path(i), Texture.class);
} }
@Override @Override
@@ -38,14 +38,14 @@ public class BatteryAssets extends AssetBase implements AssetBundle<BatteryAsset
public void dispose(AssetManager manager, Data data) { public void dispose(AssetManager manager, Data data) {
manager.unload(data.flashlightLabel); manager.unload(data.flashlightLabel);
for (int i = data.stages.start; i <= data.stages.end; i++) for (int i = data.stages.start; i <= data.stages.end; i++)
manager.unload(data.stages.base + i + ".png"); manager.unload(data.stages.path(i));
} }
@Override @Override
public boolean isLoaded(AssetManager manager, Data data) { public boolean isLoaded(AssetManager manager, Data data) {
if (!manager.isLoaded(data.flashlightLabel)) return false; if (!manager.isLoaded(data.flashlightLabel)) return false;
for (int i = data.stages.start; i <= data.stages.end; i++) for (int i = data.stages.start; i <= data.stages.end; i++)
if (!manager.isLoaded(data.stages.base + i + ".png")) return false; if (!manager.isLoaded(data.stages.path(i))) return false;
return true; return true;
} }

View File

@@ -18,7 +18,7 @@ public class MaskAssets extends AssetBase implements AssetBundle<MaskAssets.Data
public void queue(AssetManager manager, Data data) { public void queue(AssetManager manager, Data data) {
manager.load(data.button, Texture.class); manager.load(data.button, Texture.class);
for (int i = data.sprites.start; i <= data.sprites.end; i++) for (int i = data.sprites.start; i <= data.sprites.end; i++)
manager.load(data.sprites.base + i + ".png", Texture.class); manager.load(data.sprites.path(i), Texture.class);
} }
@Override @Override
@@ -31,14 +31,14 @@ public class MaskAssets extends AssetBase implements AssetBundle<MaskAssets.Data
public void dispose(AssetManager manager, Data data) { public void dispose(AssetManager manager, Data data) {
manager.unload(data.button); manager.unload(data.button);
for (int i = data.sprites.start; i <= data.sprites.end; i++) for (int i = data.sprites.start; i <= data.sprites.end; i++)
manager.unload(data.sprites.base + i + ".png"); manager.unload(data.sprites.path(i));
} }
@Override @Override
public boolean isLoaded(AssetManager manager, Data data) { public boolean isLoaded(AssetManager manager, Data data) {
if (!manager.isLoaded(data.button)) return false; if (!manager.isLoaded(data.button)) return false;
for (int i = data.sprites.start; i <= data.sprites.end; i++) for (int i = data.sprites.start; i <= data.sprites.end; i++)
if (!manager.isLoaded(data.sprites.base + i + ".png")) return false; if (!manager.isLoaded(data.sprites.path(i))) return false;
return true; return true;
} }

View File

@@ -18,7 +18,7 @@ public class MonitorAssets extends AssetBase implements AssetBundle<MonitorAsset
public void queue(AssetManager manager, Data data) { public void queue(AssetManager manager, Data data) {
manager.load(data.button, Texture.class); manager.load(data.button, Texture.class);
for (int i = data.sprites.start; i <= data.sprites.end; i++) for (int i = data.sprites.start; i <= data.sprites.end; i++)
manager.load(data.sprites.base + i + ".png", Texture.class); manager.load(data.sprites.path(i), Texture.class);
} }
@Override @Override
@@ -31,14 +31,14 @@ public class MonitorAssets extends AssetBase implements AssetBundle<MonitorAsset
public void dispose(AssetManager manager, Data data) { public void dispose(AssetManager manager, Data data) {
manager.unload(data.button); manager.unload(data.button);
for (int i = data.sprites.start; i <= data.sprites.end; i++) for (int i = data.sprites.start; i <= data.sprites.end; i++)
manager.unload(data.sprites.base + i + ".png"); manager.unload(data.sprites.path(i));
} }
@Override @Override
public boolean isLoaded(AssetManager manager, Data data) { public boolean isLoaded(AssetManager manager, Data data) {
if (!manager.isLoaded(data.button)) return false; if (!manager.isLoaded(data.button)) return false;
for (int i = data.sprites.start; i <= data.sprites.end; i++) for (int i = data.sprites.start; i <= data.sprites.end; i++)
if (!manager.isLoaded(data.sprites.base + i + ".png")) return false; if (!manager.isLoaded(data.sprites.path(i))) return false;
return true; return true;
} }

View File

@@ -1,6 +1,24 @@
package io.github.eldek0.config; package io.github.eldek0.config;
import java.util.ArrayList;
import java.util.List;
public class FrameRange { public class FrameRange {
public String base; public String base;
public int start, end; public int start, end;
public String path(int i) {
if (base.contains("{i}")) {
String new_path = base;
return new_path.replace("{i}", String.valueOf(i));
}
return base + i + ".png";
}
public List<String> allPaths() {
List<String> paths = new ArrayList<>();
for (int i = start; i <= end; i++) paths.add(path(i));
return paths;
}
} }

View File

@@ -6,8 +6,7 @@ public record SpriteConfig<T extends Enum<T>>(
float y, float y,
String group, String group,
String key, SpriteVariant variant,
int frame,
boolean active, boolean active,
boolean fromTop, boolean fromTop,

View File

@@ -5,8 +5,7 @@ public class SpritePositionData {
public int x, y; public int x, y;
public String group = "null"; public String group = "null";
public String key = "null"; public SpriteVariant variant = null;
public int frame = 0;
public boolean active = true; public boolean active = true;
public boolean fromTop = false; public boolean fromTop = false;

View File

@@ -0,0 +1,6 @@
package io.github.eldek0.config;
public class SpriteVariant {
public String spriteKey;
public int frame = 0;
}

View File

@@ -263,10 +263,14 @@ public class Camera {
public void renderUI(SpriteBatch batch) { public void renderUI(SpriteBatch batch) {
if (!gameScene.hud.isInsideCamera()) return; if (!gameScene.hud.isInsideCamera()) return;
for (SpriteConfig<CameraSpriteType> config : layout.getSortedSprites()) { for (SpriteConfig config : layout.getSortedSprites()) {
if (!config.active()) continue; if (!config.active()) continue;
Texture texture = assets.resolve(config.group(), config.key(), config.frame()); if (config.group().equals("null") || config.variant() == null){
continue;
}
Texture texture = assets.resolve(config.group(), config.variant().spriteKey, config.variant().frame);
if (config.type() == CameraSpriteType.LABEL) { if (config.type() == CameraSpriteType.LABEL) {
texture = getRoomLabel(inCameraRoom); texture = getRoomLabel(inCameraRoom);
} }

View File

@@ -33,8 +33,7 @@ public class SpriteLayout<T extends Enum<T>> {
raw.x, raw.x,
raw.y, raw.y,
raw.group, raw.group,
raw.key, raw.variant,
raw.frame,
raw.active, raw.active,
raw.fromTop, raw.fromTop,
raw.centerX, raw.centerX,