From 4c02b86b556002b08bc9474d0f821ff6f9b2e25e Mon Sep 17 00:00:00 2001 From: John Date: Wed, 15 Jun 2022 11:24:45 -0400 Subject: [PATCH] Added double parallax, dialogue menu --- img/backgrounds/cloud1.png | Bin 0 -> 1652 bytes img/backgrounds/cloud2.png | Bin 0 -> 1651 bytes img/backgrounds/cloud3.png | Bin 0 -> 1577 bytes src/BackgroundImage.java | 4 +-- src/DialogueMenu.java | 59 +++++++++++++++++++++++++++++++++++++ src/GamePanel.java | 19 ++++++++++-- 6 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 img/backgrounds/cloud1.png create mode 100644 img/backgrounds/cloud2.png create mode 100644 img/backgrounds/cloud3.png create mode 100644 src/DialogueMenu.java diff --git a/img/backgrounds/cloud1.png b/img/backgrounds/cloud1.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe57a5f15e53289449fec3f8851e7e7fb1171a4 GIT binary patch literal 1652 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 lines = new ArrayList(); + lines.add(""); + // get font size + FontMetrics metrics = g.getFontMetrics(); + int currentLineWidth = 0, lastLineIndex = 0; + for (String s: newText) { + currentLineWidth += metrics.stringWidth(s); + if (currentLineWidth < (GamePanel.GAME_WIDTH - PORTRAIT_WIDTH - PADDING*2)) { + lines.set(lastLineIndex, lines.get(lastLineIndex) + s); + } else { + currentLineWidth = metrics.stringWidth(s); + lines.add(s); + } + } + y -= PADDING; + // center y (half is above y value, half is below y value) + for (String s: lines) { + y -= (metrics.getAscent() - metrics.getDescent()) / 2; + // draw string + g.drawString(text, x, y); + } + } + + public void draw(Graphics g, String text, Color backgroundColor, Color textColor) { + g.setFont(font); + drawCenteredTextBox(g, text, backgroundColor, textColor); + } +} diff --git a/src/GamePanel.java b/src/GamePanel.java index 4a7154b..9ca7f90 100644 --- a/src/GamePanel.java +++ b/src/GamePanel.java @@ -31,13 +31,14 @@ public class GamePanel extends JPanel implements Runnable, KeyListener, Serializ public transient Image image; public transient Graphics graphics; public Player player; - public BackgroundImage background; + public BackgroundImage background, cloudOneBackground, cloudTwoBackground, cloudThreeBackground; public int playerFrame, enemyFrame; // keeps track of how many ticks has elapsed since last frame change public int playerFrameCounter = 0; public int enemyFrameCounter = 0; - public boolean isPaused; + public boolean isPaused, isDialogue; public PauseMenu pauseMenu; + public DialogueMenu dialogueMenu; public BufferedImageWrapper[][][] playerSpriteArray = new BufferedImageWrapper[2][2][11]; @@ -60,6 +61,9 @@ public class GamePanel extends JPanel implements Runnable, KeyListener, Serializ public BufferedImageWrapper backgroundImage = new BufferedImageWrapper(getImage("img/backgrounds/pointyMountains.png")); public BufferedImageWrapper box = new BufferedImageWrapper(getImage("img/tiles/boxes/box.png")); public BufferedImageWrapper boxCoin = new BufferedImageWrapper(getImage("img/tiles/boxes/boxCoin.png")); + public BufferedImageWrapper cloud1 = new BufferedImageWrapper(getImage("img/backgrounds/cloud1.png")); + public BufferedImageWrapper cloud2 = new BufferedImageWrapper(getImage("img/backgrounds/cloud2.png")); + public BufferedImageWrapper cloud3 = new BufferedImageWrapper(getImage("img/backgrounds/cloud3.png")); public BufferedImageWrapper bomb; @@ -67,7 +71,11 @@ public class GamePanel extends JPanel implements Runnable, KeyListener, Serializ this.gameFrame = gameFrame; camera = new Camera(0); background = new BackgroundImage(0, 0, backgroundImage, GAME_WIDTH, GAME_HEIGHT, 10, camera); + cloudOneBackground = new BackgroundImage(200, 200, cloud1, cloud1.image.getWidth(), cloud1.image.getHeight(), 5, camera); + cloudTwoBackground = new BackgroundImage(600, 250, cloud2, cloud2.image.getWidth(), cloud3.image.getHeight(), 5, camera); + cloudThreeBackground = new BackgroundImage(1000, 200, cloud3, cloud2.image.getWidth(), cloud3.image.getHeight(), 5, camera); pauseMenu = new PauseMenu(GAME_HEIGHT/2, 100, 400, 400, GAME_WIDTH, new Font(Font.MONOSPACED, Font.BOLD, 60), "Paused"); + dialogueMenu = new DialogueMenu(0, 200, new Font(Font.MONOSPACED, Font.BOLD, 60)); try { // load player sprites from disk here for (int i = 0; i < 11; i++) { @@ -170,6 +178,9 @@ public class GamePanel extends JPanel implements Runnable, KeyListener, Serializ //call the draw methods in each class to update positions as things move public void draw(Graphics g, int playerFrame, int enemyFrame) throws IOException { background.draw(g); + cloudOneBackground.draw(g); + cloudTwoBackground.draw(g); + cloudThreeBackground.draw(g); if (isPaused) { // set player frame to 0 to prevent frame from changing when player moves playerFrame = 0; @@ -237,6 +248,10 @@ public class GamePanel extends JPanel implements Runnable, KeyListener, Serializ g.setColor(new Color(255, 255, 255, 100)); g.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT); pauseMenu.draw(g, Color.white, Color.black); + } else if (isDialogue) { + g.setColor(new Color(255, 255, 255, 100)); + g.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT); + dialogueMenu.draw(g, "Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum", Color.white, Color.black); } }