From edb2ec71b65105c53d54830cf661b2609908bea6 Mon Sep 17 00:00:00 2001 From: Dallas <71103219+LeleDallas@users.noreply.github.com> Date: Mon, 8 Apr 2024 20:34:10 +0200 Subject: [PATCH 1/8] chore: removed unused assets --- BomberMan/src/main/resources/textures/bg.gif | Bin 21850 -> 0 bytes BomberMan/src/main/resources/textures/bg1.gif | Bin 77293 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 BomberMan/src/main/resources/textures/bg.gif delete mode 100644 BomberMan/src/main/resources/textures/bg1.gif diff --git a/BomberMan/src/main/resources/textures/bg.gif b/BomberMan/src/main/resources/textures/bg.gif deleted file mode 100644 index d2c19d1ed86d479337f8a93da27494eb3e090cca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21850 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 diff --git a/BomberMan/src/main/resources/textures/bg1.gif b/BomberMan/src/main/resources/textures/bg1.gif deleted file mode 100644 index 89ee49504d621a5e0cc0c4e79e096dc118942a04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77293 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 Date: Mon, 8 Apr 2024 21:20:04 +0200 Subject: [PATCH 2/8] refactor(States): sonarlint suggestions --- .../it/bomberman/states/ArenaModelImpl.java | 19 ++-- .../java/it/bomberman/states/ArenaState.java | 6 +- .../java/it/bomberman/states/GameState.java | 2 +- .../it/bomberman/states/GameStateManager.java | 16 ++-- .../java/it/bomberman/states/HelpState.java | 89 +++++++---------- .../java/it/bomberman/states/MenuState.java | 96 +++++++++---------- .../java/it/bomberman/states/WinnerState.java | 28 +++--- 7 files changed, 118 insertions(+), 138 deletions(-) diff --git a/BomberMan/src/main/java/it/bomberman/states/ArenaModelImpl.java b/BomberMan/src/main/java/it/bomberman/states/ArenaModelImpl.java index 29e48f4..d60d583 100644 --- a/BomberMan/src/main/java/it/bomberman/states/ArenaModelImpl.java +++ b/BomberMan/src/main/java/it/bomberman/states/ArenaModelImpl.java @@ -26,13 +26,12 @@ public class ArenaModelImpl implements ArenaModel, EntityController { private Player player2; private List registerLater; private List removeLater; - private Random random; private Clock clock; private boolean gameOver = false; private Optional winner; private List entities; - private final static int WALL_SPAWN_PROBABILITY = 60; - private final static int POWER_UP_SPAWN_PROBABILITY = 20; + private static final int WALL_SPAWN_PROBABILITY = 60; + private static final int POWER_UP_SPAWN_PROBABILITY = 20; public ArenaModelImpl(KeyManager keyManager) { player1 = new Player(70, 135, 1, keyManager, this); @@ -40,9 +39,9 @@ public ArenaModelImpl(KeyManager keyManager) { this.winner = Optional.empty(); this.clock = new Clock(200); - this.entities = new ArrayList(); - this.registerLater = new ArrayList(); - this.removeLater = new ArrayList(); + this.entities = new ArrayList<>(); + this.registerLater = new ArrayList<>(); + this.removeLater = new ArrayList<>(); this.collisionMan = new CollisionManager(); this.wallFactory = new WallFactoryImpl(); initMapLimitWalls(); @@ -61,7 +60,7 @@ public void update() { } public void checkClock() { - if (this.clock.getTime() == "000" || this.player1.getHealth() == 0 || this.player2.getHealth() == 0) { + if ("000".equals(this.clock.getTime()) || this.player1.getHealth() == 0 || this.player2.getHealth() == 0) { gameOver = true; if (player1.getHealth() > player2.getHealth()) { this.winner = Optional.of(player1); @@ -95,12 +94,12 @@ private void registerListed(Entity entity) { @Override public List getDrawables() { - List l = Collections.unmodifiableList(this.entities); - return l; + return Collections.unmodifiableList(this.entities); } private void initMapLimitWalls() { - List walls = new ArrayList(); + Random random; + List walls = new ArrayList<>(); int xLimit = 13; int yLimit = 8; int unit = WallFactoryImpl.DEFAULT_WALL_WIDTH; diff --git a/BomberMan/src/main/java/it/bomberman/states/ArenaState.java b/BomberMan/src/main/java/it/bomberman/states/ArenaState.java index 47843ce..03d75b9 100644 --- a/BomberMan/src/main/java/it/bomberman/states/ArenaState.java +++ b/BomberMan/src/main/java/it/bomberman/states/ArenaState.java @@ -17,7 +17,7 @@ public class ArenaState extends GameState { private Color backgroundColor; public ArenaState(GameStateManager gsm) { - this.gsm = gsm; + this.gameStateManager = gsm; this.keyManager = new KeyManager(); this.arenaModel = new ArenaModelImpl(this.keyManager); this.hud = new Hud(this.arenaModel.getPlayer1(), this.arenaModel.getPlayer2(), this.arenaModel.getClock()); @@ -46,8 +46,8 @@ public void draw(Graphics g) { g.fillRect(0, 0, 1200, 800); Toolkit.getDefaultToolkit().sync(); if (arenaModel.gameOver()) { - this.gsm.setWinner(this.arenaModel.getWinner()); - this.gsm.setState(GameStateManager.WINNER); + this.gameStateManager.setWinner(this.arenaModel.getWinner()); + this.gameStateManager.setState(GameStateManager.WINNER); } else { this.arenaModel.getDrawables().stream().forEach(e -> e.render(g)); Toolkit.getDefaultToolkit().sync(); diff --git a/BomberMan/src/main/java/it/bomberman/states/GameState.java b/BomberMan/src/main/java/it/bomberman/states/GameState.java index d050c8a..67b85b0 100644 --- a/BomberMan/src/main/java/it/bomberman/states/GameState.java +++ b/BomberMan/src/main/java/it/bomberman/states/GameState.java @@ -5,7 +5,7 @@ public abstract class GameState extends JPanel { private static final long serialVersionUID = 1L; - protected GameStateManager gsm; + protected GameStateManager gameStateManager; public abstract void init(); diff --git a/BomberMan/src/main/java/it/bomberman/states/GameStateManager.java b/BomberMan/src/main/java/it/bomberman/states/GameStateManager.java index 2db3f61..cb97f19 100644 --- a/BomberMan/src/main/java/it/bomberman/states/GameStateManager.java +++ b/BomberMan/src/main/java/it/bomberman/states/GameStateManager.java @@ -1,26 +1,28 @@ package it.bomberman.states; +import java.io.Serializable; import java.util.Optional; import javax.swing.JFrame; import it.bomberman.entities.Player; -public class GameStateManager { +public class GameStateManager implements Serializable { public static final int MENUSTATE = 0; public static final int ARENA = 1; public static final int WINNER = 2; - public static final int HELP= 3; + public static final int HELP = 3; private GameState state; private JFrame j; private Optional player; + public GameStateManager(JFrame j) { this.j = j; } public void setState(int state) { - this.state= this.initState(state); + this.state = this.initState(state); j.setContentPane(this.state); this.j.validate(); this.state.validate(); @@ -44,7 +46,7 @@ private GameState initState(int state) { gs = new ArenaState(this); } else if (state == WINNER) { gs = new WinnerState(this); - }else if (state == HELP) { + } else if (state == HELP) { gs = new HelpState(this); } @@ -54,8 +56,8 @@ private GameState initState(int state) { public Optional getWinner() { return this.player; } - - public void setWinner(Optionalplayer) { - this.player=player; + + public void setWinner(Optional player) { + this.player = player; } } diff --git a/BomberMan/src/main/java/it/bomberman/states/HelpState.java b/BomberMan/src/main/java/it/bomberman/states/HelpState.java index 13ceb75..185c068 100644 --- a/BomberMan/src/main/java/it/bomberman/states/HelpState.java +++ b/BomberMan/src/main/java/it/bomberman/states/HelpState.java @@ -13,7 +13,10 @@ public class HelpState extends GameState implements KeyListener { private static final long serialVersionUID = 1L; private GameStateManager gsm; private int currentChoice = 0; - private Font fontTitle, subTitle, paragraph, fontCh; + private Font fontTitle; + private Font subTitle; + private Font paragraph; + private Font fontCh; private int upgradeSpace = 150; private String[] options = { "Start Game", "Quit" }; @@ -38,13 +41,10 @@ public void init() { } private void select() { - switch (currentChoice) { - case 0: - this.gsm.setState(GameStateManager.ARENA); - break; - case 1: - System.exit(0); - break; + if (currentChoice == 0) { + this.gsm.setState(GameStateManager.ARENA); + } else { + System.exit(0); } } @@ -59,6 +59,7 @@ public void paint(Graphics g) { draw(g); } + @Override public void addNotify() { super.addNotify(); addKeyListener(this); @@ -66,7 +67,7 @@ public void addNotify() { private int getUpgradeDistance(int times, int distance) { int upgradePadding = 20; - return upgradeSpace + 120* times + distance * upgradePadding; + return upgradeSpace + 120 * times + distance * upgradePadding; } @Override @@ -109,53 +110,33 @@ public void draw(Graphics g) { g.drawString("It delimits the playing area", 250, 500); // UPGRADE - g.drawImage(Assets.upgrade[0], 750, getUpgradeDistance(0,0), 100, 100, null); - g.drawString("The BOMBERMAN SHOES: ", 860, getUpgradeDistance(0,1)); - g.drawString("Put your fantastic new sneakers in your feet", 860, getUpgradeDistance(0,2)); - g.drawString("and run fast then the explosion!", 860, getUpgradeDistance(0,3)); - g.drawString("INCREASE YOUR SPEED BY 1", 860, getUpgradeDistance(0,4)); - - g.drawImage(Assets.upgrade[1], 750, getUpgradeDistance(1,0), 100, 100, null); - g.drawString("The BOMBERMAN BOMB: ", 860, getUpgradeDistance(1,1)); - g.drawString("Drop only one bomb is boring...", 860, getUpgradeDistance(1,2)); - g.drawString("Now your pocket is bigger!", 860, getUpgradeDistance(1,3)); - g.drawString("INCREASE YOUR BOMB NUMBER BY 1", 860, getUpgradeDistance(1,4)); - - g.drawImage(Assets.upgrade[2], 750, getUpgradeDistance(2,0), 100, 100, null); - g.drawString("The BOMBERMAN HEART: ", 860, getUpgradeDistance(2,1)); - g.drawString("playing with bombs is not safe...", 860, getUpgradeDistance(2,2)); - g.drawString("But now you can play more safety!", 860, getUpgradeDistance(2,3)); - g.drawString("INCREASE YOUR LIFE BY 1", 860, getUpgradeDistance(2,4)); - - g.drawImage(Assets.upgrade[3], 750, getUpgradeDistance(3,0), 100, 100, null); - g.drawString("The BOMBERMAN CANDLE STICK: ", 860, getUpgradeDistance(3,1)); - g.drawString("Does your enemy run faster than you?", 860, getUpgradeDistance(3,2)); - g.drawString("Now you will have no more problems!", 860, getUpgradeDistance(3,3)); - g.drawString("INCREASE YOUR EXPLOSION RANGE BY 1", 860, getUpgradeDistance(3,4)); - - // g.drawString("Bomberman is an arcade game in which two or more players - // compete", 470, 200); - // g.drawString("against each other trying to make the opponent lose by blowing - // him", 470, 220); - // g.drawString("up with bombs.", 470, 240); - // g.drawString("The game ends when only one player is left with lives or when - // ", 470, 260); - // g.drawString("the game timer expires.", 470, 280); - // g.drawString("There are breakable and unbreakable wall.", 470, 300); - // g.drawString("Breakable walls can be destroyed using bombs.", 470, 320); - // g.drawString("A destoyed wall can drop upgrades.", 470, 340); - // g.drawString("Each bomb explodes a few seconds after it was dropped ", 470, - // 360); - // g.setFont(new Font("Century Gothic", Font.PLAIN, 29)); - // // g.drawString("CHOOSE STARTGAME AND HAVE FUN!!!", 470, 540); + g.drawImage(Assets.upgrade[0], 750, getUpgradeDistance(0, 0), 100, 100, null); + g.drawString("The BOMBERMAN SHOES: ", 860, getUpgradeDistance(0, 1)); + g.drawString("Put your fantastic new sneakers in your feet", 860, getUpgradeDistance(0, 2)); + g.drawString("and run fast then the explosion!", 860, getUpgradeDistance(0, 3)); + g.drawString("INCREASE YOUR SPEED BY 1", 860, getUpgradeDistance(0, 4)); + + g.drawImage(Assets.upgrade[1], 750, getUpgradeDistance(1, 0), 100, 100, null); + g.drawString("The BOMBERMAN BOMB: ", 860, getUpgradeDistance(1, 1)); + g.drawString("Drop only one bomb is boring...", 860, getUpgradeDistance(1, 2)); + g.drawString("Now your pocket is bigger!", 860, getUpgradeDistance(1, 3)); + g.drawString("INCREASE YOUR BOMB NUMBER BY 1", 860, getUpgradeDistance(1, 4)); + + g.drawImage(Assets.upgrade[2], 750, getUpgradeDistance(2, 0), 100, 100, null); + g.drawString("The BOMBERMAN HEART: ", 860, getUpgradeDistance(2, 1)); + g.drawString("playing with bombs is not safe...", 860, getUpgradeDistance(2, 2)); + g.drawString("But now you can play more safety!", 860, getUpgradeDistance(2, 3)); + g.drawString("INCREASE YOUR LIFE BY 1", 860, getUpgradeDistance(2, 4)); + + g.drawImage(Assets.upgrade[3], 750, getUpgradeDistance(3, 0), 100, 100, null); + g.drawString("The BOMBERMAN CANDLE STICK: ", 860, getUpgradeDistance(3, 1)); + g.drawString("Does your enemy run faster than you?", 860, getUpgradeDistance(3, 2)); + g.drawString("Now you will have no more problems!", 860, getUpgradeDistance(3, 3)); + g.drawString("INCREASE YOUR EXPLOSION RANGE BY 1", 860, getUpgradeDistance(3, 4)); g.setFont(fontCh); for (int i = 0; i < options.length; i++) { - if (i == currentChoice) { - g.setColor(Color.CYAN); - } else { - g.setColor(Color.WHITE); - } + g.setColor(i == currentChoice ? Color.CYAN : Color.WHITE); g.drawString(options[i], 600, 690 + i * 35); } Toolkit.getDefaultToolkit().sync(); @@ -163,6 +144,7 @@ public void draw(Graphics g) { @Override public void keyTyped(KeyEvent e) { + // default behaviour } @Override @@ -186,5 +168,6 @@ public void keyPressed(KeyEvent e) { @Override public void keyReleased(KeyEvent e) { + // default behaviour } } diff --git a/BomberMan/src/main/java/it/bomberman/states/MenuState.java b/BomberMan/src/main/java/it/bomberman/states/MenuState.java index 9846135..f518814 100644 --- a/BomberMan/src/main/java/it/bomberman/states/MenuState.java +++ b/BomberMan/src/main/java/it/bomberman/states/MenuState.java @@ -2,6 +2,7 @@ import java.awt.*; import java.awt.event.*; +import java.util.concurrent.atomic.AtomicInteger; import javax.swing.ImageIcon; import javax.swing.JLabel; @@ -9,77 +10,75 @@ public class MenuState extends GameState implements KeyListener { private static final long serialVersionUID = 1L; // dimensions - public final int WIDTH = 400; - public final int HEIGHT = 300; - public final int SCALE = 3; - public static String NAME = "BOMBERMAN"; - private ImageIcon ii; + public static final int WIDTH = 400; + public static final int HEIGHT = 300; + public static final int SCALE = 3; + public static final String NAME = "BOMBERMAN"; + private ImageIcon imageIcon; JLabel imageLabel; - private GameStateManager gsm; - private int currentChoice = 0; private String[] options = { "Start", "Help", "Quit" }; - private Color titleColor; private Font titleFont; private Font font; - private volatile int menuX; + private AtomicInteger menuX; private volatile boolean directionFlag = false; - public MenuState(GameStateManager gsm) { + public MenuState(GameStateManager gameStateManager) { super(); - this.gsm = gsm; + this.menuX = new AtomicInteger(0); + this.gameStateManager = gameStateManager; } public void init() { - imageLabel = new JLabel(); - // Prende la gif e aggiunge - try { - this.setLayout(new BorderLayout()); - ii = new ImageIcon(this.getClass().getResource("/textures/bg2.gif")); - ii.setImage(ii.getImage().getScaledInstance(WIDTH * SCALE, HEIGHT * SCALE, Image.SCALE_DEFAULT)); - imageLabel.setIcon(ii); - this.add(imageLabel, java.awt.BorderLayout.CENTER); - - } catch (Exception exception) { - exception.printStackTrace(); - } - try { + // Set up the background image + imageLabel = new JLabel(); + imageIcon = new ImageIcon(this.getClass().getResource("/textures/bg2.gif")); + imageIcon.setImage( + imageIcon.getImage().getScaledInstance(WIDTH * SCALE, HEIGHT * SCALE, Image.SCALE_DEFAULT)); + imageLabel.setIcon(imageIcon); + this.add(imageLabel, BorderLayout.CENTER); + + // Set up the title color and font titleColor = new Color(250, 250, 250); titleFont = new Font("Century Gothic", Font.PLAIN, 60); font = new Font("Arial", Font.PLAIN, 40); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception exception) { + exception.printStackTrace(); } + setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE)); setFocusable(true); requestFocus(); } public void update() { - if (directionFlag) - menuX--; - else - menuX++; - if (menuX == 70) + if (directionFlag) { + menuX.incrementAndGet(); + } else { + menuX.decrementAndGet(); + } + if (menuX.get() == 70) { directionFlag = true; - if (menuX == 0) + } + if (menuX.get() == 0) { directionFlag = false; + } repaint(); } private void select() { switch (currentChoice) { - case 0: - this.gsm.setState(GameStateManager.ARENA); - break; - case 1: - this.gsm.setState(GameStateManager.HELP); - break; - case 2: - System.exit(0); - break; + case 0: + this.gameStateManager.setState(GameStateManager.ARENA); + break; + case 1: + this.gameStateManager.setState(GameStateManager.HELP); + break; + default: + System.exit(0); + break; } } @@ -91,27 +90,22 @@ public void paint(Graphics g) { @Override public void draw(Graphics g2) { - // gsm.draw(g); - g2.drawImage(ii.getImage(), WIDTH * SCALE, HEIGHT * SCALE, null); - + g2.drawImage(imageIcon.getImage(), WIDTH * SCALE, HEIGHT * SCALE, null); g2.setColor(titleColor); g2.setFont(titleFont); - g2.drawString(NAME, 400 + menuX, 200); + g2.drawString(NAME, 400 + menuX.get(), 200); Toolkit.getDefaultToolkit().sync(); // draw menu options g2.setFont(font); for (int i = 0; i < options.length; i++) { - if (i == currentChoice) { - g2.setColor(Color.CYAN); - } else { - g2.setColor(Color.WHITE); - } + g2.setColor(i == currentChoice ? Color.CYAN : Color.WHITE); g2.drawString(options[i], 570, 520 + i * 55); } Toolkit.getDefaultToolkit().sync(); } + @Override public void addNotify() { super.addNotify(); addKeyListener(this); @@ -138,9 +132,11 @@ public void keyPressed(KeyEvent k) { @Override public void keyTyped(KeyEvent e) { + // Not useed } @Override public void keyReleased(KeyEvent e) { + // Not useed } } \ No newline at end of file diff --git a/BomberMan/src/main/java/it/bomberman/states/WinnerState.java b/BomberMan/src/main/java/it/bomberman/states/WinnerState.java index e876649..616bc20 100644 --- a/BomberMan/src/main/java/it/bomberman/states/WinnerState.java +++ b/BomberMan/src/main/java/it/bomberman/states/WinnerState.java @@ -14,30 +14,28 @@ public class WinnerState extends GameState implements KeyListener { private static final long serialVersionUID = 1L; - private GameStateManager gsm; - private Optional player; - private Font fontTitle, fontPar; + private transient Optional player; + private Font fontTitle; + private Font fontPar; private int currentChoice = 0; private String[] options = { "Retry", "Quit" }; - public WinnerState(GameStateManager gsm) { + public WinnerState(GameStateManager gameStateManager) { super(); - this.gsm = gsm; - this.player = this.gsm.getWinner(); + this.gameStateManager = gameStateManager; + this.player = this.gameStateManager.getWinner(); } private void select() { - switch (currentChoice) { - case 0: - this.gsm.setState(GameStateManager.ARENA); - this.gsm.update(); - break; - case 1: - System.exit(0); - break; + if (currentChoice == 0) { + this.gameStateManager.setState(GameStateManager.ARENA); + this.gameStateManager.update(); + } else { + System.exit(0); } } + @Override public void addNotify() { super.addNotify(); addKeyListener(this); @@ -117,10 +115,12 @@ public void keyPressed(KeyEvent e) { @Override public void keyReleased(KeyEvent e) { + // Not used } @Override public void keyTyped(KeyEvent e) { + // Not used } } From 34c67ae467f771a2d516dc1b5aa788f954c8be38 Mon Sep 17 00:00:00 2001 From: Dallas <71103219+LeleDallas@users.noreply.github.com> Date: Mon, 8 Apr 2024 21:20:40 +0200 Subject: [PATCH 3/8] chore: update binaries --- BomberMan/.classpath | 16 ++++++++-------- .../org.eclipse.buildship.core.prefs | 10 +++++----- .../.settings/org.eclipse.jdt.core.prefs | 7 ++++--- .../main/it/bomberman/input/KeyManager.class | Bin 1233 -> 1233 bytes BomberMan/gradlew | 0 5 files changed, 17 insertions(+), 16 deletions(-) mode change 100644 => 100755 BomberMan/gradlew diff --git a/BomberMan/.classpath b/BomberMan/.classpath index 79126ac..e675bf0 100644 --- a/BomberMan/.classpath +++ b/BomberMan/.classpath @@ -1,9 +1,10 @@ - + - - + + + @@ -12,14 +13,13 @@ - + - - - + + - + diff --git a/BomberMan/.settings/org.eclipse.buildship.core.prefs b/BomberMan/.settings/org.eclipse.buildship.core.prefs index 2b11252..e479558 100644 --- a/BomberMan/.settings/org.eclipse.buildship.core.prefs +++ b/BomberMan/.settings/org.eclipse.buildship.core.prefs @@ -1,13 +1,13 @@ -arguments=--init-script /var/folders/wr/g2gmgrxn15bc9gnhdycf5k_r0000gn/T/d146c9752a26f79b52047fb6dc6ed385d064e120494f96f08ca63a317c41f94c.gradle --init-script /var/folders/wr/g2gmgrxn15bc9gnhdycf5k_r0000gn/T/52cde0cfcf3e28b8b7510e992210d9614505e0911af0c190bd590d7158574963.gradle +arguments= auto.sync=false build.scans.enabled=false connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) connection.project.dir= eclipse.preferences.version=1 gradle.user.home= -java.home=/Users/dallas/Library/Java/JavaVirtualMachines/corretto-11.0.14.1/Contents/Home +java.home= jvm.arguments= offline.mode=false -override.workspace.settings=true -show.console.view=true -show.executions.view=true +override.workspace.settings=false +show.console.view=false +show.executions.view=false diff --git a/BomberMan/.settings/org.eclipse.jdt.core.prefs b/BomberMan/.settings/org.eclipse.jdt.core.prefs index 18ad895..bbf9f29 100644 --- a/BomberMan/.settings/org.eclipse.jdt.core.prefs +++ b/BomberMan/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,5 @@ eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=ignore +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.source=17 diff --git a/BomberMan/bin/main/it/bomberman/input/KeyManager.class b/BomberMan/bin/main/it/bomberman/input/KeyManager.class index 4f4a12e80d8e4df14ed26e62a0682d0a31eb1bf8..103fd88da0c051f6e37b9f9e7701b7080439f2ef 100644 GIT binary patch delta 47 zcmcb}d6ARj)W2Q(7#J9AH*#>Xu*x%VF(^#VV3D6}#-hur0_3Rzc}|R)lUK8-0RTXO B3z7f; delta 47 zcmcb}d6ARj)W2Q(7#JALH*#>XuqrTcF(^*XV3D6}#-hur2IQ#&c}|SllUK8-0RTWF B3zPr= diff --git a/BomberMan/gradlew b/BomberMan/gradlew old mode 100644 new mode 100755 From 4bba1c564d99473be1d346c3cbd0ad19852a8bc7 Mon Sep 17 00:00:00 2001 From: Dallas <71103219+LeleDallas@users.noreply.github.com> Date: Mon, 8 Apr 2024 21:21:00 +0200 Subject: [PATCH 4/8] refactor: sonarlint suggestion, code improvements --- .../java/it/bomberman/collisions/Body.java | 22 ++--- .../it/bomberman/entities/AbstractEntity.java | 19 ++-- .../main/java/it/bomberman/entities/Bomb.java | 20 ++-- .../java/it/bomberman/entities/Explosion.java | 66 ++++++------- .../java/it/bomberman/entities/Player.java | 85 +++++++++-------- .../java/it/bomberman/entities/PowerUp.java | 6 +- .../bomberman/entities/WallFactoryImpl.java | 14 +-- .../main/java/it/bomberman/gfx/Animation.java | 6 +- .../main/java/it/bomberman/gfx/Assets.java | 94 ++++++++++--------- .../java/it/bomberman/input/KeyManager.java | 3 - .../main/java/it/bomberman/menu/MenuView.java | 17 ++-- 11 files changed, 170 insertions(+), 182 deletions(-) diff --git a/BomberMan/src/main/java/it/bomberman/collisions/Body.java b/BomberMan/src/main/java/it/bomberman/collisions/Body.java index a440346..30d270e 100644 --- a/BomberMan/src/main/java/it/bomberman/collisions/Body.java +++ b/BomberMan/src/main/java/it/bomberman/collisions/Body.java @@ -6,11 +6,14 @@ import java.util.Collections; import java.util.List; + + public class Body { + public List boundingShapes; public Body() { - this.boundingShapes = new ArrayList(); + this.boundingShapes = new ArrayList<>(); } public Body(Shape s) { @@ -37,15 +40,14 @@ public boolean checkCollision(List otherBoundingShapes) { return false; } - boolean out = false; - for (var s : this.boundingShapes) { - for (var otherS : otherBoundingShapes) { + for (Shape s : this.boundingShapes) { + for (Shape otherS : otherBoundingShapes) { if (s.intersects(otherS)) { - out = true; + return true; // Collision detected, return true immediately } } } - return out; + return false; // No collision detected } public List getBoundingShapes() { @@ -53,14 +55,10 @@ public List getBoundingShapes() { } public void move(int x, int y) { - for (Shape s : this.boundingShapes) { - s.move(x, y); - } + boundingShapes.forEach(s -> s.move(x, y)); } public void render(Graphics g, Color color) { - for (Shape s : this.boundingShapes) { - s.render(g, color); - } + boundingShapes.forEach(s -> s.render(g, color)); } } diff --git a/BomberMan/src/main/java/it/bomberman/entities/AbstractEntity.java b/BomberMan/src/main/java/it/bomberman/entities/AbstractEntity.java index a056c8e..13f24ae 100644 --- a/BomberMan/src/main/java/it/bomberman/entities/AbstractEntity.java +++ b/BomberMan/src/main/java/it/bomberman/entities/AbstractEntity.java @@ -3,10 +3,6 @@ import it.bomberman.collisions.Body; import it.bomberman.collisions.Vector2; -/** - * Classe che reacchiude le i dati che hanno in comune la maggior parte delle Classi che estendono Entity - *(Restano escluse Wall e Explosion) - */ public abstract class AbstractEntity implements Entity { protected int x; protected int y; @@ -14,7 +10,7 @@ public abstract class AbstractEntity implements Entity { protected int height; protected EntityController controller; protected Body body; - + protected AbstractEntity(int x, int y, int width, int height, EntityController controller) { this.x = x; this.y = y; @@ -23,17 +19,14 @@ protected AbstractEntity(int x, int y, int width, int height, EntityController c this.controller = controller; initBody(); } - - /** - * Template method da implementare per assicurare l'inizializzazione del body - */ + protected abstract void initBody(); - - @Override + + @Override public Body getBody() { - return this.body; + return this.body; } - + @Override public Vector2 getPosition() { return Vector2.unmodifiableVector2(new Vector2(x, y)); diff --git a/BomberMan/src/main/java/it/bomberman/entities/Bomb.java b/BomberMan/src/main/java/it/bomberman/entities/Bomb.java index 1687539..544fd03 100644 --- a/BomberMan/src/main/java/it/bomberman/entities/Bomb.java +++ b/BomberMan/src/main/java/it/bomberman/entities/Bomb.java @@ -8,19 +8,16 @@ import it.bomberman.gfx.Animation; import it.bomberman.gfx.Assets; -//import org.dyn4j.geometry.Vector2; - -public class Bomb extends AbstractEntity implements ICollidable { +public class Bomb extends AbstractEntity { public static final long DEFAULT_TIMER_LENGTH = (long) 3e+9; // 3s espressi in nano secondi public static final int DEFAULT_WIDTH = 100; public static final int DEFAULT_EXPLOSION_EXTENTION = 1; + private static final int SCALE = 2; private long startTime; - private final long timerLength = DEFAULT_TIMER_LENGTH; - private int exlposionExtention; + private int explosionExtention; private boolean exploded = false; - private final int SCALE = 2; private Animation animation; protected Bomb(int x, int y, int width, int height, EntityController controller) { @@ -30,7 +27,7 @@ protected Bomb(int x, int y, int width, int height, EntityController controller) public Bomb(int x, int y, int explosionExtension, EntityController controller) { this(x, y, DEFAULT_WIDTH, DEFAULT_WIDTH, controller); this.exploded = false; - this.exlposionExtention = explosionExtension; + this.explosionExtention = explosionExtension; this.animation = new Animation(600, Assets.bomb); this.startTime = System.nanoTime(); } @@ -44,7 +41,7 @@ protected void initBody() { @Override public void tick() { long now = System.nanoTime(); - if (now - this.startTime > this.timerLength) { + if (now - this.startTime > DEFAULT_TIMER_LENGTH) { this.explode(); } this.animation.tick(); @@ -52,15 +49,14 @@ public void tick() { @Override public void render(Graphics g) { - - // this.body.render(g, Color.BLUE); - g.drawImage(getCurrentAnimationFrame(), this.x-40, this.y-20, this.width * SCALE, this.height * SCALE, null); + g.drawImage(getCurrentAnimationFrame(), this.x - 40, this.y - 20, this.width * SCALE, this.height * SCALE, + null); } public void explode() { this.exploded = true; - this.controller.register(new Explosion(this.x, this.y, this.exlposionExtention, this.controller)); + this.controller.register(new Explosion(this.x, this.y, this.explosionExtention, this.controller)); this.dispose(); } diff --git a/BomberMan/src/main/java/it/bomberman/entities/Explosion.java b/BomberMan/src/main/java/it/bomberman/entities/Explosion.java index e96497b..83ae163 100644 --- a/BomberMan/src/main/java/it/bomberman/entities/Explosion.java +++ b/BomberMan/src/main/java/it/bomberman/entities/Explosion.java @@ -9,7 +9,7 @@ import it.bomberman.collisions.Vector2; import it.bomberman.gfx.Assets; -public class Explosion implements Entity{ +public class Explosion implements Entity { /** * Un esplosione si occupa di gestire due Shape Rettangolari e di innescare @@ -22,13 +22,11 @@ public class Explosion implements Entity{ */ public static final long DEFAULT_TIMER_LENGTH = (long) 1e9; // 1s espressi in nano secondi - public final static int DEFAULT_EXPLOSION_EXTENSION = 1; - public final static int UNIT = WallFactoryImpl.DEFAULT_WALL_WIDTH; - public final static int THICKNESS = 35; + public static final int DEFAULT_EXPLOSION_EXTENSION = 1; + public static final int UNIT = WallFactoryImpl.DEFAULT_WALL_WIDTH; + public static final int THICKNESS = 35; private int explExtension; private long startTime; - private final long timerLength = DEFAULT_TIMER_LENGTH; - private int x; private int y; private EntityController controller; @@ -52,7 +50,7 @@ private void initBody() { @Override public void tick() { - if (System.nanoTime() - this.startTime > this.timerLength) { + if (System.nanoTime() - this.startTime > DEFAULT_TIMER_LENGTH) { this.end(); } this.controller.checkAndResolveCollisions(this); @@ -61,9 +59,9 @@ public void tick() { @Override public void render(Graphics g) { int centerX = this.x - 8; - int centerY = this.y -15; + int centerY = this.y - 15; this.body.render(g, Color.YELLOW); - + // scale � dovuto al crop non corretto // viene lasciato un bordo trasparente in alpha layer intorno alla Image // Deve essere corretto in Assetts @@ -72,20 +70,20 @@ public void render(Graphics g) { Rectangle rect = (Rectangle) this.body.getBoundingShapes().get(0); int x = rect.getPosition().getX(); int y = rect.getPosition().getY(); - int w = (int)(rect.getWidth() * scaleX); - int h = (int)(rect.getHeight() * scaleY); + int w = (int) (rect.getWidth() * scaleX); + int h = (int) (rect.getHeight() * scaleY); // UP|DOWN g.drawImage(Assets.explosion[1], x, y, w, h, null); rect = (Rectangle) this.body.getBoundingShapes().get(1); x = rect.getPosition().getX(); y = rect.getPosition().getY(); w = (int) (rect.getWidth() * scaleY); - h = (int) (rect.getHeight()* scaleX); + h = (int) (rect.getHeight() * scaleX); // LEFT|RIGHT - g.drawImage(Assets.explosion[2], x,y,w,h,null); - + g.drawImage(Assets.explosion[2], x, y, w, h, null); + // CENTER - g.drawImage(Assets.explosion[0], centerX, centerY, w-8, w, null); + g.drawImage(Assets.explosion[0], centerX, centerY, w - 8, w, null); } @@ -96,16 +94,7 @@ public Vector2 getPosition() { @Override public boolean shouldCollide(ICollidable collidable) { - if (collidable instanceof Player) { - return true; - } - if (collidable instanceof Wall) { - return true; - } - if (collidable instanceof Bomb) { - return true; - } - return false; + return (collidable instanceof Player || collidable instanceof Wall || collidable instanceof Bomb); } public void collision(Player player) { @@ -113,27 +102,26 @@ public void collision(Player player) { } public void collision(Bomb bomb) { - // TODO Auto-generated method stub - + // unused } // innesca la collisione e la lascia gestire all'oggetto specifico public void collision(ICollidable collidable) { collidable.collision(this); -// if (collidable instanceof Wall) { -// collision((Wall) collidable); -// } else if (collidable instanceof Player) { -// collision((Player) collidable); -// } else if (collidable instanceof Bomb) { -// collision((Bomb) collidable); -// } + // if (collidable instanceof Wall) { + // collision((Wall) collidable); + // } else if (collidable instanceof Player) { + // collision((Player) collidable); + // } else if (collidable instanceof Bomb) { + // collision((Bomb) collidable); + // } } -// public void collision(Wall wall) { -// // Explosion serve solo a innescare collisioni in altre Entity -// // per questo le consguenze delle collisioni sono gestite in Wall -// wall.collision(this); -// } + // public void collision(Wall wall) { + // // Explosion serve solo a innescare collisioni in altre Entity + // // per questo le consguenze delle collisioni sono gestite in Wall + // wall.collision(this); + // } @Override public Body getBody() { diff --git a/BomberMan/src/main/java/it/bomberman/entities/Player.java b/BomberMan/src/main/java/it/bomberman/entities/Player.java index 5a030a2..8381636 100644 --- a/BomberMan/src/main/java/it/bomberman/entities/Player.java +++ b/BomberMan/src/main/java/it/bomberman/entities/Player.java @@ -4,12 +4,14 @@ import java.awt.image.BufferedImage; import java.util.HashSet; import java.util.Set; + import it.bomberman.collisions.Body; import it.bomberman.collisions.ICollidable; import it.bomberman.collisions.Rectangle; import it.bomberman.collisions.Vector2; import it.bomberman.entities.PowerUp.PowerUpType; -import it.bomberman.gfx.*; +import it.bomberman.gfx.Animation; +import it.bomberman.gfx.Assets; import it.bomberman.input.KeyManager; public class Player extends AbstractEntity { @@ -18,12 +20,16 @@ public class Player extends AbstractEntity { public static final int DEFAULT_PLAYER_WIDTH = 108; public static final int DEFAULT_PLAYER_HEIGHT = 90; public static final int SPEED_MULTIPLIER = 2; - private Animation animDown, animUp, animLeft, animRight, animBomb; + private static final int CROP_OFFSET_X = 17; + private static final int CROP_OFFSET_Y = 22; + private Animation animDown; + private Animation animUp; + private Animation animLeft; + private Animation animRight; + private Animation animBomb; private KeyManager keyManager; private int playerNumb; private Body body; - private final int cropOffsetX = 17; - private final int cropOffsetY = 22; private final int initialPosX; private final int initialPosY; @@ -53,9 +59,7 @@ public Player(int x, int y, int n, KeyManager keyManager, EntityController contr this.playerNumb = n; this.keyManager = keyManager; - this.bombs = new HashSet(); - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Creare una classe esterna che gestisce i player per animazioni!! + this.bombs = new HashSet<>(); if (playerNumb == 1) { animDown = new Animation(150, Assets.player_d); @@ -87,7 +91,7 @@ private void init() { @Override protected void initBody() { this.body = new Body(); - this.body.add(new Rectangle(this.x + cropOffsetX, this.y + cropOffsetY, 40, 70)); + this.body.add(new Rectangle(this.x + CROP_OFFSET_X, this.y + CROP_OFFSET_Y, 40, 70)); } public void getInput() { @@ -98,30 +102,45 @@ public void getInput() { int s = SPEED_MULTIPLIER * this.speed + 2; if (this.playerNumb == 1) { - if (this.keyManager.up) - yMove -= s; - if (this.keyManager.down) - yMove = s; - if (this.keyManager.left) - xMove -= s; - if (this.keyManager.right) - xMove = s; + handlePlayer1Movement(s); + handlePlayer1BombDrop(); } if (this.playerNumb == 2) { - if (this.keyManager.up2) - yMove -= s; - if (this.keyManager.down2) - yMove = s; - if (this.keyManager.left2) - xMove -= s; - if (this.keyManager.right2) - xMove = s; + handlePlayer2Movement(s); + handlePlayer2BombDrop(); } + } + + private void handlePlayer1Movement(int s) { + if (this.keyManager.up) + yMove -= s; + if (this.keyManager.down) + yMove = s; + if (this.keyManager.left) + xMove -= s; + if (this.keyManager.right) + xMove = s; + } + + private void handlePlayer2Movement(int s) { + if (this.keyManager.up2) + yMove -= s; + if (this.keyManager.down2) + yMove = s; + if (this.keyManager.left2) + xMove -= s; + if (this.keyManager.right2) + xMove = s; + } + + private void handlePlayer1BombDrop() { if (this.keyManager.drop && playerNumb == 1) { dropBomb(); } + } + private void handlePlayer2BombDrop() { if (this.keyManager.drop2 && playerNumb == 2) { dropBomb(); } @@ -144,13 +163,13 @@ public void tick() { int oldY = this.y; this.x += xMove; this.y += yMove; - this.body.move(this.x + cropOffsetX, this.y + cropOffsetY); + this.body.move(this.x + CROP_OFFSET_X, this.y + CROP_OFFSET_Y); if (this.controller.verifyCollision(this)) { this.x = oldX; this.y = oldY; this.xMove = 0; this.yMove = 0; - this.body.move(this.x + cropOffsetX, this.y + cropOffsetY); + this.body.move(this.x + CROP_OFFSET_X, this.y + CROP_OFFSET_Y); } } @@ -189,10 +208,7 @@ public Body getBody() { @Override public boolean shouldCollide(ICollidable collidable) { - if (collidable instanceof Wall) { - return true; - } - return false; + return collidable instanceof Wall; } @Override @@ -214,8 +230,6 @@ public void collision(Explosion exp) { public void collision(Wall wall) { // Do Nothing // Die if deathWall - - // Qui andrebbe implementata la dinamica di rollback } public void collision(PowerUp up) { @@ -238,7 +252,7 @@ public void collision(PowerUp up) { public void dropBomb() { if (canDropBomb()) { - Bomb b = new Bomb(this.x + cropOffsetX, this.y + cropOffsetY, this.bombExtension, this.controller); + Bomb b = new Bomb(this.x + CROP_OFFSET_X, this.y + CROP_OFFSET_Y, this.bombExtension, this.controller); this.bombs.add(b); this.controller.register(b); this.lastBombDroppedTime = System.nanoTime(); @@ -259,10 +273,7 @@ private void die() { } private boolean canDropBomb() { - // se non ci sono bombe sul campo - // oppure - // ci sono meno bombe del massi ed e' passato abbastanza tempo dall'ultima bomba - return (this.bombs.size() == 0) || ((this.bombs.size() < this.nBombs) + return (this.bombs.isEmpty()) || ((this.bombs.size() < this.nBombs) && (System.nanoTime() - this.lastBombDroppedTime > this.bombDroppedCoolDown)); } diff --git a/BomberMan/src/main/java/it/bomberman/entities/PowerUp.java b/BomberMan/src/main/java/it/bomberman/entities/PowerUp.java index 91fcc9b..7c579f7 100644 --- a/BomberMan/src/main/java/it/bomberman/entities/PowerUp.java +++ b/BomberMan/src/main/java/it/bomberman/entities/PowerUp.java @@ -8,7 +8,7 @@ import it.bomberman.gfx.Assets; public class PowerUp extends AbstractEntity { - private final static int DEFAULT_WIDTH = 50; + private static final int DEFAULT_WIDTH = 50; private PowerUpType type; private int value; @@ -117,7 +117,7 @@ public PowerUpBuilder setType(PowerUpType type) { */ public PowerUpBuilder setValue(int value) { if (!checkValue(value)) { - throw new IllegalArgumentException("Value di PowerUp deve essere 0 < v < 6"); + throw new IllegalArgumentException("Powerup value must be between 1 and 5!"); } this.value = value; return this; @@ -139,7 +139,7 @@ private boolean checkValue(int value) { public PowerUp build() { if (this.controller == null || this.type == null || !checkValue(this.value)) { - throw new IllegalStateException("Un dato ha valore inaccettabile!"); + throw new IllegalStateException("PowerUpBuilder not correctly initialized!"); } return new PowerUp(this.x, this.y, this.width, this.height, this.type, this.value, this.controller); } diff --git a/BomberMan/src/main/java/it/bomberman/entities/WallFactoryImpl.java b/BomberMan/src/main/java/it/bomberman/entities/WallFactoryImpl.java index 6e41a2a..fadafd9 100644 --- a/BomberMan/src/main/java/it/bomberman/entities/WallFactoryImpl.java +++ b/BomberMan/src/main/java/it/bomberman/entities/WallFactoryImpl.java @@ -23,6 +23,7 @@ public MapLimitWall(int x, int y, EntityController controller) { @Override public void render(Graphics g) { + // Default behavior } } return new MapLimitWall(x, y, controller); @@ -31,7 +32,7 @@ public void render(Graphics g) { @Override public Wall simpleWall(int x, int y, EntityController controller) { return new Wall() { - + private static final Random random = new Random(); private int width = DEFAULT_WALL_WIDTH; private Body body = new Body(new Rectangle(x, y, width, width)); private EntityController contr = controller; @@ -43,13 +44,7 @@ public Vector2 getPosition() { @Override public boolean shouldCollide(ICollidable collidable) { - if (collidable instanceof Player) { - return true; - } - if (collidable instanceof Explosion) { - return true; - } - return false; + return (collidable instanceof Player || collidable instanceof Explosion); } @Override @@ -66,6 +61,7 @@ public void collision(Explosion explosion) { @Override public void tick() { + // default behavior } @Override @@ -86,8 +82,6 @@ public Body getBody() { @Override public void dispose() { - // random - Random random = new Random(); final PowerUpType type = PowerUpType.values()[random.nextInt(PowerUpType.values().length)]; if (random.nextInt(100) < POWER_UP_DROP_PROBABILITY) { PowerUp up = PowerUp.PowerUpBuilder.newBuilder() diff --git a/BomberMan/src/main/java/it/bomberman/gfx/Animation.java b/BomberMan/src/main/java/it/bomberman/gfx/Animation.java index c8ee83e..6eede82 100644 --- a/BomberMan/src/main/java/it/bomberman/gfx/Animation.java +++ b/BomberMan/src/main/java/it/bomberman/gfx/Animation.java @@ -4,8 +4,10 @@ public class Animation { - private int speed, index; - private long lastTime, timer; + private int speed; + private int index; + private long lastTime; + private long timer; private BufferedImage[] frames; public Animation(int speed, BufferedImage[] frames) { diff --git a/BomberMan/src/main/java/it/bomberman/gfx/Assets.java b/BomberMan/src/main/java/it/bomberman/gfx/Assets.java index 7e32598..050e2cc 100644 --- a/BomberMan/src/main/java/it/bomberman/gfx/Assets.java +++ b/BomberMan/src/main/java/it/bomberman/gfx/Assets.java @@ -3,18 +3,26 @@ import java.awt.image.BufferedImage; public class Assets { - private static final int width = 49, height = 49, heightHud = 22; - public static BufferedImage simpleWall, deathWall, wall; - - public static final BufferedImage[] player_d, player_u, player_r, player_l, player_bomb; - public static final BufferedImage[] player_d2, player_u2, player_r2, player_l2, player_bomb2; - + private static final int WIDTH = 49; + private static final int HEIGHT = 49; + private static final int HUDHEIGHT = 22; + public static final BufferedImage simpleWall; + public static final BufferedImage deathWall; + public static final BufferedImage wall; + + public static final BufferedImage[] player_d; + public static final BufferedImage[] player_u; + public static final BufferedImage[] player_r; + public static final BufferedImage[] player_l; + public static final BufferedImage[] player_bomb; + public static final BufferedImage[] player_d2; + public static final BufferedImage[] player_u2; + public static final BufferedImage[] player_r2; + public static final BufferedImage[] player_l2; + public static final BufferedImage[] player_bomb2; public static final BufferedImage[] bomb; - public static final BufferedImage[] hud; - public static final BufferedImage[] explosion; - public static final BufferedImage[] upgrade; static { @@ -27,66 +35,66 @@ public class Assets { player_bomb2 = new BufferedImage[2]; // player_d[0]= sheet.crop(0, 0, width, height); - player_d[0] = sheet.crop(width, 0, width, height); - player_d[1] = sheet.crop(width * 2, 0, width, height); + player_d[0] = sheet.crop(WIDTH, 0, WIDTH, HEIGHT); + player_d[1] = sheet.crop(WIDTH * 2, 0, WIDTH, HEIGHT); // player_u[0]= sheet.crop(width*3, 0, width, height); - player_u[0] = sheet.crop(width * 4, 0, width, height); - player_u[1] = sheet.crop(width * 5, 0, width, height); + player_u[0] = sheet.crop(WIDTH * 4, 0, WIDTH, HEIGHT); + player_u[1] = sheet.crop(WIDTH * 5, 0, WIDTH, HEIGHT); - player_r[1] = sheet.crop(width * 6, 0, width, height); - player_r[0] = sheet.crop(width * 7, 0, width, height); - player_r[2] = sheet.crop(width * 8, 0, width, height); + player_r[1] = sheet.crop(WIDTH * 6, 0, WIDTH, HEIGHT); + player_r[0] = sheet.crop(WIDTH * 7, 0, WIDTH, HEIGHT); + player_r[2] = sheet.crop(WIDTH * 8, 0, WIDTH, HEIGHT); - player_l[1] = sheet.crop(width * 9, 0, width, height); - player_l[0] = sheet.crop(width * 10, 0, width, height); - player_l[2] = sheet.crop(width * 11, 0, width, height); + player_l[1] = sheet.crop(WIDTH * 9, 0, WIDTH, HEIGHT); + player_l[0] = sheet.crop(WIDTH * 10, 0, WIDTH, HEIGHT); + player_l[2] = sheet.crop(WIDTH * 11, 0, WIDTH, HEIGHT); - player_bomb[1] = sheet.crop(width * 12, 0, width, height); - player_bomb[0] = sheet.crop(width * 13, 0, width, height); + player_bomb[1] = sheet.crop(WIDTH * 12, 0, WIDTH, HEIGHT); + player_bomb[0] = sheet.crop(WIDTH * 13, 0, WIDTH, HEIGHT); player_u2 = new BufferedImage[2]; player_d2 = new BufferedImage[2]; player_r2 = new BufferedImage[3]; player_l2 = new BufferedImage[3]; - player_d2[0] = sheet.crop(width, height, width, height); - player_d2[1] = sheet.crop(width * 2, height, width, height); + player_d2[0] = sheet.crop(WIDTH, HEIGHT, WIDTH, HEIGHT); + player_d2[1] = sheet.crop(WIDTH * 2, HEIGHT, WIDTH, HEIGHT); - player_u2[0] = sheet.crop(width * 4, height, width, height); - player_u2[1] = sheet.crop(width * 5, height, width, height); + player_u2[0] = sheet.crop(WIDTH * 4, HEIGHT, WIDTH, HEIGHT); + player_u2[1] = sheet.crop(WIDTH * 5, HEIGHT, WIDTH, HEIGHT); - player_r2[1] = sheet.crop(width * 6, height, width, height); - player_r2[0] = sheet.crop(width * 7, height, width, height); - player_r2[2] = sheet.crop(width * 8, height, width, height); + player_r2[1] = sheet.crop(WIDTH * 6, HEIGHT, WIDTH, HEIGHT); + player_r2[0] = sheet.crop(WIDTH * 7, HEIGHT, WIDTH, HEIGHT); + player_r2[2] = sheet.crop(WIDTH * 8, HEIGHT, WIDTH, HEIGHT); - player_l2[1] = sheet.crop(width * 9, height, width, height); - player_l2[0] = sheet.crop(width * 10, height, width, height); - player_l2[2] = sheet.crop(width * 11, height, width, height); + player_l2[1] = sheet.crop(WIDTH * 9, HEIGHT, WIDTH, HEIGHT); + player_l2[0] = sheet.crop(WIDTH * 10, HEIGHT, WIDTH, HEIGHT); + player_l2[2] = sheet.crop(WIDTH * 11, HEIGHT, WIDTH, HEIGHT); - player_bomb2[1] = sheet.crop(width * 12, height, width, height); - player_bomb2[0] = sheet.crop(width * 13, height, width, height); + player_bomb2[1] = sheet.crop(WIDTH * 12, HEIGHT, WIDTH, HEIGHT); + player_bomb2[0] = sheet.crop(WIDTH * 13, HEIGHT, WIDTH, HEIGHT); bomb = new BufferedImage[6]; for (int i = 0; i < bomb.length; i++) - bomb[i] = sheet.crop(width * i, height * 3, width, height); + bomb[i] = sheet.crop(WIDTH * i, HEIGHT * 3, WIDTH, HEIGHT); hud = new BufferedImage[2]; - hud[0] = sheet.crop(2, 7, heightHud, heightHud); - hud[1] = sheet.crop(width + 2, height + 7, heightHud, heightHud); + hud[0] = sheet.crop(2, 7, HUDHEIGHT, HUDHEIGHT); + hud[1] = sheet.crop(WIDTH + 2, HEIGHT + 7, HUDHEIGHT, HUDHEIGHT); explosion = new BufferedImage[3]; - explosion[0] = sheet.crop(width * 5, height * 3, width, height); - explosion[1] = sheet.crop(width * 6, height * 3, width, height); - explosion[2] = sheet.crop(width * 7, height * 3, width, height); + explosion[0] = sheet.crop(WIDTH * 5, HEIGHT * 3, WIDTH, HEIGHT); + explosion[1] = sheet.crop(WIDTH * 6, HEIGHT * 3, WIDTH, HEIGHT); + explosion[2] = sheet.crop(WIDTH * 7, HEIGHT * 3, WIDTH, HEIGHT); - simpleWall = sheet.crop(width * 8, height * 3, width, height); - wall = sheet.crop(width * 9, height * 3, width, height); - deathWall = sheet.crop(width * 10, height * 3, width, height); + simpleWall = sheet.crop(WIDTH * 8, HEIGHT * 3, WIDTH, HEIGHT); + wall = sheet.crop(WIDTH * 9, HEIGHT * 3, WIDTH, HEIGHT); + deathWall = sheet.crop(WIDTH * 10, HEIGHT * 3, WIDTH, HEIGHT); upgrade = new BufferedImage[4]; for (int i = 0; i < 4; i++) { - upgrade[i] = sheet.crop(width * (11 + i), height * 3, width - 2, height); + upgrade[i] = sheet.crop(WIDTH * (11 + i), HEIGHT * 3, WIDTH - 2, HEIGHT); } } } diff --git a/BomberMan/src/main/java/it/bomberman/input/KeyManager.java b/BomberMan/src/main/java/it/bomberman/input/KeyManager.java index 935ef6f..9b805cf 100644 --- a/BomberMan/src/main/java/it/bomberman/input/KeyManager.java +++ b/BomberMan/src/main/java/it/bomberman/input/KeyManager.java @@ -26,13 +26,11 @@ public void tick() { drop2 = keys[KeyEvent.VK_ENTER]; } - // PRESSSIONE TASTO @Override public void keyPressed(KeyEvent e) { keys[e.getKeyCode()] = true; } - // RILASCIO TASTO @Override public void keyReleased(KeyEvent e) { keys[e.getKeyCode()] = false; @@ -42,4 +40,3 @@ public void keyReleased(KeyEvent e) { public void keyTyped(KeyEvent e) { } } - diff --git a/BomberMan/src/main/java/it/bomberman/menu/MenuView.java b/BomberMan/src/main/java/it/bomberman/menu/MenuView.java index e0d5d3c..f068838 100644 --- a/BomberMan/src/main/java/it/bomberman/menu/MenuView.java +++ b/BomberMan/src/main/java/it/bomberman/menu/MenuView.java @@ -1,22 +1,23 @@ package it.bomberman.menu; -import java.awt.Graphics; -import javax.swing.JFrame; import java.awt.Dimension; +import java.awt.Graphics; +import javax.swing.JFrame; +import javax.swing.WindowConstants; import it.bomberman.states.GameStateManager; public class MenuView extends JFrame { private static final long serialVersionUID = 1L; - private GameStateManager gsm; + private transient GameStateManager gameStateManager; public MenuView() { - gsm = new GameStateManager(this); + gameStateManager = new GameStateManager(this); this.setName("BomberMan Menu"); - this.gsm.setState(GameStateManager.MENUSTATE); - this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.gameStateManager.setState(GameStateManager.MENUSTATE); + this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); this.setResizable(false); this.setPreferredSize(new Dimension(1200, 800)); this.pack(); @@ -31,10 +32,10 @@ public void paint(Graphics g) { } public void draw() { - + // default behavior } public void update() { - this.gsm.update(); + this.gameStateManager.update(); } } From ff66855feb473e99a75150879e0ef55d4b255e1a Mon Sep 17 00:00:00 2001 From: Dallas <71103219+LeleDallas@users.noreply.github.com> Date: Mon, 8 Apr 2024 21:23:30 +0200 Subject: [PATCH 5/8] refactor(Model): improve code --- .../it/bomberman/states/ArenaModelImpl.java | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/BomberMan/src/main/java/it/bomberman/states/ArenaModelImpl.java b/BomberMan/src/main/java/it/bomberman/states/ArenaModelImpl.java index d60d583..a3e0af7 100644 --- a/BomberMan/src/main/java/it/bomberman/states/ArenaModelImpl.java +++ b/BomberMan/src/main/java/it/bomberman/states/ArenaModelImpl.java @@ -98,14 +98,13 @@ public List getDrawables() { } private void initMapLimitWalls() { - Random random; + Random random = new Random(); List walls = new ArrayList<>(); int xLimit = 13; int yLimit = 8; int unit = WallFactoryImpl.DEFAULT_WALL_WIDTH; - random = new Random(); - // muri limite mappa + // Add walls on the map boundaries IntStream.range(0, xLimit).forEach(i -> { walls.add(wallFactory.hardWall(unit * i - 50, 50, this)); walls.add(wallFactory.hardWall(unit * i - 50, 50 + unit * (yLimit - 1), this)); @@ -115,8 +114,9 @@ private void initMapLimitWalls() { walls.add(wallFactory.hardWall((xLimit - 1) * unit - 50, 50 + i * unit, this)); }); - for (int i = 1; i < xLimit - 1; i++) { - for (int j = 1; j < yLimit - 1; j++) { + // Add walls and power-ups inside the map + IntStream.range(1, xLimit - 1).forEach(i -> { + IntStream.range(1, yLimit - 1).forEach(j -> { if (j % 2 == 0 && i % 2 == 0) { Wall w = wallFactory.hardWall(unit * i - 50, unit * j + 50, this); walls.add(w); @@ -126,28 +126,31 @@ private void initMapLimitWalls() { Wall w = wallFactory.simpleWall(unit * i - 50, unit * j + 50, this); walls.add(w); } else if (r <= POWER_UP_SPAWN_PROBABILITY + WALL_SPAWN_PROBABILITY) { - { - PowerUp p = PowerUp.PowerUpBuilder.newBuilder().setController(this).setX(unit * i - 25) - .setY(unit * j + 75) - .setType(PowerUpType.values()[random.nextInt(PowerUpType.values().length)]) - .setValue(1) - .build(); - register(p); - } + PowerUp p = PowerUp.PowerUpBuilder.newBuilder() + .setController(this) + .setX(unit * i - 25) + .setY(unit * j + 75) + .setType(PowerUpType.values()[random.nextInt(PowerUpType.values().length)]) + .setValue(1) + .build(); + register(p); } } - } - } + }); + }); + walls.forEach(this::register); } private boolean correctBuild(int i, int j) { int xLimit = 13; int yLimit = 8; - // gli slot vicino a ciascun Player devono essere lasciati liberi da Wall - return !((i == 1 && (j == 1 || j == 2)) || (j == 1 && (i == 1 || i == 2))) - && !((i == xLimit - 2 && (j == yLimit - 2 || j == yLimit - 3)) - || (j == yLimit - 2 && (i == xLimit - 2 || i == xLimit - 3))); + // Check if the slot is near any player + boolean nearPlayer1 = (i == 1 && (j == 1 || j == 2)) || (j == 1 && (i == 1 || i == 2)); + boolean nearPlayer2 = (i == xLimit - 2 && (j == yLimit - 2 || j == yLimit - 3)) + || (j == yLimit - 2 && (i == xLimit - 2 || i == xLimit - 3)); + // Return true if the slot is not near any player + return !(nearPlayer1 || nearPlayer2); } @Override From 9c7f63568cec0cbe5e8f761b12c16bd352df1c6e Mon Sep 17 00:00:00 2001 From: Dallas <71103219+LeleDallas@users.noreply.github.com> Date: Mon, 8 Apr 2024 21:28:28 +0200 Subject: [PATCH 6/8] ci: release please action --- .github/workflows/release-please.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/release-please.yml diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 0000000..677e33e --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,18 @@ +on: + push: + branches: + - main + + permissions: + contents: write + pull-requests: write + + name: release-please + + jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: google-github-actions/release-please-action@v4 + with: + release-type: java \ No newline at end of file From 409967a9e68194b39f9310da8717fe59435e1e11 Mon Sep 17 00:00:00 2001 From: Dallas <71103219+LeleDallas@users.noreply.github.com> Date: Mon, 8 Apr 2024 21:29:47 +0200 Subject: [PATCH 7/8] ci: removed sonarcloud action --- .github/workflows/sonarcloud.yml | 37 -------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 .github/workflows/sonarcloud.yml diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml deleted file mode 100644 index 0f37f03..0000000 --- a/.github/workflows/sonarcloud.yml +++ /dev/null @@ -1,37 +0,0 @@ -# name: SonarCloud -# on: -# push: -# branches: -# - master -# pull_request: -# types: [opened, synchronize, reopened] -# jobs: -# build: -# name: Build and analyze -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v3 -# with: -# fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis -# - name: Set up JDK 11 -# uses: actions/setup-java@v3 -# with: -# java-version: 11 -# distribution: 'zulu' # Alternative distribution options are available -# - name: Cache SonarCloud packages -# uses: actions/cache@v3 -# with: -# path: ~/.sonar/cache -# key: ${{ runner.os }}-sonar -# restore-keys: ${{ runner.os }}-sonar -# - name: Cache Gradle packages -# uses: actions/cache@v3 -# with: -# path: ~/.gradle/caches -# key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} -# restore-keys: ${{ runner.os }}-gradle -# - name: Build and analyze -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any -# SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} -# run: ./gradlew build sonarqube --info From 7b877489eb1b222ffff15e94b75e5420288440f0 Mon Sep 17 00:00:00 2001 From: Dallas <71103219+LeleDallas@users.noreply.github.com> Date: Mon, 8 Apr 2024 21:40:32 +0200 Subject: [PATCH 8/8] ci: fix spaces --- .github/workflows/release-please.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 677e33e..21defc4 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -1,15 +1,15 @@ on: push: - branches: + branches: - main - - permissions: + +permissions: contents: write pull-requests: write - - name: release-please - - jobs: + +name: release-please + +jobs: release-please: runs-on: ubuntu-latest steps: