Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create SpriteLinkBuilder #518

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 37 additions & 34 deletions src/client/java/minicraft/core/Renderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@
import minicraft.gfx.MinicraftImage;
import minicraft.gfx.Point;
import minicraft.gfx.Screen;
import minicraft.gfx.SpriteLinker;
import minicraft.gfx.SpriteLinker.LinkedSprite;
import minicraft.gfx.SpriteLinker.SpriteType;
import minicraft.gfx.SpriteManager;
import minicraft.gfx.SpriteManager.SpriteType;
import minicraft.item.Items;
import minicraft.item.PotionType;
import minicraft.item.ToolItem;
Expand Down Expand Up @@ -55,6 +54,7 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Supplier;

public class Renderer extends Game {
private Renderer() {
Expand All @@ -65,7 +65,7 @@ private Renderer() {
static float SCALE = 3;

public static Screen screen; // Creates the main screen
public static SpriteLinker spriteLinker = new SpriteLinker(); // The sprite linker for sprites
public static final SpriteManager spriteManager = new SpriteManager(); // The sprite linker for sprites

static Canvas canvas = new Canvas();
private static BufferedImage image; // Creates an image to be displayed on the screen.
Expand All @@ -80,8 +80,6 @@ private Renderer() {

private static int potionRenderOffset = 0;

private static LinkedSprite hudSheet;

public static MinicraftImage loadDefaultSkinSheet() {
MinicraftImage skinsSheet;
try {
Expand All @@ -105,11 +103,13 @@ public static void initScreen() {
screen = new Screen(image);
//lightScreen = new Screen();

hudSheet = new LinkedSprite(SpriteType.Gui, "hud");

canvas.createBufferStrategy(3);
}

private static MinicraftImage getHudSheet() {
return Renderer.spriteManager.getSheet(SpriteType.Gui, "hud");
}


/**
* Renders the current screen. Called in game loop, a bit after tick().
Expand Down Expand Up @@ -199,7 +199,7 @@ private static void renderLevel() {
if (xScroll > (level.w << 4) - Screen.w) xScroll = (level.w << 4) - Screen.w; // ...Right border.
if (yScroll > (level.h << 4) - Screen.h) yScroll = (level.h << 4) - Screen.h; // ...Bottom border.
if (currentLevel > 3) { // If the current level is higher than 3 (which only the sky level (and dungeon) is)
MinicraftImage cloud = spriteLinker.getSheet(SpriteType.Tile, "cloud_background");
MinicraftImage cloud = spriteManager.getSheet(SpriteType.Tile, "cloud_background");
for (int y = 0; y < 28; y++)
for (int x = 0; x < 48; x++) {
// Creates the background for the sky (and dungeon) level:
Expand All @@ -223,10 +223,11 @@ private static void renderLevel() {
* Renders the main game GUI (hearts, Stamina bolts, name of the current item, etc.)
*/
private static void renderGui() {
MinicraftImage hudSheet = getHudSheet();
// This draws the black square where the selected item would be if you were holding it
if (!isMode("minicraft.settings.mode.creative") || player.activeItem != null) {
for (int x = 10; x < 26; x++) {
screen.render(x * 8, Screen.h - 8, 5, 2, 0, hudSheet.getSheet());
screen.render(x * 8, Screen.h - 8, 5, 2, 0, hudSheet);
}
}

Expand All @@ -246,7 +247,7 @@ private static void renderGui() {
else
Font.drawBackground(" x" + ac, screen, 84, Screen.h - 16);
// Displays the arrow icon
screen.render(10 * 8 + 4, Screen.h - 16, 4, 1, 0, hudSheet.getSheet());
screen.render(10 * 8 + 4, Screen.h - 16, 4, 1, 0, hudSheet);
}
}

Expand Down Expand Up @@ -364,16 +365,16 @@ private static void renderGui() {
for (int i = 1; i <= 30; i++) {
// Renders your current red default hearts, golden hearts for 20 HP, obsidian hearts for 30 HP, or black hearts for damaged health.
if (i < 11) {
screen.render((i - 1) * 8, Screen.h - 16, 0, 1, 0, hudSheet.getSheet()); // Empty Hearts
screen.render((i - 1) * 8, Screen.h - 16, 0, 1, 0, hudSheet); // Empty Hearts
}
if (i < player.health + 1 && i < 11) {
screen.render((i - 1) * 8, Screen.h - 16, 0, 0, 0, hudSheet.getSheet()); // Red Hearts
screen.render((i - 1) * 8, Screen.h - 16, 0, 0, 0, hudSheet); // Red Hearts
}
if (i < player.health + 1 && i < 21 && i >= 11) {
screen.render((i - 11) * 8, Screen.h - 16, 0, 2, 0, hudSheet.getSheet()); // Yellow Hearts
screen.render((i - 11) * 8, Screen.h - 16, 0, 2, 0, hudSheet); // Yellow Hearts
}
if (i < player.health + 1 && i >= 21) {
screen.render((i - 21) * 8, Screen.h - 16, 0, 3, 0, hudSheet.getSheet()); // Obsidian Hearts
screen.render((i - 21) * 8, Screen.h - 16, 0, 3, 0, hudSheet); // Obsidian Hearts
}
}
for (int i = 0; i < Player.maxStat; i++) {
Expand All @@ -387,24 +388,24 @@ private static void renderGui() {
if (player.staminaRechargeDelay > 0) {
// Creates the white/gray blinking effect when you run out of stamina.
if (player.staminaRechargeDelay / 4 % 2 == 0) {
screen.render(i * 8, Screen.h - 8, 1, 2, 0, hudSheet.getSheet());
screen.render(i * 8, Screen.h - 8, 1, 2, 0, hudSheet);
} else {
screen.render(i * 8, Screen.h - 8, 1, 1, 0, hudSheet.getSheet());
screen.render(i * 8, Screen.h - 8, 1, 1, 0, hudSheet);
}
} else {
// Renders your current stamina, and uncharged gray stamina.
if (i < player.stamina) {
screen.render(i * 8, Screen.h - 8, 1, 0, 0, hudSheet.getSheet());
screen.render(i * 8, Screen.h - 8, 1, 0, 0, hudSheet);
} else {
screen.render(i * 8, Screen.h - 8, 1, 1, 0, hudSheet.getSheet());
screen.render(i * 8, Screen.h - 8, 1, 1, 0, hudSheet);
}
}

// Renders hunger
if (i < player.hunger) {
screen.render(i * 8 + (Screen.w - 80), Screen.h - 16, 2, 0, 0, hudSheet.getSheet());
screen.render(i * 8 + (Screen.w - 80), Screen.h - 16, 2, 0, 0, hudSheet);
} else {
screen.render(i * 8 + (Screen.w - 80), Screen.h - 16, 2, 1, 0, hudSheet.getSheet());
screen.render(i * 8 + (Screen.w - 80), Screen.h - 16, 2, 1, 0, hudSheet);
}
}
}
Expand Down Expand Up @@ -437,21 +438,22 @@ public static void renderBossbar(int length, String title) {
int INACTIVE_BOSSBAR = 4; // sprite x position
int ACTIVE_BOSSBAR = 5; // sprite x position

MinicraftImage hudSheet = getHudSheet();

screen.render(x + (max_bar_length * 2), y, 0, INACTIVE_BOSSBAR, 1, hudSheet.getSheet()); // left corner
screen.render(x + (max_bar_length * 2), y, 0, INACTIVE_BOSSBAR, 1, hudSheet); // left corner

// The middle
for (int bx = 0; bx < max_bar_length; bx++) {
for (int by = 0; by < 1; by++) {
screen.render(x + bx * 2, y + by * 8, 3, INACTIVE_BOSSBAR, 0, hudSheet.getSheet());
screen.render(x + bx * 2, y + by * 8, 3, INACTIVE_BOSSBAR, 0, hudSheet);
}
}

screen.render(x - 5, y, 0, ACTIVE_BOSSBAR, 0, hudSheet.getSheet()); // right corner
screen.render(x - 5, y, 0, ACTIVE_BOSSBAR, 0, hudSheet); // right corner

for (int bx = 0; bx < bar_length; bx++) {
for (int by = 0; by < 1; by++) {
screen.render(x + bx * 2, y + by * 8, 3, ACTIVE_BOSSBAR, 0, hudSheet.getSheet());
screen.render(x + bx * 2, y + by * 8, 3, ACTIVE_BOSSBAR, 0, hudSheet);
}
}

Expand Down Expand Up @@ -551,26 +553,27 @@ private static void renderFocusNagger() {
int yy = (HEIGHT - 8) / 2; // The height of the box
int w = msg.length(); // Length of message in characters.
int h = 1;
MinicraftImage hudSheet = getHudSheet();

// Renders the four corners of the box
screen.render(xx - 8, yy - 8, 0, 6, 0, hudSheet.getSheet());
screen.render(xx + w * 8, yy - 8, 0, 6, 1, hudSheet.getSheet());
screen.render(xx - 8, yy + 8, 0, 6, 2, hudSheet.getSheet());
screen.render(xx + w * 8, yy + 8, 0, 6, 3, hudSheet.getSheet());
screen.render(xx - 8, yy - 8, 0, 6, 0, hudSheet);
screen.render(xx + w * 8, yy - 8, 0, 6, 1, hudSheet);
screen.render(xx - 8, yy + 8, 0, 6, 2, hudSheet);
screen.render(xx + w * 8, yy + 8, 0, 6, 3, hudSheet);

// Renders each part of the box...
for (int x = 0; x < w; x++) {
screen.render(xx + x * 8, yy - 8, 1, 6, 0, hudSheet.getSheet()); // ...Top part
screen.render(xx + x * 8, yy + 8, 1, 6, 2, hudSheet.getSheet()); // ...Bottom part
screen.render(xx + x * 8, yy - 8, 1, 6, 0, hudSheet); // ...Top part
screen.render(xx + x * 8, yy + 8, 1, 6, 2, hudSheet); // ...Bottom part
}
for (int y = 0; y < h; y++) {
screen.render(xx - 8, yy + y * 8, 2, 6, 0, hudSheet.getSheet()); // ...Left part
screen.render(xx + w * 8, yy + y * 8, 2, 6, 1, hudSheet.getSheet()); // ...Right part
screen.render(xx - 8, yy + y * 8, 2, 6, 0, hudSheet); // ...Left part
screen.render(xx + w * 8, yy + y * 8, 2, 6, 1, hudSheet); // ...Right part
}

// The middle
for (int x = 0; x < w; x++) {
screen.render(xx + x * 8, yy, 3, 6, 0, hudSheet.getSheet());
screen.render(xx + x * 8, yy, 3, 6, 0, hudSheet);
}

// Renders the focus nagger text with a flash effect...
Expand Down
38 changes: 22 additions & 16 deletions src/client/java/minicraft/entity/Arrow.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,30 @@
import minicraft.gfx.Color;
import minicraft.gfx.Rectangle;
import minicraft.gfx.Screen;
import minicraft.gfx.SpriteLinker.LinkedSprite;
import minicraft.gfx.SpriteLinker.SpriteType;
import minicraft.util.Logging;

import javax.security.auth.DestroyFailedException;
import minicraft.gfx.SpriteManager.SpriteLink;
import minicraft.gfx.SpriteManager.SpriteType;

import java.util.List;

public class Arrow extends Entity implements ClientTickable {
private static final SpriteLink spriteRight;
private static final SpriteLink spriteLeft;
private static final SpriteLink spriteUp;
private static final SpriteLink spriteDown;

static {
SpriteLink.SpriteLinkBuilder builder = new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "arrow").setSpriteSize(1, 1);
spriteRight = builder.setSpritePos(0, 0).createSpriteLink();
spriteLeft = builder.setSpritePos(1, 0).createSpriteLink();
spriteUp = builder.setSpritePos(2, 0).createSpriteLink();
spriteDown = builder.setSpritePos(3, 0).createSpriteLink();
}

private Direction dir;
private int damage;
public Mob owner;
private int speed;
private LinkedSprite sprite = new LinkedSprite(SpriteType.Entity, "arrow").setSpriteSize(1, 1);
private final SpriteLink sprite;

public Arrow(Mob owner, Direction dir, int dmg) {
this(owner, owner.x, owner.y, dir, dmg);
Expand All @@ -34,11 +44,12 @@ public Arrow(Mob owner, int x, int y, Direction dir, int dmg) {
damage = dmg;
col = Color.get(-1, 111, 222, 430);

int xt = 0;
if (dir == Direction.LEFT) xt = 1;
if (dir == Direction.UP) xt = 2;
if (dir == Direction.DOWN) xt = 3;
sprite.setSpritePos(xt, 0);
switch (dir) {
case UP: sprite = spriteUp; break;
case DOWN: sprite = spriteDown; break;
case LEFT: sprite = spriteLeft; break;
case RIGHT: default: sprite = spriteRight; break;
}

if (damage > 3) speed = 8;
else if (damage >= 0) speed = 7;
Expand Down Expand Up @@ -79,11 +90,6 @@ public void tick() {
&& !level.getTile(x >> 4, y >> 4).connectsToFluid(level, x >> 4, y >> 4)
&& level.getTile(x >> 4, y >> 4).id != 16) {
this.remove();
try {
sprite.destroy();
} catch (DestroyFailedException e) {
Logging.SPRITE.trace(e);
}
}
}
}
Expand Down
5 changes: 3 additions & 2 deletions src/client/java/minicraft/entity/FireSpark.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
import minicraft.entity.mob.Player;
import minicraft.gfx.Color;
import minicraft.gfx.Screen;
import minicraft.gfx.SpriteLinker;
import minicraft.gfx.SpriteManager;

public class FireSpark extends Entity {
private static final SpriteLinker.LinkedSprite sprite = new SpriteLinker.LinkedSprite(SpriteLinker.SpriteType.Entity, "spark");
private static final SpriteManager.SpriteLink sprite =
new SpriteManager.SpriteLink.SpriteLinkBuilder(SpriteManager.SpriteType.Entity, "spark").createSpriteLink();

private final int lifeTime; // How much time until the spark disappears
private final double xa, ya; // The x and y acceleration
Expand Down
9 changes: 4 additions & 5 deletions src/client/java/minicraft/entity/Spark.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import minicraft.entity.mob.Player;
import minicraft.gfx.Color;
import minicraft.gfx.Screen;
import minicraft.gfx.SpriteLinker.LinkedSprite;
import minicraft.gfx.SpriteLinker.SpriteType;
import minicraft.gfx.SpriteManager.SpriteLink;
import minicraft.gfx.SpriteManager.SpriteType;

public class Spark extends Entity {
private final int lifeTime; // How much time until the spark disappears
Expand All @@ -15,7 +15,7 @@ public class Spark extends Entity {
private double xx, yy; // The x and y positions
private int time; // The amount of time that has passed
private final AirWizard owner; // The AirWizard that created this spark
private LinkedSprite sprite = new LinkedSprite(SpriteType.Entity, "spark");
private final SpriteLink sprite = new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "spark").createSpriteLink();

/**
* Creates a new spark. Owner is the AirWizard which is spawning this spark.
Expand Down Expand Up @@ -77,9 +77,8 @@ public void render(Screen screen) {
randmirror = random.nextInt(4);
}

sprite.setMirror(randmirror);
screen.render(x - 4, y - 4 + 2, sprite.getSprite(), 0, false, Color.BLACK); // renders the shadow on the ground
screen.render(x - 4, y - 4 - 2, sprite); // Renders the spark
screen.render(x - 4, y - 4 - 2, sprite.getSprite(), randmirror, false); // Renders the spark
}

/**
Expand Down
14 changes: 8 additions & 6 deletions src/client/java/minicraft/entity/furniture/Bed.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import minicraft.core.io.Localization;
import minicraft.entity.mob.Player;
import minicraft.gfx.SpriteAnimation;
import minicraft.gfx.SpriteLinker.LinkedSprite;
import minicraft.gfx.SpriteLinker.SpriteType;
import minicraft.gfx.SpriteManager.SpriteLink;
import minicraft.gfx.SpriteManager.SpriteType;
import minicraft.item.DyeItem;
import minicraft.level.Level;
import minicraft.util.MyUtils;
Expand All @@ -16,8 +16,8 @@

public class Bed extends Furniture {

private static final HashMap<DyeItem.DyeColor, LinkedSprite> sprites = new HashMap<>();
private static final HashMap<DyeItem.DyeColor, LinkedSprite> itemSprites = new HashMap<>();
private static final HashMap<DyeItem.DyeColor, SpriteLink> sprites = new HashMap<>();
private static final HashMap<DyeItem.DyeColor, SpriteLink> itemSprites = new HashMap<>();

@Override
public @NotNull Furniture copy() {
Expand All @@ -26,8 +26,10 @@ public class Bed extends Furniture {

static {
for (DyeItem.DyeColor color : DyeItem.DyeColor.values()) {
sprites.put(color, new LinkedSprite(SpriteType.Entity, color.toString().toLowerCase() + "_bed"));
itemSprites.put(color, new LinkedSprite(SpriteType.Item, color.toString().toLowerCase() + "_bed"));
sprites.put(color, new SpriteLink.SpriteLinkBuilder(SpriteType.Entity,
color.toString().toLowerCase() + "_bed").createSpriteLink());
itemSprites.put(color, new SpriteLink.SpriteLinkBuilder(SpriteType.Item,
color.toString().toLowerCase() + "_bed").createSpriteLink());
}
}

Expand Down
11 changes: 5 additions & 6 deletions src/client/java/minicraft/entity/furniture/Chest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import minicraft.entity.Direction;
import minicraft.entity.ItemHolder;
import minicraft.entity.mob.Player;
import minicraft.gfx.SpriteLinker.LinkedSprite;
import minicraft.gfx.SpriteLinker.SpriteType;
import minicraft.gfx.SpriteManager.SpriteLink;
import minicraft.gfx.SpriteManager.SpriteType;
import minicraft.item.Inventory;
import minicraft.item.Item;
import minicraft.item.Items;
Expand All @@ -26,15 +26,14 @@ public Chest() {
}

public Chest(String name) {
this(name, new LinkedSprite(SpriteType.Item, "chest"));
this(name, new SpriteLink.SpriteLinkBuilder(SpriteType.Item, "chest").createSpriteLink());
}

/**
* Creates a chest with a custom name.
* @param name Name of chest.
*/
public Chest(String name, LinkedSprite itemSprite) {
super(name, new LinkedSprite(SpriteType.Entity, "chest"), itemSprite, 3, 3); // Name of the chest
public Chest(String name, SpriteLink itemSprite) {
super(name, new SpriteLink.SpriteLinkBuilder(SpriteType.Entity, "chest").createSpriteLink(), itemSprite, 3, 3); // Name of the chest

inventory = new Inventory(); // Initialize the inventory.
}
Expand Down
Loading
Loading