feat: Screens

Different types of screens have been implemented.
For now only ChestScreen.
This commit is contained in:
2025-12-15 23:12:56 +01:00
parent 4f72f5e1f6
commit c7f2ba0cbd
11 changed files with 104 additions and 14 deletions

View File

@@ -5,6 +5,7 @@ import com.googlecode.lanterna.graphics.TextGraphics;
import cz.jzitnik.annotations.EventHandler;
import cz.jzitnik.annotations.injectors.InjectState;
import cz.jzitnik.events.RerenderScreen;
import cz.jzitnik.game.Constants;
import cz.jzitnik.states.ScreenBuffer;
import cz.jzitnik.states.TerminalState;
import cz.jzitnik.ui.pixels.Empty;
@@ -42,7 +43,7 @@ public class CliHandler extends AbstractEventHandler<RerenderScreen> {
for (int y = start.getRow(); y <= end.getRow(); y++) {
for (int x = start.getColumn(); x <= end.getColumn(); x++) {
Pixel pixel = buffer[y][x];
TextColor color = pixel.getClass().equals(Empty.class) ? new TextColor.RGB(4, 4, 16) : pixel.getColor();
TextColor color = pixel.getClass().equals(Empty.class) ? Constants.DEFAULT_COLOR : pixel.getColor();
drawPixel(tg, x, y, color);
}

View File

@@ -27,7 +27,7 @@ public class KeyboardPressEventHandler extends AbstractEventHandler<KeyboardPres
@Override
public void handle(KeyboardPressEvent event) {
if (gameState.getScreen() != null) {
gameState.getScreen().handleKeybordAction(event);
gameState.getScreen().handleKeyboardAction(event);
return;
}

View File

@@ -41,6 +41,7 @@ public class MouseActionEventHandler extends AbstractEventHandler<MouseAction> {
if (object.isEmpty()) return;
((Interactable) object.get()).interact(dm);
object.get().setSelected(false);
}
}
}

View File

@@ -45,7 +45,7 @@ public class RoomChangeEventHandler extends AbstractEventHandler<RoomChangeEvent
case LEFT -> playerCords.updateCords(155, 60);
case RIGHT -> playerCords.updateCords(30, 50);
case TOP -> playerCords.updateCords(90, 110);
case BOTTOM -> playerCords.updateCords(85, 10);
case BOTTOM -> playerCords.updateCords(90, 10);
}
gameState.setCurrentRoom(newRoom);

View File

@@ -6,6 +6,7 @@ import cz.jzitnik.annotations.injectors.InjectDependency;
import cz.jzitnik.annotations.injectors.InjectState;
import cz.jzitnik.events.FullRoomDraw;
import cz.jzitnik.events.TerminalResizeEvent;
import cz.jzitnik.game.GameState;
import cz.jzitnik.states.ScreenBuffer;
import cz.jzitnik.ui.pixels.Empty;
import cz.jzitnik.ui.pixels.Pixel;
@@ -27,6 +28,9 @@ public class TerminalResizeEventHandler extends AbstractEventHandler<TerminalRes
@InjectState
private ScreenBuffer screenBuffer;
@InjectState
private GameState gameState;
@Override
public void handle(TerminalResizeEvent event) {
TerminalSize size = event.getNewSize();
@@ -41,6 +45,10 @@ public class TerminalResizeEventHandler extends AbstractEventHandler<TerminalRes
}
screenBuffer.setRenderedBuffer(buffer);
eventManager.emitEvent(new FullRoomDraw(true));
if (gameState.getScreen() != null) {
gameState.getScreen().fullRender();
} else {
eventManager.emitEvent(new FullRoomDraw(true));
}
}
}

View File

@@ -0,0 +1,7 @@
package cz.jzitnik.game;
import com.googlecode.lanterna.TextColor;
public class Constants {
public static final TextColor DEFAULT_COLOR = new TextColor.RGB(4, 4, 16);
}

View File

@@ -3,14 +3,12 @@ package cz.jzitnik.game;
import cz.jzitnik.game.objects.GameObject;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@RequiredArgsConstructor
@Getter
@Setter
public class GameRoom {
private GameRoom left;
private GameRoom right;
@@ -23,4 +21,41 @@ public class GameRoom {
public void addObject(GameObject gameObject) {
objects.addFirst(gameObject);
}
public void setLeft(GameRoom left) {
setLeft(left, true);
}
public void setLeft(GameRoom left, boolean addReference) {
this.left = left;
if (addReference) {
left.setRight(this, false);
}
}
public void setRight(GameRoom right) {
setRight(right, true);
}
public void setRight(GameRoom right, boolean addReference) {
this.right = right;
if (addReference) {
right.setLeft(this, false);
}
}
public void setUp(GameRoom up) {
setUp(up, true);
}
public void setUp(GameRoom up, boolean addReference) {
this.up = up;
if (addReference) {
up.setDown(this, false);
}
}
public void setDown(GameRoom down) {
setDown(down, true);
}
public void setDown(GameRoom down, boolean addReference) {
this.down = down;
if (addReference) {
down.setUp(this, false);
}
}
}

View File

@@ -20,9 +20,7 @@ public class GameSetup {
GameRoom topRightRoom = new GameRoom(ResourceManager.Resource.ROOM3);
mainRoom.setRight(rightRoom);
rightRoom.setLeft(mainRoom);
rightRoom.setUp(topRightRoom);
topRightRoom.setDown(rightRoom);
Chest chest = new Chest(resourceManager, new RoomCords(100, 45));
mainRoom.addObject(chest);

View File

@@ -23,6 +23,6 @@ public final class Chest extends GameObject implements Interactable {
gameState.setInteracting(this);
ChestScreen chestScreen = dm.getDependencyOrThrow(ChestScreen.class);
gameState.setScreen(chestScreen);
chestScreen.initialRender();
chestScreen.fullRender();
}
}

View File

@@ -1,14 +1,47 @@
package cz.jzitnik.screens;
import com.googlecode.lanterna.TerminalSize;
import com.googlecode.lanterna.input.KeyStroke;
import com.googlecode.lanterna.input.KeyType;
import cz.jzitnik.annotations.Dependency;
import cz.jzitnik.annotations.injectors.InjectDependency;
import cz.jzitnik.annotations.injectors.InjectState;
import cz.jzitnik.events.FullRoomDraw;
import cz.jzitnik.events.KeyboardPressEvent;
import cz.jzitnik.events.MouseAction;
import cz.jzitnik.events.RerenderScreen;
import cz.jzitnik.game.GameState;
import cz.jzitnik.states.ScreenBuffer;
import cz.jzitnik.states.TerminalState;
import cz.jzitnik.ui.pixels.Empty;
import cz.jzitnik.utils.events.EventManager;
@Dependency
public final class ChestScreen extends Screen {
@Override
public void initialRender() {
@InjectDependency
private EventManager eventManager;
@InjectState
private ScreenBuffer screenBuffer;
@InjectState
private TerminalState terminalState;
@InjectState
private GameState gameState;
@Override
public void fullRender() {
var buffer = screenBuffer.getRenderedBuffer();
TerminalSize terminalSize = terminalState.getTerminalScreen().getTerminalSize();
for (int x = 0; x < terminalSize.getColumns(); x++) {
for (int y = 0; y < terminalSize.getRows(); y++) {
buffer[y][x] = new Empty();
}
}
eventManager.emitEvent(RerenderScreen.full(terminalSize));
}
@Override
@@ -17,7 +50,14 @@ public final class ChestScreen extends Screen {
}
@Override
public void handleKeybordAction(KeyboardPressEvent event) {
public void handleKeyboardAction(KeyboardPressEvent event) {
KeyStroke keyStroke = event.getKeyStroke();
if (keyStroke.getKeyType() == KeyType.Escape || keyStroke.getCharacter() == 'e') {
gameState.setScreen(null);
gameState.setInteracting(null);
eventManager.emitEvent(new FullRoomDraw(true));
}
}
}

View File

@@ -4,7 +4,7 @@ import cz.jzitnik.events.KeyboardPressEvent;
import cz.jzitnik.events.MouseAction;
public sealed abstract class Screen permits ChestScreen {
public abstract void initialRender();
public abstract void fullRender();
public abstract void handleMouseAction(MouseAction event);
public abstract void handleKeybordAction(KeyboardPressEvent event);
public abstract void handleKeyboardAction(KeyboardPressEvent event);
}