CameraUI sprites positions configurable via cameras.json
This commit is contained in:
126
assets/data/config/cameras.json
Normal file
126
assets/data/config/cameras.json
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
{
|
||||||
|
"inCameraId": 1,
|
||||||
|
"wideRandomMov": {
|
||||||
|
"min": 5000,
|
||||||
|
"max": 7000
|
||||||
|
},
|
||||||
|
"sprites": [
|
||||||
|
{ "type": "BORDER", "x": 0, "y": 0, "zIndex": 0 },
|
||||||
|
|
||||||
|
{ "type": "MAP", "x": 550, "y": 310, "fromTop": true, "zIndex": 1 },
|
||||||
|
|
||||||
|
{ "type": "LABEL", "x": 550, "y": 280, "fromTop": true, "zIndex": 2 },
|
||||||
|
|
||||||
|
{ "type": "REC", "x": 40, "y": 40, "fromTop": true, "zIndex": 3 },
|
||||||
|
|
||||||
|
{ "type": "REC", "x": 90, "y": 130, "fromTop": true, "zIndex": 3 },
|
||||||
|
|
||||||
|
{ "type": "SIGNAL_INTERRUPTED", "x": 0, "y": 80, "fromTop": true, "centerX": true, "zIndex": 10 }
|
||||||
|
],
|
||||||
|
"cameras": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "PartyRoom1",
|
||||||
|
"labelPathId": 0,
|
||||||
|
"buttonX": 595,
|
||||||
|
"buttonY": 496,
|
||||||
|
"wide": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "PartyRoom2",
|
||||||
|
"labelPathId": 1,
|
||||||
|
"buttonX": 710,
|
||||||
|
"buttonY": 496,
|
||||||
|
"wide": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "PartyRoom3",
|
||||||
|
"labelPathId": 2,
|
||||||
|
"buttonX": 595,
|
||||||
|
"buttonY": 431,
|
||||||
|
"wide": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "PartyRoom4",
|
||||||
|
"labelPathId": 3,
|
||||||
|
"buttonX": 710,
|
||||||
|
"buttonY": 431,
|
||||||
|
"wide": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "LeftAirVent",
|
||||||
|
"labelPathId": 4,
|
||||||
|
"buttonX": 585,
|
||||||
|
"buttonY": 595,
|
||||||
|
"wide": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "RightAirVent",
|
||||||
|
"labelPathId": 5,
|
||||||
|
"buttonX": 695,
|
||||||
|
"buttonY": 595,
|
||||||
|
"wide": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "MainHall",
|
||||||
|
"labelPathId": 6,
|
||||||
|
"buttonX": 734,
|
||||||
|
"buttonY": 367,
|
||||||
|
"wide": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "PartsnService",
|
||||||
|
"labelPathId": 7,
|
||||||
|
"buttonX": 575,
|
||||||
|
"buttonY": 356,
|
||||||
|
"wide": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"name": "ShowStage",
|
||||||
|
"labelPathId": 8,
|
||||||
|
"buttonX": 895,
|
||||||
|
"buttonY": 331,
|
||||||
|
"wide": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"name": "GameArea",
|
||||||
|
"labelPathId": 9,
|
||||||
|
"buttonX": 820,
|
||||||
|
"buttonY": 455,
|
||||||
|
"wide": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "PrizeCorner",
|
||||||
|
"labelPathId": 10,
|
||||||
|
"buttonX": 929,
|
||||||
|
"buttonY": 405,
|
||||||
|
"wide": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"name": "KidsCove",
|
||||||
|
"labelPathId": 11,
|
||||||
|
"buttonX": 920,
|
||||||
|
"buttonY": 503,
|
||||||
|
"wide": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"name": "ShowStage",
|
||||||
|
"labelPathId": 1,
|
||||||
|
"buttonX": 120,
|
||||||
|
"buttonY": 503,
|
||||||
|
"wide": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@ import io.github.eldek0.asset.group.*;
|
|||||||
|
|
||||||
public class GameAssetManager {
|
public class GameAssetManager {
|
||||||
|
|
||||||
private static final String DATA = "data/";
|
private static final String DATA = "data/sprites/";
|
||||||
|
|
||||||
private final AssetManager manager = new AssetManager();
|
private final AssetManager manager = new AssetManager();
|
||||||
private final Json json = new Json();
|
private final Json json = new Json();
|
||||||
|
|||||||
@@ -2,15 +2,11 @@ package io.github.eldek0.asset.group;
|
|||||||
|
|
||||||
import com.badlogic.gdx.assets.AssetManager;
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import io.github.eldek0.config.FrameRange;
|
||||||
|
|
||||||
public abstract class AssetBase {
|
public abstract class AssetBase {
|
||||||
public abstract static class Data {}
|
public abstract static class Data {}
|
||||||
|
|
||||||
public static class FrameRange {
|
|
||||||
public String base;
|
|
||||||
public int start, end;
|
|
||||||
}
|
|
||||||
|
|
||||||
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.base + i + ".png", Texture.class);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package io.github.eldek0.asset.group;
|
|||||||
|
|
||||||
import com.badlogic.gdx.assets.AssetManager;
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import io.github.eldek0.config.FrameRange;
|
||||||
|
|
||||||
public class BatteryAssets extends AssetBase implements AssetBundle<BatteryAssets.Data> {
|
public class BatteryAssets extends AssetBase implements AssetBundle<BatteryAssets.Data> {
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package io.github.eldek0.asset.group;
|
|||||||
import com.badlogic.gdx.assets.AssetManager;
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
import com.badlogic.gdx.utils.Array;
|
import com.badlogic.gdx.utils.Array;
|
||||||
|
import io.github.eldek0.config.FrameRange;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package io.github.eldek0.asset.group;
|
|||||||
|
|
||||||
import com.badlogic.gdx.assets.AssetManager;
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import io.github.eldek0.config.FrameRange;
|
||||||
|
|
||||||
public class CustomNightAssets extends AssetBase implements AssetBundle<CustomNightAssets.Data>{
|
public class CustomNightAssets extends AssetBase implements AssetBundle<CustomNightAssets.Data>{
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package io.github.eldek0.asset.group;
|
|||||||
|
|
||||||
import com.badlogic.gdx.assets.AssetManager;
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import io.github.eldek0.config.FrameRange;
|
||||||
|
|
||||||
public class CutsceneAssets extends AssetBase implements AssetBundle<CutsceneAssets.Data> {
|
public class CutsceneAssets extends AssetBase implements AssetBundle<CutsceneAssets.Data> {
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package io.github.eldek0.asset.group;
|
|||||||
|
|
||||||
import com.badlogic.gdx.assets.AssetManager;
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import io.github.eldek0.config.FrameRange;
|
||||||
|
|
||||||
public class JumpscareAssets extends AssetBase implements AssetBundle<JumpscareAssets.Data> {
|
public class JumpscareAssets extends AssetBase implements AssetBundle<JumpscareAssets.Data> {
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package io.github.eldek0.asset.group;
|
|||||||
|
|
||||||
import com.badlogic.gdx.assets.AssetManager;
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import io.github.eldek0.config.FrameRange;
|
||||||
|
|
||||||
public class MaskAssets extends AssetBase implements AssetBundle<MaskAssets.Data> {
|
public class MaskAssets extends AssetBase implements AssetBundle<MaskAssets.Data> {
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package io.github.eldek0.asset.group;
|
|||||||
|
|
||||||
import com.badlogic.gdx.assets.AssetManager;
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import io.github.eldek0.config.FrameRange;
|
||||||
|
|
||||||
public class MenuAssets extends AssetBase implements AssetBundle<MenuAssets.Data> {
|
public class MenuAssets extends AssetBase implements AssetBundle<MenuAssets.Data> {
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package io.github.eldek0.asset.group;
|
|||||||
|
|
||||||
import com.badlogic.gdx.assets.AssetManager;
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import io.github.eldek0.config.FrameRange;
|
||||||
|
|
||||||
public class MinigameAssets extends AssetBase implements AssetBundle<MinigameAssets.Data> {
|
public class MinigameAssets extends AssetBase implements AssetBundle<MinigameAssets.Data> {
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package io.github.eldek0.asset.group;
|
|||||||
|
|
||||||
import com.badlogic.gdx.assets.AssetManager;
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import io.github.eldek0.config.FrameRange;
|
||||||
|
|
||||||
public class MonitorAssets extends AssetBase implements AssetBundle<MonitorAssets.Data> {
|
public class MonitorAssets extends AssetBase implements AssetBundle<MonitorAssets.Data> {
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package io.github.eldek0.asset.group;
|
|||||||
|
|
||||||
import com.badlogic.gdx.assets.AssetManager;
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import io.github.eldek0.config.FrameRange;
|
||||||
|
|
||||||
public class NumbersAssets extends AssetBase implements AssetBundle<NumbersAssets.Data> {
|
public class NumbersAssets extends AssetBase implements AssetBundle<NumbersAssets.Data> {
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package io.github.eldek0.asset.group;
|
|||||||
|
|
||||||
import com.badlogic.gdx.assets.AssetManager;
|
import com.badlogic.gdx.assets.AssetManager;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import io.github.eldek0.config.FrameRange;
|
||||||
|
|
||||||
public class OfficeAssets extends AssetBase implements AssetBundle<OfficeAssets.Data> {
|
public class OfficeAssets extends AssetBase implements AssetBundle<OfficeAssets.Data> {
|
||||||
|
|
||||||
|
|||||||
10
core/src/main/java/io/github/eldek0/config/CameraConfig.java
Normal file
10
core/src/main/java/io/github/eldek0/config/CameraConfig.java
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package io.github.eldek0.config;
|
||||||
|
|
||||||
|
public class CameraConfig {
|
||||||
|
public int id;
|
||||||
|
public String name;
|
||||||
|
public int labelPathId;
|
||||||
|
public float buttonX;
|
||||||
|
public float buttonY;
|
||||||
|
public boolean wide;
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package io.github.eldek0.config;
|
||||||
|
|
||||||
|
public class CameraConfigFile {
|
||||||
|
public int inCameraId;
|
||||||
|
public RangeLong wideRandomMov;
|
||||||
|
public SpritePositionData[] sprites;
|
||||||
|
public CameraConfig[] cameras;
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package io.github.eldek0.config;
|
||||||
|
|
||||||
|
public enum CameraSpriteType {
|
||||||
|
BORDER,
|
||||||
|
MAP,
|
||||||
|
LABEL,
|
||||||
|
REC,
|
||||||
|
SIGNAL_INTERRUPTED
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package io.github.eldek0.config;
|
||||||
|
|
||||||
|
public class FrameRange {
|
||||||
|
public String base;
|
||||||
|
public int start, end;
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package io.github.eldek0.config;
|
||||||
|
|
||||||
|
public class RangeLong {
|
||||||
|
public long min;
|
||||||
|
public long max;
|
||||||
|
}
|
||||||
11
core/src/main/java/io/github/eldek0/config/SpriteConfig.java
Normal file
11
core/src/main/java/io/github/eldek0/config/SpriteConfig.java
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package io.github.eldek0.config;
|
||||||
|
|
||||||
|
public record SpriteConfig<T extends Enum<T>>(
|
||||||
|
T type,
|
||||||
|
float x,
|
||||||
|
float y,
|
||||||
|
boolean active,
|
||||||
|
boolean fromTop,
|
||||||
|
boolean centerX,
|
||||||
|
int zIndex
|
||||||
|
) {}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package io.github.eldek0.config;
|
||||||
|
|
||||||
|
public class SpritePositionData {
|
||||||
|
public String type;
|
||||||
|
public int x, y;
|
||||||
|
|
||||||
|
public boolean active = true;
|
||||||
|
public boolean fromTop = false;
|
||||||
|
public boolean centerX = false;
|
||||||
|
public int zIndex = 0;
|
||||||
|
}
|
||||||
@@ -7,72 +7,96 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
|||||||
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
|
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
|
||||||
import com.badlogic.gdx.math.Rectangle;
|
import com.badlogic.gdx.math.Rectangle;
|
||||||
import com.badlogic.gdx.math.Vector2;
|
import com.badlogic.gdx.math.Vector2;
|
||||||
|
import com.badlogic.gdx.utils.Json;
|
||||||
import io.github.eldek0.App;
|
import io.github.eldek0.App;
|
||||||
|
import io.github.eldek0.config.*;
|
||||||
import io.github.eldek0.screen.GameScene;
|
import io.github.eldek0.screen.GameScene;
|
||||||
|
import io.github.eldek0.ui.SpriteLayout;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
import static io.github.eldek0.App.assets;
|
import static io.github.eldek0.App.assets;
|
||||||
import static io.github.eldek0.asset.GameAssetManager.*;
|
|
||||||
|
|
||||||
public class Camera {
|
public class Camera {
|
||||||
private static final int CAM_COUNT = 12;
|
|
||||||
private static final float CAMERA_SPEED = 5f * 60f; // px/s
|
private static final float CAMERA_SPEED = 5f * 60f; // px/s
|
||||||
|
private static final String CONFIG = "data/config/cameras.json";
|
||||||
|
|
||||||
private final float[][] BTN_POS = new float[][] {
|
private CameraConfig[] cameraConfigs;
|
||||||
{ 620 - 25, 621 - 125 }, { 735 - 25, 621 - 125 },
|
|
||||||
{ 620 - 25, 556 - 125 }, { 735 - 25, 556 - 125 },
|
|
||||||
{ 600 - 15, 700 - 105 }, { 710 - 15, 700 - 105 },
|
|
||||||
{ 769 - 35, 482 - 115 }, { 612 - 37, 471 - 115 },
|
|
||||||
{ 920 - 25, 441 - 110 }, { 830 - 10, 570 - 115 },
|
|
||||||
{ 954 - 25, 515 - 110 }, { 945 - 25, 608 - 105 }
|
|
||||||
};;
|
|
||||||
|
|
||||||
/** 1-based room index currently shown on the monitor. */
|
/** 1-based room index currently shown on the monitor. */
|
||||||
private int inCameraRoom = 10;
|
private int inCameraRoom;
|
||||||
|
|
||||||
private final Rectangle[] buttonScreenRects = new Rectangle[CAM_COUNT];
|
private Rectangle[] buttonScreenRects;
|
||||||
|
|
||||||
// Wide-camera panning (indices 6-11 → rooms 7-12)
|
// Wide-camera panning
|
||||||
private final float[] camerasXPosition = new float[CAM_COUNT];
|
private float[] camerasXPosition;
|
||||||
private final int[] wideCameraMovDirection = new int[CAM_COUNT];
|
private int[] wideCameraMovDirection;
|
||||||
private final long[] timerCheckpoints = new long[CAM_COUNT];
|
private long[] timerCheckpoints;
|
||||||
private final long[] timerWaitTimeMs = new long[CAM_COUNT];
|
private long[] timerWaitTimeMs;
|
||||||
|
private RangeLong wideRandomMov;
|
||||||
|
|
||||||
private final boolean[] occupiedCamera = new boolean[CAM_COUNT];
|
private boolean[] occupiedCamera;
|
||||||
|
|
||||||
private float recBlinkTimer = 0f;
|
private float recBlinkTimer = 0f;
|
||||||
private boolean recVisible = true;
|
private boolean recVisible = true;
|
||||||
|
|
||||||
|
SpriteLayout<CameraSpriteType> layout;
|
||||||
|
|
||||||
private GameScene gameScene;
|
private GameScene gameScene;
|
||||||
|
|
||||||
public Camera(GameScene gameScene) {
|
public Camera(GameScene gameScene) {
|
||||||
this.gameScene = gameScene;
|
this.gameScene = gameScene;
|
||||||
|
|
||||||
|
loadCameraConfig();
|
||||||
|
initializeArrays();
|
||||||
|
|
||||||
java.util.Random rng = new java.util.Random();
|
java.util.Random rng = new java.util.Random();
|
||||||
for (int i = 0; i < CAM_COUNT; i++) {
|
for (int i = 0; i < cameraConfigs.length; i++) {
|
||||||
timerWaitTimeMs[i] = 5000 + (long) rng.nextInt(2001); // [5000,7000] ms
|
timerWaitTimeMs[i] = wideRandomMov.min + (long) rng.nextInt((int) (wideRandomMov.max - wideRandomMov.min));
|
||||||
}
|
}
|
||||||
|
|
||||||
this.initButtonScreenRects();
|
this.initButtonScreenRects();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void initializeArrays() {
|
||||||
|
int camCount = cameraConfigs.length;
|
||||||
|
|
||||||
|
buttonScreenRects = new Rectangle[camCount];
|
||||||
|
camerasXPosition = new float[camCount];
|
||||||
|
wideCameraMovDirection = new int[camCount];
|
||||||
|
timerCheckpoints = new long[camCount];
|
||||||
|
timerWaitTimeMs = new long[camCount];
|
||||||
|
occupiedCamera = new boolean[camCount];
|
||||||
|
}
|
||||||
|
|
||||||
private void initButtonScreenRects(){
|
private void initButtonScreenRects(){
|
||||||
Texture btnUnsel = assets.cameras.roomButtonUnselected;
|
Texture btnUnsel = assets.cameras.roomButtonUnselected;
|
||||||
|
|
||||||
for (int i = 0; i < CAM_COUNT; i++) {
|
for (int i = 0; i < cameraConfigs.length; i++) {
|
||||||
float[] btnPos = BTN_POS[i];
|
CameraConfig cameraConfig = cameraConfigs[i];
|
||||||
float worldY = App.SCREEN_HEIGHT - btnPos[1] - btnUnsel.getHeight();
|
|
||||||
buttonScreenRects[i] = new Rectangle(btnPos[0], worldY, btnUnsel.getWidth() , btnUnsel.getHeight());
|
float worldY = App.SCREEN_HEIGHT - cameraConfig.buttonY - btnUnsel.getHeight();
|
||||||
|
buttonScreenRects[i] = new Rectangle(
|
||||||
|
cameraConfig.buttonX,
|
||||||
|
worldY,
|
||||||
|
btnUnsel.getWidth(),
|
||||||
|
btnUnsel.getHeight());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update(float delta) {
|
public void update(float delta) {
|
||||||
for (int i = 6; i < CAM_COUNT; i++) {
|
for (int i = 0; i < cameraConfigs.length; i++) {
|
||||||
|
if (cameraConfigs[i].wide) {
|
||||||
updateCameraTimer(i, delta);
|
updateCameraTimer(i, delta);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
recBlinkTimer += delta;
|
recBlinkTimer += delta;
|
||||||
if (recBlinkTimer >= 1f) {
|
if (recBlinkTimer >= 1f) {
|
||||||
recBlinkTimer -= 1f;
|
recBlinkTimer -= 1f;
|
||||||
recVisible = !recVisible;
|
recVisible = !recVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.onTouchDown();
|
this.onTouchDown();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,7 +107,7 @@ public class Camera {
|
|||||||
|
|
||||||
public void onTouchDown() {
|
public void onTouchDown() {
|
||||||
Vector2 position = App.convertPosToWorldPos(new Vector2(Gdx.input.getX(), Gdx.input.getY()));
|
Vector2 position = App.convertPosToWorldPos(new Vector2(Gdx.input.getX(), Gdx.input.getY()));
|
||||||
for (int i = 0; i < CAM_COUNT; i++) {
|
for (int i = 0; i < this.cameraConfigs.length; i++) {
|
||||||
if (buttonScreenRects[i].contains(position)) {
|
if (buttonScreenRects[i].contains(position)) {
|
||||||
if (Gdx.input.isButtonJustPressed(Input.Buttons.LEFT)) {
|
if (Gdx.input.isButtonJustPressed(Input.Buttons.LEFT)) {
|
||||||
inCameraRoom = i + 1;
|
inCameraRoom = i + 1;
|
||||||
@@ -105,57 +129,71 @@ public class Camera {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void loadCameraConfig(){
|
||||||
|
Json json = new Json();
|
||||||
|
String raw = Gdx.files.internal(CONFIG).readString();
|
||||||
|
CameraConfigFile configFile = json.fromJson(CameraConfigFile.class, raw);
|
||||||
|
this.inCameraRoom = configFile.inCameraId;
|
||||||
|
this.cameraConfigs = configFile.cameras;
|
||||||
|
this.wideRandomMov = configFile.wideRandomMov;
|
||||||
|
|
||||||
|
this.layout = new SpriteLayout<>(
|
||||||
|
configFile.sprites, // 👈 directo
|
||||||
|
CameraSpriteType::valueOf
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private Texture getFrame(int room, int index) {
|
private Texture getFrame(int room, int index) {
|
||||||
Texture[] textures = switch (room) {
|
CameraConfig config = cameraConfigs[room - 1];
|
||||||
case 1 -> assets.cameras.getLocationFrames("PartyRoom1");
|
Texture[] textures = assets.cameras.getLocationFrames(config.name);
|
||||||
case 2 -> assets.cameras.getLocationFrames("PartyRoom2");
|
|
||||||
case 3 -> assets.cameras.getLocationFrames("PartyRoom3");
|
if (textures == null || index < 0 || index >= textures.length) {
|
||||||
case 4 -> assets.cameras.getLocationFrames("PartyRoom4");
|
return null;
|
||||||
case 5 -> assets.cameras.getLocationFrames("LeftAirVent");
|
}
|
||||||
case 6 -> assets.cameras.getLocationFrames("RightAirVent");
|
|
||||||
case 7 -> assets.cameras.getLocationFrames("MainHall");
|
|
||||||
case 8 -> assets.cameras.getLocationFrames("PartsnService");
|
|
||||||
case 9 -> assets.cameras.getLocationFrames("ShowStage");
|
|
||||||
case 10 -> assets.cameras.getLocationFrames("GameArea");
|
|
||||||
case 11 -> assets.cameras.getLocationFrames("PrizeCorner");
|
|
||||||
case 12 -> assets.cameras.getLocationFrames("KidsCove");
|
|
||||||
default -> null;
|
|
||||||
};
|
|
||||||
assert textures != null;
|
|
||||||
return textures[index];
|
return textures[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Texture getRoomLabel(int room) {
|
||||||
|
CameraConfig config = cameraConfigs[room - 1];
|
||||||
|
return assets.cameras.locationLabels.get(config.name);
|
||||||
|
}
|
||||||
|
|
||||||
public void renderUI(SpriteBatch batch) {
|
public void renderUI(SpriteBatch batch) {
|
||||||
if (!gameScene.hud.isInsideCamera()) {return;}
|
if (!gameScene.hud.isInsideCamera()) return;
|
||||||
|
|
||||||
// Border overlay
|
for (SpriteConfig<CameraSpriteType> config : layout.getSortedSprites()) {
|
||||||
Texture border = assets.cameras.borderline;
|
if (!config.active()) continue;
|
||||||
batch.draw(border, 0, 0);
|
|
||||||
|
|
||||||
// Map
|
Texture texture = getTextureForSprite(config.type());
|
||||||
Texture map = assets.cameras.map;
|
if (config.type() == CameraSpriteType.LABEL) {
|
||||||
batch.draw(map, 550, App.SCREEN_HEIGHT - 310 - map.getHeight());
|
texture = getRoomLabel(inCameraRoom);
|
||||||
|
}
|
||||||
|
|
||||||
// Room label
|
if (texture == null) continue;
|
||||||
Texture label = getRoomLabel(inCameraRoom);
|
|
||||||
if (label != null) {
|
if (config.type() == CameraSpriteType.REC && !recVisible) continue;
|
||||||
batch.draw(label, 550, App.SCREEN_HEIGHT - 280 - label.getHeight());
|
if (config.type() == CameraSpriteType.SIGNAL_INTERRUPTED && !occupiedCamera[inCameraRoom - 1]) continue;
|
||||||
|
|
||||||
|
batch.draw(
|
||||||
|
texture,
|
||||||
|
layout.resolveX(config, texture),
|
||||||
|
layout.resolveY(config, texture)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
drawCameraButtons(batch);
|
drawCameraButtons(batch);
|
||||||
|
|
||||||
// REC sprite
|
|
||||||
if (recVisible) {
|
|
||||||
Texture rec = assets.cameras.recordSprite;
|
|
||||||
batch.draw(rec, 40, App.SCREEN_HEIGHT - 40 - rec.getHeight());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Signal interrupted banner
|
private Texture getTextureForSprite(CameraSpriteType type) {
|
||||||
if (occupiedCamera[inCameraRoom - 1]) {
|
return switch (type) {
|
||||||
Texture sig = assets.cameras.signalInterrupted;
|
case BORDER -> assets.cameras.borderline;
|
||||||
float sx = Gdx.graphics.getWidth() / 2f - sig.getWidth() / 2f;
|
case MAP -> assets.cameras.map;
|
||||||
batch.draw(sig, sx, App.SCREEN_HEIGHT - 80 - sig.getHeight());
|
case REC -> assets.cameras.recordSprite;
|
||||||
}
|
case SIGNAL_INTERRUPTED -> assets.cameras.signalInterrupted;
|
||||||
|
case LABEL -> null;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public void renderHitboxes(ShapeRenderer shapeRenderer) {
|
public void renderHitboxes(ShapeRenderer shapeRenderer) {
|
||||||
@@ -169,38 +207,17 @@ public class Camera {
|
|||||||
Texture btnUnsel = assets.cameras.roomButtonUnselected;
|
Texture btnUnsel = assets.cameras.roomButtonUnselected;
|
||||||
Texture btnSel = assets.cameras.roomButtonSelected;
|
Texture btnSel = assets.cameras.roomButtonSelected;
|
||||||
|
|
||||||
for (int i = 0; i < CAM_COUNT; i++) {
|
for (CameraConfig config : cameraConfigs) {
|
||||||
Texture btn = (i + 1 == inCameraRoom) ? btnSel : btnUnsel;
|
Texture btn = (config.id == inCameraRoom) ? btnSel : btnUnsel;
|
||||||
|
|
||||||
float pyX = BTN_POS[i][0];
|
float worldY = App.SCREEN_HEIGHT - config.buttonY - btnUnsel.getHeight();
|
||||||
float pyY = BTN_POS[i][1];
|
batch.draw(btn, config.buttonX, worldY);
|
||||||
|
|
||||||
float worldY = App.SCREEN_HEIGHT - pyY - btnUnsel.getHeight();
|
Texture lbl = assets.cameras.roomLabels[config.labelPathId];
|
||||||
batch.draw(btn, pyX, worldY);
|
batch.draw(lbl, config.buttonX + 5, worldY + 7);
|
||||||
|
|
||||||
Texture lbl = assets.cameras.roomLabels[i];
|
|
||||||
batch.draw(lbl, pyX + 5, worldY + 7);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Texture getRoomLabel(int room) {
|
|
||||||
return switch (room) {
|
|
||||||
case 1 -> assets.cameras.getLocationLabel("PartyRoom1/label.png");
|
|
||||||
case 2 -> assets.cameras.getLocationLabel("PartyRoom2/label.png");
|
|
||||||
case 3 -> assets.cameras.getLocationLabel("PartyRoom3/label.png");
|
|
||||||
case 4 -> assets.cameras.getLocationLabel("PartyRoom4/label.png");
|
|
||||||
case 5 -> assets.cameras.getLocationLabel("LeftAirVent/label.png");
|
|
||||||
case 6 -> assets.cameras.getLocationLabel("RightAirVent/label.png");
|
|
||||||
case 7 -> assets.cameras.getLocationLabel("MainHall/label.png");
|
|
||||||
case 8 -> assets.cameras.getLocationLabel("PartsnService/label.png");
|
|
||||||
case 9 -> assets.cameras.getLocationLabel("ShowStage/label.png");
|
|
||||||
case 10 -> assets.cameras.getLocationLabel("GameArea/label.png");
|
|
||||||
case 11 -> assets.cameras.getLocationLabel("PrizeCorner/label.png");
|
|
||||||
case 12 -> assets.cameras.getLocationLabel("KidsCove/label.png");
|
|
||||||
default -> null;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateCameraTimer(int index, float delta) {
|
private void updateCameraTimer(int index, float delta) {
|
||||||
if (index < 6) return;
|
if (index < 6) return;
|
||||||
|
|
||||||
|
|||||||
85
core/src/main/java/io/github/eldek0/ui/SpriteLayout.java
Normal file
85
core/src/main/java/io/github/eldek0/ui/SpriteLayout.java
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
package io.github.eldek0.ui;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
|
import io.github.eldek0.App;
|
||||||
|
import io.github.eldek0.config.SpriteConfig;
|
||||||
|
import io.github.eldek0.config.SpritePositionData;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
public class SpriteLayout<T extends Enum<T>> {
|
||||||
|
|
||||||
|
private final Map<T, SpriteConfig[]> spritesMap;
|
||||||
|
private final SpriteConfig[] sortedSprites;
|
||||||
|
|
||||||
|
public SpriteLayout(SpritePositionData[] rawSprites, Function<String, T> enumResolver) {
|
||||||
|
if (rawSprites == null) {
|
||||||
|
throw new IllegalArgumentException("rawSprites no puede ser null");
|
||||||
|
}
|
||||||
|
if (enumResolver == null) {
|
||||||
|
throw new IllegalArgumentException("enumResolver no puede ser null");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<SpriteConfig> parsed = new ArrayList<>();
|
||||||
|
|
||||||
|
for (SpritePositionData raw : rawSprites) {
|
||||||
|
if (raw == null || raw.type == null) continue;
|
||||||
|
|
||||||
|
T enumType = enumResolver.apply(raw.type);
|
||||||
|
|
||||||
|
SpriteConfig config = new SpriteConfig(
|
||||||
|
enumType,
|
||||||
|
raw.x,
|
||||||
|
raw.y,
|
||||||
|
raw.active,
|
||||||
|
raw.fromTop,
|
||||||
|
raw.centerX,
|
||||||
|
raw.zIndex
|
||||||
|
);
|
||||||
|
|
||||||
|
parsed.add(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<T, List<SpriteConfig>> temp = new HashMap<>();
|
||||||
|
for (SpriteConfig sprite : parsed) {
|
||||||
|
temp.computeIfAbsent((T) sprite.type(), k -> new ArrayList<>()).add(sprite);
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<T, SpriteConfig[]> builtMap = new HashMap<>();
|
||||||
|
for (Map.Entry<T, List<SpriteConfig>> entry : temp.entrySet()) {
|
||||||
|
builtMap.put(entry.getKey(), entry.getValue().toArray(new SpriteConfig[0]));
|
||||||
|
}
|
||||||
|
this.spritesMap = builtMap;
|
||||||
|
|
||||||
|
SpriteConfig[] ordered = parsed.toArray(new SpriteConfig[0]);
|
||||||
|
Arrays.sort(ordered, Comparator.comparingInt(SpriteConfig::zIndex));
|
||||||
|
this.sortedSprites = ordered;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SpriteConfig[] getSprites(T type) {
|
||||||
|
return spritesMap.getOrDefault(type, new SpriteConfig[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SpriteConfig[] getSortedSprites() {
|
||||||
|
return sortedSprites;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float resolveX(SpriteConfig config, Texture texture) {
|
||||||
|
float x = config.x();
|
||||||
|
|
||||||
|
if (config.centerX()) {
|
||||||
|
x += App.SCREEN_WIDTH / 2f - texture.getWidth() / 2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float resolveY(SpriteConfig config, Texture texture) {
|
||||||
|
if (config.fromTop()) {
|
||||||
|
return App.SCREEN_HEIGHT - config.y() - texture.getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
return config.y();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user