diff --git a/refactoring/flappy-bird/.idea/misc.xml b/refactoring/flappy-bird/.idea/misc.xml index cbec6ae..e122dea 100644 --- a/refactoring/flappy-bird/.idea/misc.xml +++ b/refactoring/flappy-bird/.idea/misc.xml @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/refactoring/flappy-bird/src/main/java/com/example/flappybird/Audio.java b/refactoring/flappy-bird/src/main/java/com/example/flappybird/Audio.java index b6a2252..f11348f 100644 --- a/refactoring/flappy-bird/src/main/java/com/example/flappybird/Audio.java +++ b/refactoring/flappy-bird/src/main/java/com/example/flappybird/Audio.java @@ -1,18 +1,20 @@ -package com.example.flappybird; /** +/** * Audio.java * Plays all sound effects * * @author Paul Krishnamurthy */ +package com.example.flappybird; + import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import java.net.URL; public class Audio { - private void playSound (String sound) { + private void playSound (String sound) { // Path to sound file String soundPath = "/res/sound/" + sound + ".wav"; diff --git a/refactoring/flappy-bird/src/main/java/com/example/flappybird/Bird.java b/refactoring/flappy-bird/src/main/java/com/example/flappybird/Bird.java index bcbce8f..9d1f6e2 100644 --- a/refactoring/flappy-bird/src/main/java/com/example/flappybird/Bird.java +++ b/refactoring/flappy-bird/src/main/java/com/example/flappybird/Bird.java @@ -1,12 +1,13 @@ -package com.example.flappybird; /** +/** * Bird.java * Handles bird's state and actions * * @author Paul Krishnamurthy */ -import com.example.flappybird.states.GameState; +package com.example.flappybird; +import com.example.flappybird.states.GameState; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; @@ -15,26 +16,21 @@ public class Bird extends HasPosition { // Bird attributes public String color; - private boolean isAlive = true; // Bird constants - private int FLOAT_MULTIPLIER = -1; - public final int BIRD_WIDTH = 44; - public final int BIRD_HEIGHT = 31; - private final int BASE_COLLISION = 521 - BIRD_HEIGHT - 5; - private final int SHIFT = 10; - private final int STARTING_BIRD_X = 90; - private final int STARTING_BIRD_Y = 343; - - // Physics variables - private double velocity = 0; - private double gravity = .41; - private double delay = 0; - private double rotation = 0; + private int FLOAT_MULTIPLIER = -1; + public final int BIRD_WIDTH = 44; + public final int BIRD_HEIGHT = 31; + private final int BASE_COLLISION = 521 - BIRD_HEIGHT - 5; - // Bird sprites - private BufferedImage[] sprites; + // Physics variables + private double velocity = 0; + private final double gravity = .41; + private double delay = 0; + + // Bird sprites + private final BufferedImage[] sprites; private static double currentFrame = 0; @@ -46,30 +42,16 @@ public class Bird extends HasPosition { } /** - * @return Bird's x-coordinate + * @return If bird is alive */ - public int getX () { - return x; - } - - /** - * @return Bird's y-coordinate - */ - public int getY () { - return y; - } - - /** - * @return If bird is alive - */ - public boolean isAlive () { + public boolean isAlive() { return isAlive; } /** * Kills bird */ - public void kill () { + public void killBird() { isAlive = false; } @@ -77,15 +59,14 @@ public class Bird extends HasPosition { * Set new coordinates when starting game */ public void setGameStartPos () { - x = STARTING_BIRD_X; - y = STARTING_BIRD_Y; + x = 90; + y = 343; } /** * Floating bird effect on menu screen */ public void menuFloat () { - y += FLOAT_MULTIPLIER; // Change direction within floating range @@ -101,22 +82,19 @@ public class Bird extends HasPosition { * Bird jump */ public void jump () { - if (delay < 1) { - velocity = -SHIFT; + int SHIFT = 10; + velocity = -SHIFT; delay = SHIFT; } - } /** * Bird movement during the game */ - public void inGame () { - + public void inGameBorders () { // If the bird did not hit the base, lower it if (y < BASE_COLLISION) { - // Change and velocity velocity += gravity; @@ -125,9 +103,7 @@ public class Bird extends HasPosition { // Add rounded velocity to y-coordinate y += (int) velocity; - } else { - // Play audio and set state to dead GameState.audio.hit(); isAlive = false; @@ -139,9 +115,8 @@ public class Bird extends HasPosition { * Renders bird */ public void renderBird (Graphics g) { - // Calculate angle to rotate bird based on y-velocity - rotation = ((90 * (velocity + 25) / 25) - 90) * Math.PI / 180; + double rotation = ((90 * (velocity + 25) / 25) - 90) * Math.PI / 180; // Divide for clean jump rotation /= 2; diff --git a/refactoring/flappy-bird/src/main/java/com/example/flappybird/FlappyBird.java b/refactoring/flappy-bird/src/main/java/com/example/flappybird/FlappyBird.java index 264590d..06892bd 100644 --- a/refactoring/flappy-bird/src/main/java/com/example/flappybird/FlappyBird.java +++ b/refactoring/flappy-bird/src/main/java/com/example/flappybird/FlappyBird.java @@ -1,10 +1,12 @@ -package com.example.flappybird; /** +/** * FlappyBird.java * Main game class * * @author Paul Krishnamurthy */ +package com.example.flappybird; + import javax.swing.*; import java.awt.event.*; import java.awt.Toolkit; @@ -20,7 +22,6 @@ public class FlappyBird extends JFrame implements ActionListener { private static final int DELAY = 12; public FlappyBird () { - super("Flappy Bird"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(WIDTH, HEIGHT); @@ -46,9 +47,8 @@ public class FlappyBird extends JFrame implements ActionListener { } } - public static void main(String[] args) { - FlappyBird game = new FlappyBird(); + new FlappyBird(); } } diff --git a/refactoring/flappy-bird/src/main/java/com/example/flappybird/GamePanel.java b/refactoring/flappy-bird/src/main/java/com/example/flappybird/GamePanel.java index 9334669..53f28ec 100644 --- a/refactoring/flappy-bird/src/main/java/com/example/flappybird/GamePanel.java +++ b/refactoring/flappy-bird/src/main/java/com/example/flappybird/GamePanel.java @@ -1,32 +1,24 @@ -package com.example.flappybird; /** +/** * GamePanel.java * Main game panel * * @author Paul Krishnamurthy */ +package com.example.flappybird; + import com.example.flappybird.states.GameState; import com.example.flappybird.states.MenuState; - import java.awt.*; import java.awt.event.*; import javax.swing.*; -import java.net.URI; -import java.util.Random; -import java.util.ArrayList; -import java.util.HashMap; -import java.io.InputStream; -import java.io.BufferedInputStream; -import java.io.FileInputStream; -import java.awt.image.BufferedImage; -import java.util.Calendar; public class GamePanel extends JPanel implements KeyListener, MouseListener { // Textures private GameState gameState; - - public boolean ready = false; // If game has loaded + // If game has loaded + public boolean ready = false; public GamePanel () { setGameState(new MenuState(this)); @@ -42,6 +34,10 @@ public class GamePanel extends JPanel implements KeyListener, MouseListener { addMouseListener(this); } + /** + * Sets the current game state. + * @param state New GameState + */ public void setGameState(GameState state) { System.out.println("Switching to state: " + state.getClass().getName()); this.gameState = state; diff --git a/refactoring/flappy-bird/src/main/java/com/example/flappybird/Highscore.java b/refactoring/flappy-bird/src/main/java/com/example/flappybird/Highscore.java index c19b9c3..839ddb2 100644 --- a/refactoring/flappy-bird/src/main/java/com/example/flappybird/Highscore.java +++ b/refactoring/flappy-bird/src/main/java/com/example/flappybird/Highscore.java @@ -1,30 +1,30 @@ -package com.example.flappybird; /** +/** * Highscore.java * Handles setting and getting highscores * * @author Paul Krishnamurthy */ +package com.example.flappybird; + import java.net.URISyntaxException; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.nio.file.Paths; import java.util.Scanner; import java.io.File; import java.io.IOException; import java.io.PrintWriter; -import java.io.FileNotFoundException; -import java.io.UnsupportedEncodingException; - public class Highscore { - // Read / Write to file setup private static final String FILE_PATH = "/res/data/highscore.dat"; - private static final URL dataURL = Highscore.class.getResource(FILE_PATH); - private static final File dataFile; + // Highscore + private int bestScore; + static { try { assert dataURL != null; @@ -34,10 +34,7 @@ public class Highscore { } } - private static Scanner dataScanner = null; - - // Highscore - private int bestScore; + private static Scanner dataScanner = null; public Highscore () { @@ -54,7 +51,7 @@ public class Highscore { } /** - * @return Player's highscore + * @return Player's highscore */ public int bestScore () { return bestScore; @@ -62,20 +59,18 @@ public class Highscore { /** * Sets new highscore in the data file - * - * @param newBest New score update + * @param newBest New score update */ public void setNewBest (int newBest) { - // Set new best score bestScore = newBest; try { // Write new highscore to data file - PrintWriter dataWriter = new PrintWriter(FILE_PATH, "UTF-8"); - dataWriter.println(Integer.toString(newBest)); + PrintWriter dataWriter = new PrintWriter(FILE_PATH, StandardCharsets.UTF_8); + dataWriter.println(newBest); dataWriter.close(); - } catch (FileNotFoundException | UnsupportedEncodingException e) { + } catch (IOException e) { System.out.println("Could not set new highscore!"); } diff --git a/refactoring/flappy-bird/src/main/java/com/example/flappybird/Pipe.java b/refactoring/flappy-bird/src/main/java/com/example/flappybird/Pipe.java index 76d4fb5..73be0ae 100644 --- a/refactoring/flappy-bird/src/main/java/com/example/flappybird/Pipe.java +++ b/refactoring/flappy-bird/src/main/java/com/example/flappybird/Pipe.java @@ -1,5 +1,3 @@ -package com.example.flappybird; - /** * Pipe.java * Handles collisions and rendering for pipes @@ -7,6 +5,8 @@ package com.example.flappybird; * @author Paul Krishnamurthy */ +package com.example.flappybird; + public class Pipe extends HasPosition { // Placement (top or bottom) of pipe String location; @@ -31,7 +31,7 @@ public class Pipe extends HasPosition { super.x = FlappyBird.WIDTH + 5; // Reset x-coordinate // Set boundaries for top pipes - // This y-coordinte + PIPE_SPACING will be for the bottom pipe + // This y-coordinate + PIPE_SPACING will be for the bottom pipe if (location.equals("top")) { super.y = - Math.max((int) (Math.random() * 320) + 30, 140); } @@ -46,9 +46,8 @@ public class Pipe extends HasPosition { /** * Checks for bird colliding with pipe - * - * @param bird The bird. - * @return If bird is colliding with the pipe + * @param bird The bird. + * @return If bird is colliding with the pipe */ public boolean collide (Bird bird) { // Do not allow bird to jump over pipe @@ -64,8 +63,7 @@ public class Pipe extends HasPosition { /** * Set's pipe's y-coordinate (for bottom pipes) - * - * @param newY New y-coordinate + * @param newY New y-coordinate */ public void setY (int newY) { y = newY; diff --git a/refactoring/flappy-bird/src/main/java/com/example/flappybird/Sprites.java b/refactoring/flappy-bird/src/main/java/com/example/flappybird/Sprites.java index 115b8f7..eb35405 100644 --- a/refactoring/flappy-bird/src/main/java/com/example/flappybird/Sprites.java +++ b/refactoring/flappy-bird/src/main/java/com/example/flappybird/Sprites.java @@ -1,14 +1,15 @@ -package com.example.flappybird; /** +/** * Sprites.java * Cuts up the main sprite sheet * * @author Paul Krishnamurthy */ +package com.example.flappybird; + import java.awt.image.BufferedImage; import java.awt.Graphics2D; import java.io.IOException; -import java.io.File; import javax.imageio.ImageIO; import java.net.URL; import java.util.HashMap; @@ -18,14 +19,13 @@ public class Sprites { // Resize factor to match frame size private static final double RESIZE_FACTOR = 2.605; - private static BufferedImage spriteSheet = null; - - // HashMap of texture objects - private static HashMap textures = new HashMap(); + // HashMap of texture objects + private static final HashMap textures = new HashMap(); public Sprites () { // Try to load sprite sheet, exit program if cannot - try { + BufferedImage spriteSheet = null; + try { String fontPath = "/res/img/spriteSheet.png"; URL fontUrl = this.getClass().getResource(fontPath); assert fontUrl != null; diff --git a/refactoring/flappy-bird/src/main/java/com/example/flappybird/Texture.java b/refactoring/flappy-bird/src/main/java/com/example/flappybird/Texture.java index 923a44e..9aae5ce 100644 --- a/refactoring/flappy-bird/src/main/java/com/example/flappybird/Texture.java +++ b/refactoring/flappy-bird/src/main/java/com/example/flappybird/Texture.java @@ -1,10 +1,12 @@ -package com.example.flappybird; /** +/** * Texture.java * Stores data for game textures * * @author Paul Krishnamurthy */ +package com.example.flappybird; + import java.awt.image.BufferedImage; import java.awt.Rectangle; @@ -36,6 +38,5 @@ public class Texture extends HasPosition { public Rectangle getRect () { return rect; } - } diff --git a/refactoring/flappy-bird/src/main/java/com/example/flappybird/states/GameState.java b/refactoring/flappy-bird/src/main/java/com/example/flappybird/states/GameState.java index db54bc8..64564ae 100644 --- a/refactoring/flappy-bird/src/main/java/com/example/flappybird/states/GameState.java +++ b/refactoring/flappy-bird/src/main/java/com/example/flappybird/states/GameState.java @@ -41,16 +41,15 @@ public abstract class GameState { protected int score; // Player score protected int pipeDistTracker; // Distance between pipes - protected boolean inStartGameState = false; // To show instructions scren - protected Point clickedPoint = new Point(-1, -1); // Store point when player clicks + protected boolean scoreWasGreater; // If score was greater than previous highscore - protected String medal; // Medal to be awarded after each game + + protected Point clickedPoint = new Point(-1, -1); // Store point when player clicks public static ArrayList pipes; // Arraylist of Pipe objects protected static boolean darkTheme; // Boolean to show dark or light screen protected static Bird gameBird; - protected final static Highscore highscore = new Highscore(); public GamePanel gamePanel; diff --git a/refactoring/flappy-bird/src/main/java/com/example/flappybird/states/PlayState.java b/refactoring/flappy-bird/src/main/java/com/example/flappybird/states/PlayState.java index 2f84d26..1050db7 100644 --- a/refactoring/flappy-bird/src/main/java/com/example/flappybird/states/PlayState.java +++ b/refactoring/flappy-bird/src/main/java/com/example/flappybird/states/PlayState.java @@ -2,6 +2,7 @@ package com.example.flappybird.states; import com.example.flappybird.FlappyBird; import com.example.flappybird.GamePanel; +import com.example.flappybird.Highscore; import com.example.flappybird.Pipe; import javax.swing.*; @@ -10,13 +11,16 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; public class PlayState extends GameState { + protected boolean inStartGameState = false; // To show instructions screen + protected String medal; // Medal to be awarded after each game + + protected final Highscore highscore = new Highscore(); public PlayState(GamePanel panel) { super(panel); } public void startGameScreen (Graphics g) { - // Set bird's new position gameBird.setGameStartPos(); @@ -29,7 +33,6 @@ public class PlayState extends GameState { g.drawImage(textures.get("instructions").getImage(), textures.get("instructions").getX(), textures.get("instructions").getY(), null); - } /** @@ -159,7 +162,7 @@ public class PlayState extends GameState { if (gameBird.isAlive()) { if (p.collide(gameBird)) { // Kill bird and play sound - gameBird.kill(); + gameBird.killBird(); audio.hit(); } else { @@ -245,7 +248,7 @@ public class PlayState extends GameState { } else { // Start game pipeHandler(g); - gameBird.inGame(); + gameBird.inGameBorders(); } drawBase(g); // Draw base over pipes @@ -300,12 +303,10 @@ public class PlayState extends GameState { // On game over screen, allow restart and leaderboard buttons if (isTouching(textures.get("playButton").getRect())) { inStartGameState = true; - gamePanel.setGameState(new PlayState(gamePanel)); - restart(); + gamePanel.setGameState(this); gameBird.setGameStartPos(); - + restart(); } else if (isTouching(textures.get("leaderboard").getRect())) { - // Dummy message JOptionPane.showMessageDialog(gamePanel, "We can't access the leaderboard right now!",