diff --git a/src/main/java/cz/jzitnik/events/RerenderScreen.java b/src/main/java/cz/jzitnik/events/RerenderScreen.java index 5e2250c..5ef8e58 100644 --- a/src/main/java/cz/jzitnik/events/RerenderScreen.java +++ b/src/main/java/cz/jzitnik/events/RerenderScreen.java @@ -26,7 +26,7 @@ public record RerenderScreen(ScreenPart[] parts) implements Event { public static ScreenPart full(TerminalSize terminalSize) { return new ScreenPart( new TerminalPosition(0, 0), - new TerminalPosition(terminalSize.getColumns() - 1, terminalSize.getRows() - 1) + new TerminalPosition(terminalSize.getColumns() - 1, terminalSize.getRows() * 2 - 1) ); } diff --git a/src/main/java/cz/jzitnik/events/handlers/CliHandler.java b/src/main/java/cz/jzitnik/events/handlers/CliHandler.java index 75c41fa..38bfcf0 100644 --- a/src/main/java/cz/jzitnik/events/handlers/CliHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/CliHandler.java @@ -38,14 +38,26 @@ public class CliHandler extends AbstractEventHandler { for (RerenderScreen.ScreenPart part : parts) { var start = part.getStart(); + int startYNormalized = (start.getRow() / 2) * 2; // Round to multiple of 2 down var end = part.getEnd(); + int endYNormalized = ((end.getRow() - 1) / 2) * 2; // Round to multiple of 2 ceil - for (int y = start.getRow(); y <= end.getRow(); y++) { + for (int y = startYNormalized; y <= endYNormalized; y += 2) { for (int x = start.getColumn(); x <= end.getColumn(); x++) { - Pixel pixel = buffer[y][x]; - TextColor color = pixel.getClass().equals(Empty.class) ? Constants.DEFAULT_COLOR : pixel.getColor(); + Pixel topPixel = buffer[y][x]; + Pixel bottomPixel = (y + 1 <= end.getRow()) + ? buffer[y + 1][x] + : new Empty(); - drawPixel(tg, x, y, color); + TextColor topColor = topPixel instanceof Empty + ? Constants.DEFAULT_COLOR + : topPixel.getColor(); + + TextColor bottomColor = bottomPixel instanceof Empty + ? Constants.DEFAULT_COLOR + : bottomPixel.getColor(); + + drawHalfPixel(tg, x, y / 2, topColor, bottomColor); } } } @@ -57,8 +69,11 @@ public class CliHandler extends AbstractEventHandler { } } - private void drawPixel(TextGraphics tg, int x, int y, TextColor color) { - tg.setForegroundColor(color); - tg.setCharacter(x, y, '█'); + private void drawHalfPixel(TextGraphics tg, int x, int y, + TextColor topColor, + TextColor bottomColor) { + tg.setBackgroundColor(topColor); // upper half + tg.setForegroundColor(bottomColor); // lower half + tg.setCharacter(x, y, '▄'); } } diff --git a/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java b/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java index 1a02572..4cd0d8c 100644 --- a/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java @@ -93,21 +93,18 @@ public class FullRoomDrawHandler extends AbstractEventHandler { int green = (pixel >> 8) & 0xff; int blue = pixel & 0xff; - Pixel overridePixelLeft = overrideBuffer[y][x * 2]; - Pixel overridePixelRight = overrideBuffer[y][x * 2 + 1]; + Pixel overridePixel = overrideBuffer[y][x]; Pixel pixel1 = new ColoredPixel(new TextColor.RGB(red, green, blue)); - Pixel finalPixelLeft = overridePixelLeft.getClass() == Empty.class || pixelResult.isPlayer() ? pixel1 : overridePixelLeft; - Pixel finalPixelRight = overridePixelRight.getClass() == Empty.class || pixelResult.isPlayer() ? pixel1 : overridePixelRight; + Pixel finalPixelLeft = overridePixel.getClass() == Empty.class || pixelResult.isPlayer() ? pixel1 : overridePixel; - buffer[y + startY][x * 2 + startX] = finalPixelLeft; - buffer[y + startY][x * 2 + 1 + startX] = finalPixelRight; + buffer[y + startY][x + startX] = finalPixelLeft; } } partsToRerender.add(new RerenderScreen.ScreenPart( new TerminalPosition(startX, startY), - new TerminalPosition(startX + width * 2, startY + height - 1) + new TerminalPosition(startX + width, startY + height - 1) )); if (renderState.isFirstRender() || event.isFullRerender()) { diff --git a/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java index 3ea861c..24c18d4 100644 --- a/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java @@ -67,10 +67,10 @@ public class MouseMoveEventHandler extends AbstractEventHandler BufferedImage texture = gameObject.getTexture(); RoomCords cords = gameObject.getCords(); return - (mouseX - startX) / 2 >= cords.getX() && - (mouseX - startX) / 2 < cords.getX() + texture.getWidth() && - mouseY >= cords.getY() + startY && - mouseY < cords.getY() + startY + texture.getHeight(); + mouseX - startX >= cords.getX() && + mouseX - startX < cords.getX() + texture.getWidth() && + (mouseY * 2 - startY) >= cords.getY() && + (mouseY * 2 - startY) < cords.getY() + texture.getHeight(); }).collect(Collectors.toSet()); Set changedObjects = new HashSet<>(); @@ -96,7 +96,7 @@ public class MouseMoveEventHandler extends AbstractEventHandler int forStartX = cords.getX(); int forStartY = cords.getY(); int forEndX = cords.getX() + objectTexture.getWidth() - 1; - int forEndY = cords.getY() + objectTexture.getHeight() - 1; + int forEndY = cords.getY() + objectTexture.getHeight(); RerenderUtils.rerenderPart( forStartX, diff --git a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java index 60aeebc..2e86d8d 100644 --- a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java @@ -111,7 +111,7 @@ public class PlayerMoveEventHandler extends AbstractEventHandler> 8) & 0xff; int blue = pixel & 0xff; - Pixel overridePixelLeft = overrideBuffer[y][x * 2]; - Pixel overridePixelRight = overrideBuffer[y][x * 2 + 1]; + Pixel overridePixel = overrideBuffer[y][x]; Pixel pixel1 = new ColoredPixel(new TextColor.RGB(red, green, blue)); - Pixel finalPixelLeft = overridePixelLeft.getClass() == Empty.class || pixelResult.isPlayer() ? pixel1 : overridePixelLeft; - Pixel finalPixelRight = overridePixelRight.getClass() == Empty.class || pixelResult.isPlayer() ? pixel1 : overridePixelRight; + Pixel finalPixel = overridePixel.getClass() == Empty.class || pixelResult.isPlayer() ? pixel1 : overridePixel; - buffer[y + screenStartY][x * 2 + screenStartX] = finalPixelLeft; - buffer[y + screenStartY][x * 2 + 1 + screenStartX] = finalPixelRight; + buffer[y + screenStartY][x + screenStartX] = finalPixel; } } }