From 58509e0d5b31457396ed5b3e48358605c4705f80 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sat, 4 Apr 2020 04:33:11 +0200 Subject: [PATCH 01/13] Translated project in Scala (but the path finder seems to be broken) --- compile.sh | 24 -- .../ynerant/leveleditor/api/editor/Case.java | 52 --- .../leveleditor/api/editor/Collision.java | 5 - .../leveleditor/api/editor/EditorAPI.java | 162 --------- .../leveleditor/api/editor/RawCase.java | 60 ---- .../leveleditor/api/editor/RawMap.java | 77 ----- .../leveleditor/api/editor/RawSprite.java | 24 -- .../leveleditor/api/editor/package-info.java | 4 - .../api/editor/sprites/Category.java | 33 -- .../api/editor/sprites/Sprite.java | 61 ---- .../api/editor/sprites/SpriteRegister.java | 125 ------- .../ynerant/leveleditor/client/main/Main.java | 226 ------------ .../leveleditor/client/main/package-info.java | 6 - .../leveleditor/editor/CollidPanel.java | 83 ----- .../leveleditor/editor/EditorFrame.java | 322 ------------------ .../fr/ynerant/leveleditor/editor/Map.java | 82 ----- .../ynerant/leveleditor/editor/MapPanel.java | 77 ----- .../leveleditor/editor/SpriteComp.java | 59 ---- .../leveleditor/editor/WrapLayout.java | 88 ----- .../ynerant/leveleditor/frame/MainFrame.java | 102 ------ .../frame/listeners/ChangeLAFListener.java | 49 --- .../listeners/CollidMapMouseListener.java | 45 --- .../frame/listeners/CreateMapListener.java | 21 -- .../frame/listeners/MapMouseListener.java | 95 ------ .../frame/listeners/OpenMapListener.java | 18 - .../frame/listeners/SpriteMouseListener.java | 28 -- .../ynerant/leveleditor/game/GameFrame.java | 237 ------------- .../fr/ynerant/leveleditor/game/mobs/Mob.java | 133 -------- .../ynerant/leveleditor/game/mobs/Mob1.java | 23 -- .../ynerant/leveleditor/game/mobs/Mob2.java | 23 -- .../leveleditor/game/mobs/MobCancer.java | 23 -- .../leveleditor/game/towers/AutoTower.java | 36 -- .../leveleditor/game/towers/BasicTower.java | 46 --- .../leveleditor/game/towers/NullTower.java | 37 -- .../leveleditor/game/towers/Tower.java | 57 ---- .../ynerant/leveleditor/api/editor/Case.scala | 41 +++ .../leveleditor/api/editor/Collision.scala | 6 + .../leveleditor/api/editor/EditorAPI.scala | 160 +++++++++ .../leveleditor/api/editor/RawCase.scala | 31 ++ .../leveleditor/api/editor/RawMap.scala | 60 ++++ .../leveleditor/api/editor/RawSprite.scala | 20 ++ .../api/editor/sprites/Category.scala | 23 ++ .../api/editor/sprites/Sprite.scala | 38 +++ .../api/editor/sprites/SpriteRegister.scala | 108 ++++++ .../leveleditor/client/main/Main.scala | 185 ++++++++++ .../leveleditor/editor/CollidPanel.scala | 64 ++++ .../leveleditor/editor/EditorFrame.scala | 248 ++++++++++++++ .../fr/ynerant/leveleditor/editor/Map.scala | 60 ++++ .../ynerant/leveleditor/editor/MapPanel.scala | 49 +++ .../leveleditor/editor/SpriteComp.scala | 40 +++ .../leveleditor/editor/WrapLayout.scala | 58 ++++ .../ynerant/leveleditor/frame/MainFrame.scala | 89 +++++ .../frame/listeners/ChangeLAFListener.scala | 41 +++ .../listeners/CollidMapMouseListener.scala | 28 ++ .../frame/listeners/CreateMapListener.scala | 19 ++ .../frame/listeners/MapMouseListener.scala | 69 ++++ .../frame/listeners/OpenMapListener.scala | 16 + .../frame/listeners/SpriteMouseListener.scala | 19 ++ .../ynerant/leveleditor/game/GameFrame.scala | 193 +++++++++++ .../ynerant/leveleditor/game/mobs/Mob.scala | 108 ++++++ .../ynerant/leveleditor/game/mobs/Mob1.scala | 11 + .../ynerant/leveleditor/game/mobs/Mob2.scala | 11 + .../leveleditor/game/mobs/MobCancer.scala | 11 + .../leveleditor/game/towers/AutoTower.scala | 17 + .../leveleditor/game/towers/BasicTower.scala | 23 ++ .../leveleditor/game/towers/NullTower.scala | 17 + .../leveleditor/game/towers/Tower.scala | 42 +++ 67 files changed, 1905 insertions(+), 2543 deletions(-) delete mode 100755 compile.sh delete mode 100644 src/main/java/fr/ynerant/leveleditor/api/editor/Case.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/api/editor/Collision.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/api/editor/EditorAPI.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/api/editor/RawCase.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/api/editor/RawMap.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/api/editor/RawSprite.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/api/editor/package-info.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/api/editor/sprites/Category.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/api/editor/sprites/Sprite.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/client/main/Main.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/client/main/package-info.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/editor/CollidPanel.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/editor/EditorFrame.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/editor/Map.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/editor/MapPanel.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/editor/SpriteComp.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/editor/WrapLayout.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/frame/MainFrame.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/frame/listeners/ChangeLAFListener.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/frame/listeners/CreateMapListener.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/frame/listeners/OpenMapListener.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/frame/listeners/SpriteMouseListener.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/game/GameFrame.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/game/mobs/Mob.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/game/mobs/Mob1.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/game/mobs/Mob2.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/game/mobs/MobCancer.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/game/towers/AutoTower.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/game/towers/BasicTower.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/game/towers/NullTower.java delete mode 100644 src/main/java/fr/ynerant/leveleditor/game/towers/Tower.java create mode 100644 src/main/scala/fr/ynerant/leveleditor/api/editor/Case.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/api/editor/Collision.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/api/editor/EditorAPI.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/api/editor/RawCase.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/api/editor/RawMap.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/api/editor/RawSprite.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Category.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Sprite.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/client/main/Main.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/editor/CollidPanel.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/editor/Map.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/editor/MapPanel.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/editor/SpriteComp.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/editor/WrapLayout.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/frame/MainFrame.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/frame/listeners/ChangeLAFListener.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/frame/listeners/CreateMapListener.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/frame/listeners/OpenMapListener.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/frame/listeners/SpriteMouseListener.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob1.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob2.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/mobs/MobCancer.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/towers/AutoTower.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/towers/NullTower.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala diff --git a/compile.sh b/compile.sh deleted file mode 100755 index a9c58ab..0000000 --- a/compile.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -chmod +x lib/*.jar -rm -rf tmp -mkdir tmp -javac -cp src/main/java:lib/gson-2.8.6.jar:lib/jopt-simple-6.0-alpha-3.jar \ - -target 1.9 -source 1.9 \ - -d tmp --module-path src/main/java \ - src/main/java/fr/ynerant/leveleditor/api/editor/*.java \ - src/main/java/fr/ynerant/leveleditor/client/main/*.java \ - src/main/java/fr/ynerant/leveleditor/editor/*.java \ - src/main/java/fr/ynerant/leveleditor/frame/*.java \ - src/main/java/fr/ynerant/leveleditor/game/*.java \ - src/main/java/fr/ynerant/leveleditor/game/mobs/*.java \ - src/main/java/fr/ynerant/leveleditor/game/towers/*.java -cp -r src/main/resources/* tmp/ -unzip lib/gson-2.8.6.jar -x META-INF/MANIFEST.MF -d tmp -unzip lib/jopt-simple-6.0-alpha-3.jar -x META-INF/MANIFEST.MF -d tmp -cd tmp -zip -r TheGame.jar * -mv TheGame.jar ../ -cd .. -rm -rf tmp -chmod +x TheGame.jar -echo "Successfully compiled to \"TheGame.jar\". To run: \"java -jar TheGame.jar\"". diff --git a/src/main/java/fr/ynerant/leveleditor/api/editor/Case.java b/src/main/java/fr/ynerant/leveleditor/api/editor/Case.java deleted file mode 100644 index 7c939f8..0000000 --- a/src/main/java/fr/ynerant/leveleditor/api/editor/Case.java +++ /dev/null @@ -1,52 +0,0 @@ -package fr.ynerant.leveleditor.api.editor; - -import fr.ynerant.leveleditor.api.editor.sprites.Sprite; - -public class Case { - private int x; - private int y; - private Sprite couche1; - private Sprite couche2; - private Sprite couche3; - private Collision collision; - - public static Case create(int posX, int posY, Sprite couche1, Sprite couche2, Sprite couche3, Collision collision) { - Case c = new Case(); - c.x = posX; - c.y = posY; - c.couche1 = couche1; - c.couche2 = couche2; - c.couche3 = couche3; - c.collision = collision; - return c; - } - - public int getPosX() { - return x; - } - - public int getPosY() { - return y; - } - - public Sprite getCoucheOne() { - return couche1; - } - - public Sprite getCoucheTwo() { - return couche2; - } - - public Sprite getCoucheThree() { - return couche3; - } - - public Collision getCollision() { - return collision; - } - - @Override - public String toString() { - return "{Case x=" + x + " y=" + y + " couche1=" + couche1 + " couche2=" + couche2 + " couche3=" + couche3 + " collision=" + collision.name().toUpperCase() + "}\n"; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/api/editor/Collision.java b/src/main/java/fr/ynerant/leveleditor/api/editor/Collision.java deleted file mode 100644 index 6b3f229..0000000 --- a/src/main/java/fr/ynerant/leveleditor/api/editor/Collision.java +++ /dev/null @@ -1,5 +0,0 @@ -package fr.ynerant.leveleditor.api.editor; - -public enum Collision { - FULL, PARTIAL, ANY -} diff --git a/src/main/java/fr/ynerant/leveleditor/api/editor/EditorAPI.java b/src/main/java/fr/ynerant/leveleditor/api/editor/EditorAPI.java deleted file mode 100644 index b91f1ee..0000000 --- a/src/main/java/fr/ynerant/leveleditor/api/editor/EditorAPI.java +++ /dev/null @@ -1,162 +0,0 @@ -package fr.ynerant.leveleditor.api.editor; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import fr.ynerant.leveleditor.editor.Map; - -import javax.swing.*; -import javax.swing.filechooser.FileNameExtensionFilter; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; - -public class EditorAPI { - private static File LAST_FILE; - - public static RawMap toRawMap(int width, int height) { - List cases = new ArrayList<>(); - - for (int y = 1; y < height; y += 16) { - for (int x = 1; x < width; x += 16) { - RawCase c = RawCase.create(x / 16, y / 16, RawSprite.BLANK, RawSprite.BLANK, RawSprite.BLANK, Collision.ANY); - cases.add(c); - } - } - - return RawMap.create(cases, width, height); - } - - public static Gson createGson() { - GsonBuilder builder = new GsonBuilder(); - - builder.enableComplexMapKeySerialization(); - builder.serializeNulls(); - builder.setPrettyPrinting(); - - return builder.create(); - } - - public static JFileChooser createJFC() { - JFileChooser jfc = new JFileChooser(); - - jfc.setFileFilter(new FileNameExtensionFilter("Fichiers monde (*.gmap, *.dat)", "gmap", "dat")); - jfc.setFileHidingEnabled(true); - jfc.setFileSelectionMode(JFileChooser.FILES_ONLY); - File dir = new File("maps"); - assert dir.mkdirs(); - jfc.setCurrentDirectory(dir); - - return jfc; - } - - public static void saveAs(RawMap map) { - JFileChooser jfc = createJFC(); - File file; - jfc.showSaveDialog(null); - file = jfc.getSelectedFile(); - - if (file == null) - return; - - if (!file.getName().toLowerCase().endsWith(".gmap") && !file.getName().toLowerCase().endsWith(".dat")) { - file = new File(file.getParentFile(), file.getName() + ".gmap"); - } - - LAST_FILE = file; - - save(file, map); - } - - public static void save(RawMap map) { - if (LAST_FILE != null) - save(LAST_FILE, map); - else - saveAs(map); - } - - public static void save(File file, RawMap map) { - String json = createGson().toJson(map); - - try { - assert file.createNewFile(); - BufferedOutputStream bos = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(file))); - - bos.write(json.getBytes(StandardCharsets.UTF_8)); - - bos.close(); - } catch (IOException ex) { - ex.printStackTrace(); - } - } - - public static Map open() { - JFileChooser jfc = createJFC(); - File file; - - jfc.showOpenDialog(null); - file = jfc.getSelectedFile(); - - if (file == null) - return null; - - LAST_FILE = file; - - return open(file); - } - - public static RawMap getRawMap(File f) { - String json = null; - try { - GZIPInputStream gis = new GZIPInputStream(new BufferedInputStream(new FileInputStream(f))); - byte[] bytes = new byte[512 * 1024]; - int count; - StringBuilder text = new StringBuilder(); - while ((count = gis.read(bytes)) != -1) { - text.append(new String(bytes, 0, count, StandardCharsets.UTF_8)); - } - gis.close(); - - json = text.toString(); - } catch (IOException e) { - e.printStackTrace(); - } - - return createGson().fromJson(json, RawMap.class); - } - - public static Map open(File f) { - return open(getRawMap(f)); - } - - public static Map open(RawMap map) { - if (map.getFont() == null) { - int baseWidth = map.getWidth(); - int baseHeight = map.getHeight(); - int width = baseWidth + (baseWidth / 16) + 1; - int height = baseHeight + (baseHeight / 16) + 1; - BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - Graphics2D g = image.createGraphics(); - g.setColor(Color.white); - g.fillRect(0, 0, width, height); - g.setColor(Color.black); - g.drawLine(0, 0, width, 0); - g.drawLine(0, 0, 0, height); - for (int x = 17; x <= width; x += 17) { - g.drawLine(x, 0, x, height); - } - - for (int y = 17; y <= height; y += 17) { - g.drawLine(0, y, width, y); - } - - map.setFont(image); - } - - return new Map(map); - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/api/editor/RawCase.java b/src/main/java/fr/ynerant/leveleditor/api/editor/RawCase.java deleted file mode 100644 index 3169474..0000000 --- a/src/main/java/fr/ynerant/leveleditor/api/editor/RawCase.java +++ /dev/null @@ -1,60 +0,0 @@ -package fr.ynerant.leveleditor.api.editor; - -public class RawCase { - private int x; - private int y; - private RawSprite couche1; - private RawSprite couche2; - private RawSprite couche3; - private Collision collision; - - public static RawCase create(int posX, int posY, RawSprite couche1, RawSprite couche2, RawSprite couche3, Collision collision) { - RawCase c = new RawCase(); - c.x = posX; - c.y = posY; - c.couche1 = couche1; - c.couche2 = couche2; - c.couche3 = couche3; - c.collision = collision; - return c; - } - - public static RawCase create(Case c) { - RawCase raw = new RawCase(); - raw.x = c.getPosX(); - raw.y = c.getPosY(); - raw.couche1 = RawSprite.create(c.getCoucheOne()); - raw.couche2 = RawSprite.create(c.getCoucheTwo()); - raw.couche3 = RawSprite.create(c.getCoucheThree()); - raw.collision = c.getCollision(); - return raw; - } - - public int getPosX() { - return x; - } - - public int getPosY() { - return y; - } - - public RawSprite getCoucheOne() { - return couche1; - } - - public RawSprite getCoucheTwo() { - return couche2; - } - - public RawSprite getCoucheThree() { - return couche3; - } - - public Collision getCollision() { - return collision; - } - - public void setCollision(Collision collision) { - this.collision = collision; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/api/editor/RawMap.java b/src/main/java/fr/ynerant/leveleditor/api/editor/RawMap.java deleted file mode 100644 index 10af484..0000000 --- a/src/main/java/fr/ynerant/leveleditor/api/editor/RawMap.java +++ /dev/null @@ -1,77 +0,0 @@ -package fr.ynerant.leveleditor.api.editor; - -import fr.ynerant.leveleditor.editor.Map; - -import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.stream.Collectors; - -public class RawMap { - private List cases; - private java.util.Map cases_map; - private int width; - private int height; - private transient BufferedImage font; - - public static RawMap create(List cases, int width, int height) { - RawMap rm = new RawMap(); - rm.cases = cases; - rm.width = width; - rm.height = height; - return rm; - } - - public static RawMap create(Map map) { - RawMap raw = new RawMap(); - raw.width = map.getWidth(); - raw.height = map.getHeight(); - raw.cases = new ArrayList<>(); - for (Case c : map.getAllCases()) { - RawCase rc = RawCase.create(c); - raw.cases.add(rc); - } - return raw; - } - - public List getCases() { - return cases; - } - - public RawCase getCase(int x, int y) { - if (cases_map == null) { - cases_map = new HashMap<>(); - for (RawCase c : getCases()) - cases_map.put(c.getPosY() * width + c.getPosX(), c); - } - - return cases_map.get(y * getWidth() + x); - } - - public Collection getNeighbours(RawCase c) { - List list = new ArrayList<>(); - list.add(getCase(c.getPosX() - 1, c.getPosY())); - list.add(getCase(c.getPosX(), c.getPosY() - 1)); - list.add(getCase(c.getPosX() + 1, c.getPosY())); - list.add(getCase(c.getPosX(), c.getPosY() + 1)); - return list.stream().filter(_c -> _c != null && _c.getCollision() == Collision.ANY).collect(Collectors.toList()); - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - - public BufferedImage getFont() { - return font; - } - - public void setFont(BufferedImage font) { - this.font = font; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/api/editor/RawSprite.java b/src/main/java/fr/ynerant/leveleditor/api/editor/RawSprite.java deleted file mode 100644 index de4ff34..0000000 --- a/src/main/java/fr/ynerant/leveleditor/api/editor/RawSprite.java +++ /dev/null @@ -1,24 +0,0 @@ -package fr.ynerant.leveleditor.api.editor; - -import fr.ynerant.leveleditor.api.editor.sprites.Sprite; - -public class RawSprite { - public static transient final RawSprite BLANK = new RawSprite(); - private String category = "blank"; - private int index = 0; - - public static RawSprite create(Sprite spr) { - RawSprite raw = new RawSprite(); - raw.category = spr.getCategory().getName(); - raw.index = spr.getIndex(); - return raw; - } - - public String getCategory() { - return category; - } - - public int getIndex() { - return index; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/api/editor/package-info.java b/src/main/java/fr/ynerant/leveleditor/api/editor/package-info.java deleted file mode 100644 index e736761..0000000 --- a/src/main/java/fr/ynerant/leveleditor/api/editor/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * @author ÿnérant - */ -package fr.ynerant.leveleditor.api.editor; \ No newline at end of file diff --git a/src/main/java/fr/ynerant/leveleditor/api/editor/sprites/Category.java b/src/main/java/fr/ynerant/leveleditor/api/editor/sprites/Category.java deleted file mode 100644 index 6fd66e6..0000000 --- a/src/main/java/fr/ynerant/leveleditor/api/editor/sprites/Category.java +++ /dev/null @@ -1,33 +0,0 @@ -package fr.ynerant.leveleditor.api.editor.sprites; - -import java.util.List; - -public class Category { - private List sprites; - private String name; - - private Category() { - } - - public static Category create(String name, List sprites) { - Category c = new Category(); - - c.name = name; - c.sprites = sprites; - - return c; - } - - public String getName() { - return name; - } - - public List getSprites() { - return sprites; - } - - @Override - public String toString() { - return name; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/api/editor/sprites/Sprite.java b/src/main/java/fr/ynerant/leveleditor/api/editor/sprites/Sprite.java deleted file mode 100644 index f019baa..0000000 --- a/src/main/java/fr/ynerant/leveleditor/api/editor/sprites/Sprite.java +++ /dev/null @@ -1,61 +0,0 @@ -package fr.ynerant.leveleditor.api.editor.sprites; - -import java.awt.*; -import java.awt.image.BufferedImage; -import java.util.ArrayList; - -public class Sprite { - public static final Sprite BLANK = new Sprite(new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB), Category.create("blank", new ArrayList<>()), 0); - - static { - Graphics2D g = BLANK.getImage().createGraphics(); - g.setComposite(AlphaComposite.Clear); - g.setColor(new Color(0, true)); - g.fillRect(0, 0, 16, 16); - } - - private final Category cat; - private final BufferedImage img; - private final int index; - - public Sprite(BufferedImage img, Category cat, int index) { - this.img = img; - this.cat = cat; - this.index = index; - - if (!this.cat.getSprites().contains(this)) - this.cat.getSprites().add(this); - } - - public BufferedImage getImage() { - return this.img; - } - - public Category getCategory() { - return cat; - } - - public int getIndex() { - return index; - } - - @Override - public int hashCode() { - return cat.hashCode() ^ getIndex(); - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof Sprite)) - return false; - - Sprite other = (Sprite) o; - - return hashCode() == other.hashCode(); - } - - @Override - public String toString() { - return "{Sprite img=" + img + " cat=" + cat.getName() + "}"; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.java b/src/main/java/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.java deleted file mode 100644 index 3dd7d1a..0000000 --- a/src/main/java/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.java +++ /dev/null @@ -1,125 +0,0 @@ -package fr.ynerant.leveleditor.api.editor.sprites; - -import com.google.gson.Gson; -import fr.ynerant.leveleditor.client.main.Main; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.*; -import java.net.URISyntaxException; -import java.net.URLDecoder; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.*; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; - -public class SpriteRegister { - private static Map>> nameToCoords; - private static final Map sprites = new HashMap<>(); - - public static void unpack() throws IOException { - if (Main.isInDevelopmentMode()) { - try { - File dir = new File(SpriteRegister.class.getResource("/assets").toURI()).getParentFile(); - unpackDir(dir); - } catch (URISyntaxException e) { - e.printStackTrace(); - } - } - else { - @SuppressWarnings("deprecation") - String path = URLDecoder.decode(SpriteRegister.class.getProtectionDomain().getCodeSource().getLocation().getPath()); - File jarFile = new File(path); - - if (jarFile.isFile()) { - JarFile jar = new JarFile(jarFile); - Enumeration entries = jar.entries(); - while (entries.hasMoreElements()) { - JarEntry je = entries.nextElement(); - String name = je.getName(); - if (name.startsWith("assets/")) { - File f = new File(name); - if (name.endsWith("/")) { - if (!f.mkdirs() && !f.isDirectory()) - throw new IOException("Unable to make dir: " + f); - } - else if (!f.isFile()) - Files.copy(jar.getInputStream(je), Paths.get(f.toURI())); - } - } - jar.close(); - } - } - } - - private static void unpackDir(File dir) throws IOException { - for (File f : Objects.requireNonNull(dir.listFiles())) { - if (f.isDirectory()) { - unpackDir(f); - continue; - } - - String path = f.getAbsolutePath().substring(f.getAbsolutePath().indexOf(File.separatorChar + "assets") + 1); - File local = new File(path); - assert local.getParentFile().mkdirs(); - assert !local.exists() || local.delete(); - Files.copy(Paths.get(f.toURI()), Paths.get(local.toURI())); - } - } - - @SuppressWarnings("unchecked") - public static void refreshAllSprites() { - if (nameToCoords != null && !nameToCoords.isEmpty() && !sprites.isEmpty()) { - return; - } - - File assetsDir = new File("assets"); - List assets = new ArrayList<>(); - - for (File dir : Objects.requireNonNull(assetsDir.listFiles())) { - assets.add(dir.getName()); - } - - for (String asset : assets) { - try { - File f = new File(assetsDir.getAbsolutePath() + "/" + asset + "/textures/sprites"); - assert f.mkdirs(); - BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(f, "sprites.json")))); - nameToCoords = new Gson().fromJson(br, Map.class); - br.close(); - - for (String key : nameToCoords.keySet()) { - try { - BufferedInputStream is = new BufferedInputStream(new FileInputStream(new File(f, key + ".png"))); - BufferedImage img = ImageIO.read(is); - Category cat = Category.create(key, new ArrayList<>()); - - for (List list : nameToCoords.get(key)) { - int x = list.get(0).intValue(); - int y = list.get(1).intValue(); - BufferedImage child = img.getSubimage(x, y, 16, 16); - new Sprite(child, cat, nameToCoords.get(key).indexOf(list)); - } - - sprites.put(key, cat); - } catch (Throwable t) { - System.err.println("Erreur lors de la lecture du sprite '" + key + "'"); - t.printStackTrace(); - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public static Category getCategory(String name) { - return sprites.get(name); - } - - public static List getAllCategories() { - return new ArrayList<>(sprites.values()); - } - -} diff --git a/src/main/java/fr/ynerant/leveleditor/client/main/Main.java b/src/main/java/fr/ynerant/leveleditor/client/main/Main.java deleted file mode 100644 index 9fd8f84..0000000 --- a/src/main/java/fr/ynerant/leveleditor/client/main/Main.java +++ /dev/null @@ -1,226 +0,0 @@ -package fr.ynerant.leveleditor.client.main; - -import fr.ynerant.leveleditor.api.editor.EditorAPI; -import fr.ynerant.leveleditor.api.editor.RawMap; -import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister; -import fr.ynerant.leveleditor.frame.MainFrame; -import fr.ynerant.leveleditor.game.GameFrame; -import joptsimple.OptionParser; -import joptsimple.OptionSet; -import joptsimple.OptionSpec; - -import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.Locale; -import java.util.Map; - -/** - * Class principale qui lance le jeu - * - * @author ÿnérant - * @see #main(String...) - */ -public class Main { - /** - * Variable disant si le jeu est lancé en développement ou non. - * - * @see #isInDevelopmentMode() - * @see #main(String...) - * @since 0.1-aplha - */ - private static boolean DEV; - - /** - * @param args arguments du jeu. Possibilités :
    --edit lancera un éditeur
    --help lance l'aide affichant toutes les options possibles - * @see #launchEditMode() - * @since 0.1-alpha - */ - public static void main(String... args) { - System.setProperty("sun.java2d.noddraw", "true"); - - Locale.setDefault(Locale.FRANCE); - - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Exception e) { - new ExceptionInInitializerError("Erreur lors du changement de 'look and feel'").printStackTrace(); - System.err.print("Caused by "); - e.printStackTrace(); - } - - try { - new File(Main.class.getResource("/assets").toURI()); - DEV = true; - } catch (Throwable t) { - DEV = false; - } - - checkJava(); - - OptionParser parser = new OptionParser(); - - OptionSpec edit = parser.accepts("edit", "Lancer l'\u00e9diteur de monde").withOptionalArg(); - OptionSpec help = parser.accepts("help", "Affiche ce menu d'aide").withOptionalArg().forHelp(); - - OptionSet set = parser.parse(args); - - if (set.has(help)) { - try { - parser.printHelpOn(System.out); - } catch (IOException e) { - e.printStackTrace(); - } finally { - System.exit(0); - } - } - - try { - SpriteRegister.unpack(); - } catch (IOException e) { - e.printStackTrace(); - } - - SpriteRegister.refreshAllSprites(); - - if (set.has(edit)) { - launchEditMode(); - return; - } - - launchFrame(); - } - - private static void checkJava() { - if (GraphicsEnvironment.isHeadless()) { - HeadlessException ex = new HeadlessException("Impossible de lancer un jeu sans \u00e9cran !"); - System.err.println("Cette application est un jeu, sans écran, elle aura du mal \u00e0 tourner ..."); - ex.printStackTrace(); - System.exit(1); - } - - try { - Map.class.getDeclaredMethod("getOrDefault", Object.class, Object.class); - } catch (NoSuchMethodException ex) { - ex.printStackTrace(); - JOptionPane.showMessageDialog(null, "Cette application requiert Java 8.
La page de t\u00e9l\u00e9chargement va maintenant s'ouvrir."); - JOptionPane.showMessageDialog(null, "Si vous êtes certain que Java 8 est installé sur votre machine, assurez-vous qu'il n'y a pas de versions obsolètes de Java,
ou si vous êtes plus expérimentés si le path vers Java est bien défini vers la bonne version."); - try { - if (Desktop.isDesktopSupported()) - Desktop.getDesktop().browse(new URL("http://java.com/download").toURI()); - else - JOptionPane.showMessageDialog(null, "Votre machine ne supporte pas la classe Desktop, impossible d'ouvrir la page.
Rendez-vous y manuellement sur http://java.com/download pour installer Java."); - } catch (IOException | URISyntaxException e) { - e.printStackTrace(); - } - System.exit(1); - } - } - - /** - * Lance la fenêtre principale - * - * @see #main(String...) - * @see #launchEditMode() - */ - private static void launchFrame() { - MainFrame.getInstance().setVisible(true); - } - - /** - * Permet de lancer l'éditeur de carte - * - * @see #main(String...) - * @see #launchFrame() - * @since 0.1-aplha - */ - public static boolean launchEditMode() { - System.out.println("Lancement de l'\u00e9diteur de monde ..."); - int baseWidth; - int baseHeight; - int width; - int height; - while (true) { - try { - String baseWidthStr = JOptionPane.showInputDialog(null, "Veuillez entrez le nombre de cases longueur de votre carte (0 pour annuler) :"); - if (baseWidthStr == null) - return false; - baseWidth = Integer.parseInt(baseWidthStr) * 16; - if (baseWidth < 0) - throw new NumberFormatException(); - if (baseWidth == 0) - return false; - break; - } catch (NumberFormatException ignored) { - } - } - - while (true) { - try { - String baseHeightStr = JOptionPane.showInputDialog("Veuillez entrez le nombre de cases hauteur de votre carte (0 pour annuler) :"); - if (baseHeightStr == null) - return false; - baseHeight = Integer.parseInt(baseHeightStr) * 16; - if (baseHeight < 0) - throw new NumberFormatException(); - if (baseHeight == 0) - return false; - break; - } catch (NumberFormatException ignored) { - } - } - - width = baseWidth + (baseWidth / 16) + 1; - height = baseHeight + (baseHeight / 16) + 1; - - BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - Graphics2D g = image.createGraphics(); - g.setColor(Color.white); - g.fillRect(0, 0, width, height); - g.setColor(Color.black); - g.drawLine(0, 0, width, 0); - g.drawLine(0, 0, 0, height); - for (int x = 17; x <= width; x += 17) { - g.drawLine(x, 0, x, height); - } - - for (int y = 17; y <= height; y += 17) { - g.drawLine(0, y, width, y); - } - - RawMap rm = EditorAPI.toRawMap(baseWidth, baseHeight); - rm.setFont(image); - - EditorAPI.open(rm); - - return true; - } - - public static boolean launchGameMode() { - System.out.println("Lancement du jeu ..."); - JFileChooser jfc = EditorAPI.createJFC(); - jfc.showOpenDialog(MainFrame.getInstance()); - if (jfc.getSelectedFile() == null) - return false; - - RawMap map = EditorAPI.getRawMap(jfc.getSelectedFile()); - - new GameFrame(map); - - return true; - } - - /** - * Accesseur disant si le jeu est lancé en développement ou non. - * - * @see #DEV - * @since 0.1-alpha - */ - public static boolean isInDevelopmentMode() { - return DEV; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/client/main/package-info.java b/src/main/java/fr/ynerant/leveleditor/client/main/package-info.java deleted file mode 100644 index e5f506f..0000000 --- a/src/main/java/fr/ynerant/leveleditor/client/main/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Ce package comprend uniquement la classe Main, qui lance l'application. - * - * @author ÿnérant - */ -package fr.ynerant.leveleditor.client.main; \ No newline at end of file diff --git a/src/main/java/fr/ynerant/leveleditor/editor/CollidPanel.java b/src/main/java/fr/ynerant/leveleditor/editor/CollidPanel.java deleted file mode 100644 index c786fc7..0000000 --- a/src/main/java/fr/ynerant/leveleditor/editor/CollidPanel.java +++ /dev/null @@ -1,83 +0,0 @@ -package fr.ynerant.leveleditor.editor; - -import fr.ynerant.leveleditor.api.editor.Case; -import fr.ynerant.leveleditor.api.editor.Collision; - -import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferedImage; - -public class CollidPanel extends JPanel { - private static final long serialVersionUID = -138754019431984881L; - - private final EditorFrame frame; - - public CollidPanel(EditorFrame frame) { - super(); - this.frame = frame; - } - - public Map getMap() { - return frame.getMap(); - } - - @Override - public void paintComponent(Graphics g) { - g.fillRect(0, 0, getWidth(), getHeight()); - BufferedImage img = getMap().getFont(); - int x = getWidth() / 2 - img.getWidth(); - int y = getHeight() / 2 - img.getHeight(); - int width = img.getWidth() * 2; - int height = img.getHeight() * 2; - g.drawImage(getMap().getFont(), x, y, width, height, null); - - for (Case c : getMap().getAllCases()) { - if (isEmpty(c.getCoucheOne().getImage())) - continue; - - g.drawImage(c.getCoucheOne().getImage(), x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - - if (isEmpty(c.getCoucheTwo().getImage())) - continue; - - g.drawImage(c.getCoucheTwo().getImage(), x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - - if (isEmpty(c.getCoucheThree().getImage())) - continue; - - g.drawImage(c.getCoucheThree().getImage(), x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - } - - for (Case c : getMap().getAllCases()) { - if (c.getCollision() != Collision.ANY) { - BufferedImage alpha = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB); - - if (c.getCollision() == Collision.FULL) { - Graphics2D grap = alpha.createGraphics(); - grap.setColor(new Color(0, 0, 0, 100)); - grap.fillRect(0, 0, 16, 16); - grap.dispose(); - } else if (c.getCollision() == Collision.PARTIAL) { - Graphics2D grap = alpha.createGraphics(); - grap.setColor(new Color(255, 0, 255, 70)); - grap.fillRect(0, 0, 16, 16); - grap.dispose(); - } - - g.drawImage(alpha, x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - } - } - } - - public static boolean isEmpty(BufferedImage image) { - int allrgba = 0; - - for (int x = 0; x < image.getWidth(); ++x) { - for (int y = 0; y < image.getHeight(); ++y) { - allrgba += image.getRGB(x, y) + 1; - } - } - - return allrgba == 0; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/editor/EditorFrame.java b/src/main/java/fr/ynerant/leveleditor/editor/EditorFrame.java deleted file mode 100644 index fabc479..0000000 --- a/src/main/java/fr/ynerant/leveleditor/editor/EditorFrame.java +++ /dev/null @@ -1,322 +0,0 @@ -package fr.ynerant.leveleditor.editor; - -import fr.ynerant.leveleditor.api.editor.EditorAPI; -import fr.ynerant.leveleditor.api.editor.RawMap; -import fr.ynerant.leveleditor.api.editor.sprites.Category; -import fr.ynerant.leveleditor.api.editor.sprites.Sprite; -import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister; -import fr.ynerant.leveleditor.frame.listeners.*; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.*; -import java.awt.event.*; -import java.awt.image.BufferedImage; -import java.io.File; - -public class EditorFrame extends JFrame implements ChangeListener, ActionListener, WindowListener { - private static final long serialVersionUID = -2705122356101556462L; - - private final Map map; - - private final JMenuItem save = new JMenuItem("Sauvegarder"); - private final JMenuItem saveAs = new JMenuItem("Sauvegarder sous ..."); - private final JMenuItem exit = new JMenuItem("Quitter"); - private final JRadioButtonMenuItem pen = new JRadioButtonMenuItem("Pinceau"); - private final JRadioButtonMenuItem pot = new JRadioButtonMenuItem("Pot de peinture"); - private final JTabbedPane tabs = new JTabbedPane(); - private final CollidPanel tabColl; - private final MapPanel mapPanel; - private final JTabbedPane resources = new JTabbedPane(); - private final JPanel couche1 = new JPanel(); - private final JPanel couche2 = new JPanel(); - private final JPanel couche3 = new JPanel(); - final ButtonGroup group = new ButtonGroup(); - private SpriteComp selectedSprite; - - public EditorFrame(Map map) { - super("Level Editor"); - this.map = map; - this.setSize(600, 600); - this.setPreferredSize(getSize()); - this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - this.setExtendedState(JFrame.MAXIMIZED_BOTH); - this.setLocationRelativeTo(null); - this.addWindowListener(this); - JPanel content = new JPanel(); - content.setLayout(new BorderLayout()); - this.setContentPane(content); - this.setVisible(true); - this.setVisible(false); - - JMenu fichier = new JMenu("Fichier"); - fichier.setMnemonic(KeyEvent.VK_F + KeyEvent.ALT_DOWN_MASK); - - JMenuItem nouveau = new JMenuItem("Nouveau"); - nouveau.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_DOWN_MASK, true)); - nouveau.addActionListener(new CreateMapListener()); - fichier.add(nouveau); - - JMenuItem open = new JMenuItem("Ouvrir"); - open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_DOWN_MASK, true)); - open.addActionListener(new OpenMapListener()); - fichier.add(open); - - fichier.addSeparator(); - - save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_DOWN_MASK, true)); - save.addActionListener(this); - fichier.add(save); - - saveAs.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_DOWN_MASK + KeyEvent.SHIFT_DOWN_MASK, true)); - saveAs.addActionListener(this); - fichier.add(saveAs); - - fichier.addSeparator(); - - exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.CTRL_DOWN_MASK, true)); - exit.addActionListener(this); - fichier.add(exit); - - JMenuBar menuBar = new JMenuBar(); - menuBar.add(fichier); - - pen.setSelected(true); - pen.addActionListener(this); - pot.addActionListener(this); - group.add(pen); - group.add(pot); - JMenu selectionMode = new JMenu("Mode de s\u00e9lection"); - selectionMode.add(pen); - selectionMode.add(pot); - - JMenu tools = new JMenu("Outils"); - tools.setMnemonic(KeyEvent.VK_O + KeyEvent.ALT_DOWN_MASK); - - tools.add(selectionMode); - - menuBar.add(tools); - - this.setJMenuBar(menuBar); - - mapPanel = new MapPanel(this); - mapPanel.addMouseListener(new MapMouseListener(mapPanel, this)); - mapPanel.addMouseMotionListener(new MapMouseListener(mapPanel, this)); - - tabColl = new CollidPanel(this); - tabColl.addMouseListener(new CollidMapMouseListener(tabColl, this)); - tabColl.addMouseMotionListener(new CollidMapMouseListener(tabColl, this)); - - JScrollPane scrollMap = new JScrollPane(mapPanel); - scrollMap.getHorizontalScrollBar().setUnitIncrement(34); - scrollMap.getVerticalScrollBar().setUnitIncrement(34); - JScrollPane scrollCollidMap = new JScrollPane(tabColl); - scrollCollidMap.getHorizontalScrollBar().setUnitIncrement(34); - scrollCollidMap.getVerticalScrollBar().setUnitIncrement(34); - - tabs.addTab("Carte", scrollMap); - JPanel tabEvents = new JPanel(); - tabs.addTab("\u00c9vennments", new JScrollPane(tabEvents)); - tabs.addTab("Collisions", scrollCollidMap); - tabs.addChangeListener(this); - - content.add(tabs, BorderLayout.CENTER); - - couche1.setLayout(new WrapLayout(WrapLayout.LEFT)); - couche2.setLayout(new WrapLayout(WrapLayout.LEFT)); - couche3.setLayout(new WrapLayout(WrapLayout.LEFT)); - - JScrollPane scroll1 = new JScrollPane(couche1, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - JScrollPane scroll2 = new JScrollPane(couche2, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - JScrollPane scroll3 = new JScrollPane(couche3, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - - scroll1.getHorizontalScrollBar().setMaximum(0); - scroll2.getHorizontalScrollBar().setMaximum(0); - scroll3.getHorizontalScrollBar().setMaximum(0); - - resources.addTab("", new ImageIcon(new File("assets/leveleditor/textures/layer 1.png").getAbsolutePath()), scroll1); - resources.addTab("", new ImageIcon(new File("assets/leveleditor/textures/layer 2.png").getAbsolutePath()), scroll2); - resources.addTab("", new ImageIcon(new File("assets/leveleditor/textures/layer 3.png").getAbsolutePath()), scroll3); - resources.addChangeListener(this); - resources.setBackgroundAt(0, Color.white); - resources.setBackgroundAt(1, Color.white); - resources.setBackgroundAt(2, Color.white); - - content.add(resources, BorderLayout.EAST); - - resize(); - - drawResources(); - - revalidate(); - repaint(); - } - - private void drawResources() { - couche1.removeAll(); - couche2.removeAll(); - couche3.removeAll(); - - if (couche1.getComponents().length > 0) { - return; - } - - if (couche1.getWidth() == 0 || couche2.getWidth() == 0 || couche3.getWidth() == 0) { - couche1.repaint(); - couche2.repaint(); - couche3.repaint(); - } - - for (Category cat : SpriteRegister.getAllCategories()) { - for (Sprite spr : cat.getSprites()) { - SpriteComp sprc1 = new SpriteComp(spr, 0); - SpriteComp sprc2 = new SpriteComp(spr, 1); - SpriteComp sprc3 = new SpriteComp(spr, 2); - sprc1.addMouseListener(new SpriteMouseListener(sprc1, this)); - sprc2.addMouseListener(new SpriteMouseListener(sprc2, this)); - sprc3.addMouseListener(new SpriteMouseListener(sprc3, this)); - couche1.add(sprc1); - couche2.add(sprc2); - couche3.add(sprc3); - } - } - - couche1.revalidate(); - couche2.revalidate(); - couche3.revalidate(); - couche1.repaint(); - couche2.repaint(); - couche3.repaint(); - } - - public void resize() { - - int cursorPos = ((JScrollPane) resources.getSelectedComponent()).getVerticalScrollBar().getValue(); - tabs.setPreferredSize(new Dimension(getWidth(), getHeight() / 5)); - tabs.setLocation(0, 0); - BufferedImage img = getMap().getFont(); - int width = img.getWidth() * 2; - int height = img.getHeight() * 2; - mapPanel.setPreferredSize(new Dimension(width, height)); - mapPanel.setLocation(0, getHeight() / 5); - tabColl.setPreferredSize(new Dimension(width, height)); - tabColl.setLocation(0, getHeight() / 5); - resources.setPreferredSize(new Dimension(getWidth() / 4 - 15, getHeight() / 5 * 4 - 40)); - resources.setLocation(getWidth() / 4 * 3, getHeight() / 5); - - JScrollPane scroll1 = (JScrollPane) resources.getComponent(0); - JScrollPane scroll2 = (JScrollPane) resources.getComponent(1); - JScrollPane scroll3 = (JScrollPane) resources.getComponent(2); - - scroll1.getHorizontalScrollBar().setMaximum(0); - scroll2.getHorizontalScrollBar().setMaximum(0); - scroll3.getHorizontalScrollBar().setMaximum(0); - - drawResources(); - - ((JScrollPane) resources.getSelectedComponent()).getVerticalScrollBar().setValue(cursorPos); - } - - public Map getMap() { - return map; - } - - public SpriteComp getSelectedSprite() { - return selectedSprite; - } - - public void setSelectedSprite(SpriteComp sprite) { - this.selectedSprite = sprite; - } - - @Override - public void stateChanged(ChangeEvent event) { - if (event.getSource() == resources) { - if (getSelectedLayerIndex() == 0) { - resources.setBackgroundAt(0, Color.white); - resources.setBackgroundAt(1, Color.white); - resources.setBackgroundAt(2, Color.white); - } else if (getSelectedLayerIndex() == 1) { - resources.setBackgroundAt(0, Color.black); - resources.setBackgroundAt(1, Color.white); - resources.setBackgroundAt(2, Color.white); - } else if (getSelectedLayerIndex() == 2) { - resources.setBackgroundAt(0, Color.black); - resources.setBackgroundAt(1, Color.black); - resources.setBackgroundAt(2, Color.white); - } - - repaint(); - } else if (event.getSource() == tabs) { - resources.setEnabled(tabs.getSelectedIndex() == 0); - couche1.setEnabled(resources.isEnabled()); - couche2.setEnabled(resources.isEnabled()); - couche3.setEnabled(resources.isEnabled()); - - repaint(); - } - } - - public int getSelectedLayerIndex() { - return resources.getSelectedIndex(); - } - - @Override - public void actionPerformed(ActionEvent event) { - if (event.getSource() == save) { - EditorAPI.save(RawMap.create(map)); - } else if (event.getSource() == saveAs) { - EditorAPI.saveAs(RawMap.create(map)); - } else if (event.getSource() == exit) { - int result = JOptionPane.showConfirmDialog(null, "Voulez-vous sauvegarder votre carte avant de quitter ? Toute modification sera perdue", "Confirmation", JOptionPane.YES_NO_CANCEL_OPTION); - - if (result == 0) - save.doClick(); - - if (result != 2) - dispose(); - } - } - - public int getSelectedPaintingMode() { - return pen.isSelected() ? 0 : pot.isSelected() ? 1 : -1; - } - - @Override - public void windowActivated(WindowEvent event) { - } - - @Override - public void windowClosed(WindowEvent event) { - } - - @Override - public void windowClosing(WindowEvent event) { - int result = JOptionPane.showConfirmDialog(null, "Voulez-vous sauvegarder avant de quitter ?", "Confirmation", JOptionPane.YES_NO_CANCEL_OPTION); - - if (result == 0) { - EditorAPI.save(RawMap.create(map)); - } - - if (result != 2) { - dispose(); - } - } - - @Override - public void windowDeactivated(WindowEvent event) { - } - - @Override - public void windowDeiconified(WindowEvent event) { - } - - @Override - public void windowIconified(WindowEvent event) { - } - - @Override - public void windowOpened(WindowEvent event) { - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/editor/Map.java b/src/main/java/fr/ynerant/leveleditor/editor/Map.java deleted file mode 100644 index 83d7ea4..0000000 --- a/src/main/java/fr/ynerant/leveleditor/editor/Map.java +++ /dev/null @@ -1,82 +0,0 @@ -package fr.ynerant.leveleditor.editor; - -import fr.ynerant.leveleditor.api.editor.Case; -import fr.ynerant.leveleditor.api.editor.RawCase; -import fr.ynerant.leveleditor.api.editor.RawMap; -import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister; - -import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class Map { - @Deprecated - private static List cases; - private final EditorFrame frame; - private final int width; - private final int height; - private final java.util.Map> casesMap = new HashMap<>(); - private final transient BufferedImage font; - - public Map(RawMap raw) { - cases = new ArrayList<>(); - this.width = raw.getWidth(); - this.height = raw.getHeight(); - this.font = raw.getFont(); - - for (RawCase rc : raw.getCases()) { - cases.add(Case.create(rc.getPosX(), rc.getPosY(), SpriteRegister.getCategory(rc.getCoucheOne().getCategory()).getSprites().get(rc.getCoucheOne().getIndex()), SpriteRegister.getCategory(rc.getCoucheTwo().getCategory()).getSprites().get(rc.getCoucheTwo().getIndex()), SpriteRegister.getCategory(rc.getCoucheThree().getCategory()).getSprites().get(rc.getCoucheThree().getIndex()), rc.getCollision())); - } - - reorganizeMap(); - - frame = new EditorFrame(this); - - getFrame().setVisible(true); - } - - public EditorFrame getFrame() { - return frame; - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - - public Case getCase(int x, int y) { - return casesMap.getOrDefault(x, new HashMap<>()).get(y); - } - - public void setCase(int x, int y, Case c) { - casesMap.get(x).put(y, c); - } - - public BufferedImage getFont() { - return font; - } - - private void reorganizeMap() { - for (int i = 0; i < width; ++i) { - casesMap.put(i, new HashMap<>()); - } - - for (Case c : cases) { - setCase(c.getPosX(), c.getPosY(), c); - } - } - - public List getAllCases() { - List list = new ArrayList<>(); - - for (java.util.Map l : casesMap.values()) { - list.addAll(l.values()); - } - - return list; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/editor/MapPanel.java b/src/main/java/fr/ynerant/leveleditor/editor/MapPanel.java deleted file mode 100644 index dbe9316..0000000 --- a/src/main/java/fr/ynerant/leveleditor/editor/MapPanel.java +++ /dev/null @@ -1,77 +0,0 @@ -package fr.ynerant.leveleditor.editor; - -import fr.ynerant.leveleditor.api.editor.Case; - -import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferedImage; - -public class MapPanel extends JPanel { - private static final long serialVersionUID = 2629019576253690557L; - - private final EditorFrame frame; - - public MapPanel(EditorFrame frame) { - super(); - this.frame = frame; - } - - public Map getMap() { - return frame.getMap(); - } - - @Override - public void paintComponent(Graphics g) { - g.fillRect(0, 0, getWidth(), getHeight()); - BufferedImage img = getMap().getFont(); - int x = getWidth() / 2 - img.getWidth(); - int y = getHeight() / 2 - img.getHeight(); - int width = img.getWidth() * 2; - int height = img.getHeight() * 2; - g.drawImage(getMap().getFont(), x, y, width, height, null); - - for (Case c : getMap().getAllCases()) { - // BufferedImage image; - - if (!isEmpty(c.getCoucheOne().getImage())) { - g.drawImage(c.getCoucheOne().getImage(), x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - } - /* if (frame.getSelectedLayerIndex() != 0) - { - image = recalculateAplha(c.getCoucheOne().getImage(), 0); - g.drawImage(image, x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - }*/ - - if (!isEmpty(c.getCoucheTwo().getImage()) && frame.getSelectedLayerIndex() >= 1) { - g.drawImage(c.getCoucheTwo().getImage(), x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - } - /* if (frame.getSelectedLayerIndex() != 1) - { - image = recalculateAplha(c.getCoucheTwo().getImage(), 1); - g.drawImage(image, x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - }*/ - - if (!isEmpty(c.getCoucheThree().getImage()) && frame.getSelectedLayerIndex() == 2) { - g.drawImage(c.getCoucheThree().getImage(), x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - } - /* if (frame.getSelectedLayerIndex() != 2) - { - image = recalculateAplha(c.getCoucheThree().getImage(), 2); - g.drawImage(image, x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - }*/ - } - } - - @SuppressWarnings("BooleanMethodIsAlwaysInverted") - private boolean isEmpty(BufferedImage image) { - int allrgba = 0; - - for (int x = 0; x < image.getWidth(); ++x) { - for (int y = 0; y < image.getHeight(); ++y) { - allrgba += image.getRGB(x, y) + 1; - } - } - - return allrgba == 0; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/editor/SpriteComp.java b/src/main/java/fr/ynerant/leveleditor/editor/SpriteComp.java deleted file mode 100644 index 63186db..0000000 --- a/src/main/java/fr/ynerant/leveleditor/editor/SpriteComp.java +++ /dev/null @@ -1,59 +0,0 @@ -package fr.ynerant.leveleditor.editor; - -import fr.ynerant.leveleditor.api.editor.sprites.Sprite; - -import javax.swing.*; -import java.awt.*; - -public class SpriteComp extends JComponent { - private static final long serialVersionUID = -6512257366877053285L; - - private final Sprite sprite; - private final int couche; - private boolean selected; - - public SpriteComp(Sprite sprite, int couche) { - super(); - this.sprite = sprite; - this.couche = couche; - this.setMinimumSize(new Dimension(32, 32)); - this.setMaximumSize(new Dimension(32, 32)); - this.setPreferredSize(new Dimension(32, 32)); - this.setSize(new Dimension(32, 32)); - - repaint(); - } - - public Sprite getSprite() { - return sprite; - } - - public int getCouche() { - return couche; - } - - public boolean isSelected() { - return selected; - } - - public void setSelected(boolean selected) { - this.selected = selected; - } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - - g.setColor(Color.white); - g.fillRect(0, 0, getWidth(), getHeight()); - g.drawImage(sprite.getImage(), 0, 0, 32, 32, Color.white, null); - - if (isSelected()) { - g.setColor(Color.black); - g.drawLine(0, 0, getWidth() - 1, 0); - g.drawLine(0, 0, 0, getHeight() - 1); - g.drawLine(0, getHeight() - 1, getWidth() - 1, getHeight() - 1); - g.drawLine(getWidth() - 1, 0, getWidth() - 1, getHeight() - 1); - } - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/editor/WrapLayout.java b/src/main/java/fr/ynerant/leveleditor/editor/WrapLayout.java deleted file mode 100644 index 36d402f..0000000 --- a/src/main/java/fr/ynerant/leveleditor/editor/WrapLayout.java +++ /dev/null @@ -1,88 +0,0 @@ -package fr.ynerant.leveleditor.editor; - -import javax.swing.*; -import java.awt.*; - -public class WrapLayout extends FlowLayout { - private static final long serialVersionUID = 8777237960365591646L; - - public WrapLayout(int align) { - super(align); - } - - @Override - public Dimension preferredLayoutSize(Container target) { - return layoutSize(target, true); - } - - @Override - public Dimension minimumLayoutSize(Container target) { - Dimension minimum = layoutSize(target, false); - minimum.width -= (getHgap() + 1); - return minimum; - } - - private Dimension layoutSize(Container target, boolean preferred) { - synchronized (target.getTreeLock()) { - int targetWidth = target.getSize().width; - - if (targetWidth == 0) - targetWidth = Integer.MAX_VALUE; - - int hgap = getHgap(); - int vgap = getVgap(); - Insets insets = target.getInsets(); - int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2); - int maxWidth = targetWidth - horizontalInsetsAndGap; - - Dimension dim = new Dimension(0, 0); - int rowWidth = 0; - int rowHeight = 0; - - int nmembers = target.getComponentCount(); - - for (int i = 0; i < nmembers; i++) { - Component m = target.getComponent(i); - - if (m.isVisible()) { - Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize(); - - if (rowWidth + d.width > maxWidth) { - addRow(dim, rowWidth, rowHeight); - rowWidth = 0; - rowHeight = 0; - } - - if (rowWidth != 0) { - rowWidth += hgap; - } - - rowWidth += d.width; - rowHeight = Math.max(rowHeight, d.height); - } - } - - addRow(dim, rowWidth, rowHeight); - - dim.width += horizontalInsetsAndGap; - dim.height += insets.top + insets.bottom + vgap * 2; - - Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target); - if (scrollPane != null) { - dim.width -= (hgap + 1); - } - - return dim; - } - } - - private void addRow(Dimension dim, int rowWidth, int rowHeight) { - dim.width = Math.max(dim.width, rowWidth); - - if (dim.height > 0) { - dim.height += getVgap(); - } - - dim.height += rowHeight; - } -} \ No newline at end of file diff --git a/src/main/java/fr/ynerant/leveleditor/frame/MainFrame.java b/src/main/java/fr/ynerant/leveleditor/frame/MainFrame.java deleted file mode 100644 index 8464484..0000000 --- a/src/main/java/fr/ynerant/leveleditor/frame/MainFrame.java +++ /dev/null @@ -1,102 +0,0 @@ -package fr.ynerant.leveleditor.frame; - -import fr.ynerant.leveleditor.client.main.Main; -import fr.ynerant.leveleditor.frame.listeners.ChangeLAFListener; -import fr.ynerant.leveleditor.frame.listeners.CreateMapListener; -import fr.ynerant.leveleditor.frame.listeners.OpenMapListener; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; - -/** - * Fenêtre principale du jeu - * - * @author ÿnérant - */ -public class MainFrame extends JFrame { - /** - * ID de série - */ - private static final long serialVersionUID = -3168760121879418534L; - - /** - * Instance unique principale - * - * @see #MainFrame() - * @see #getInstance() - */ - private static MainFrame INSTANCE; - - /** - * Constructeur - * - * @see Main#launchFrame() - */ - @SuppressWarnings("JavadocReference") - private MainFrame() { - super(); - System.out.println("Initialisation de la fen\u00eatre"); - this.setTitle("Level Editor"); - this.setPreferredSize(new Dimension(1000, 800)); - this.setSize(800, 700); - this.setLocationRelativeTo(null); - this.setExtendedState(JFrame.MAXIMIZED_BOTH); - this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JMenu fichier = new JMenu("Fichier"); - fichier.setMnemonic(KeyEvent.VK_F + KeyEvent.ALT_DOWN_MASK); - JMenu display = new JMenu("Affichage"); - display.setMnemonic(KeyEvent.VK_A + KeyEvent.ALT_DOWN_MASK); - - JMenuItem createMap = new JMenuItem("Cr\u00e9er"); - createMap.addActionListener(new CreateMapListener()); - JMenu editMaps = new JMenu("Cartes"); - editMaps.add(createMap); - JMenuItem openMap = new JMenuItem("Ouvrir"); - openMap.addActionListener(new OpenMapListener()); - editMaps.add(openMap); - - fichier.add(editMaps); - - JMenuItem systemLAF = new JMenuItem("Apparence syst\u00e8me"); - systemLAF.addActionListener(new ChangeLAFListener(systemLAF, this)); - JMenu changeLAF = new JMenu("Modfier l'apparence"); - changeLAF.add(systemLAF); - JMenuItem javaLAF = new JMenuItem("Apparence Java"); - javaLAF.addActionListener(new ChangeLAFListener(javaLAF, this)); - changeLAF.add(javaLAF); - JMenuItem darkLAF = new JMenuItem("Apparence sombre"); - darkLAF.addActionListener(new ChangeLAFListener(darkLAF, this)); - changeLAF.add(darkLAF); - - display.add(changeLAF); - - JMenuBar menuBar = new JMenuBar(); - menuBar.add(fichier); - menuBar.add(display); - - this.setJMenuBar(menuBar); - - JButton start = new JButton("Commencer la partie !"); - start.addActionListener(actionEvent -> { - if (Main.launchGameMode()) - getInstance().dispose(); - }); - this.setContentPane(start); - } - - /** - * Cet accesseur renvoie l'accesseur unique de la classe - * - * @return l'instance unique de la classe - * @see #INSTANCE - * @see #MainFrame() - */ - public static MainFrame getInstance() { - if (INSTANCE == null) - return INSTANCE = new MainFrame(); - - return INSTANCE; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/frame/listeners/ChangeLAFListener.java b/src/main/java/fr/ynerant/leveleditor/frame/listeners/ChangeLAFListener.java deleted file mode 100644 index 023a74f..0000000 --- a/src/main/java/fr/ynerant/leveleditor/frame/listeners/ChangeLAFListener.java +++ /dev/null @@ -1,49 +0,0 @@ -package fr.ynerant.leveleditor.frame.listeners; - -import fr.ynerant.leveleditor.frame.MainFrame; - -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -public class ChangeLAFListener implements ActionListener { - private final JMenuItem item; - private final JFrame frame; - - public ChangeLAFListener(JMenuItem LAF, MainFrame f) { - this.item = LAF; - this.frame = f; - } - - @Override - public void actionPerformed(ActionEvent event) { - if (item.getText().toLowerCase().contains("sys")) { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Exception e) { - new ExceptionInInitializerError("Erreur lors du changement de 'look and feel'").printStackTrace(); - System.err.print("Caused by "); - e.printStackTrace(); - } - SwingUtilities.updateComponentTreeUI(frame); - } else if (item.getText().toLowerCase().contains("java")) { - try { - UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); - } catch (Exception e) { - new ExceptionInInitializerError("Erreur lors du changement de 'look and feel'").printStackTrace(); - System.err.print("Caused by "); - e.printStackTrace(); - } - SwingUtilities.updateComponentTreeUI(frame); - } else if (item.getText().toLowerCase().contains("sombre")) { - try { - UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); - } catch (Exception e) { - new ExceptionInInitializerError("Erreur lors du changement de 'look and feel'").printStackTrace(); - System.err.print("Caused by "); - e.printStackTrace(); - } - SwingUtilities.updateComponentTreeUI(frame); - } - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.java b/src/main/java/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.java deleted file mode 100644 index bd229ef..0000000 --- a/src/main/java/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.java +++ /dev/null @@ -1,45 +0,0 @@ -package fr.ynerant.leveleditor.frame.listeners; - -import fr.ynerant.leveleditor.api.editor.Case; -import fr.ynerant.leveleditor.api.editor.Collision; -import fr.ynerant.leveleditor.editor.CollidPanel; -import fr.ynerant.leveleditor.editor.EditorFrame; -import fr.ynerant.leveleditor.editor.Map; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -public class CollidMapMouseListener extends MouseAdapter { - private final EditorFrame frame; - private final CollidPanel panel; - - public CollidMapMouseListener(CollidPanel panel, EditorFrame frame) { - this.frame = frame; - this.panel = panel; - } - - public EditorFrame getFrame() { - return frame; - } - - @Override - public void mouseReleased(MouseEvent event) { - Map map = getFrame().getMap(); - - int x = panel.getWidth() / 2 - map.getFont().getWidth(); - int y = panel.getHeight() / 2 - map.getFont().getHeight(); - Case c; - - if ((c = map.getCase((event.getX() - x + 2) / 34, (event.getY() - y + 2) / 34)) != null && event.getX() - x >= 2 && event.getY() - y >= 2) { - int colIndex = c.getCollision().ordinal(); - int newColIndex = colIndex + 1; - if (newColIndex >= Collision.values().length) - newColIndex = 0; - Collision col = Collision.values()[newColIndex]; - Case n = Case.create(c.getPosX(), c.getPosY(), c.getCoucheOne(), c.getCoucheTwo(), c.getCoucheThree(), col); - - map.setCase((event.getX() - x + 2) / 34, (event.getY() - y + 2) / 34, n); - panel.repaint(); - } - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/frame/listeners/CreateMapListener.java b/src/main/java/fr/ynerant/leveleditor/frame/listeners/CreateMapListener.java deleted file mode 100644 index 1403be4..0000000 --- a/src/main/java/fr/ynerant/leveleditor/frame/listeners/CreateMapListener.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.ynerant.leveleditor.frame.listeners; - -import fr.ynerant.leveleditor.client.main.Main; -import fr.ynerant.leveleditor.frame.MainFrame; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -/** - * @author ÿnérant - */ -public class CreateMapListener implements ActionListener { - /* !CodeTemplates.overridecomment.nonjd! - * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) - */ - @Override - public void actionPerformed(ActionEvent event) { - if (Main.launchEditMode()) - MainFrame.getInstance().dispose(); - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.java b/src/main/java/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.java deleted file mode 100644 index 705e83f..0000000 --- a/src/main/java/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.java +++ /dev/null @@ -1,95 +0,0 @@ -package fr.ynerant.leveleditor.frame.listeners; - -import fr.ynerant.leveleditor.api.editor.Case; -import fr.ynerant.leveleditor.editor.EditorFrame; -import fr.ynerant.leveleditor.editor.Map; -import fr.ynerant.leveleditor.editor.MapPanel; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -public class MapMouseListener extends MouseAdapter { - private final EditorFrame frame; - private final MapPanel panel; - - public MapMouseListener(MapPanel panel, EditorFrame frame) { - this.frame = frame; - this.panel = panel; - } - - public EditorFrame getFrame() { - return frame; - } - - @Override - public void mouseClicked(MouseEvent event) { - if (frame.getSelectedPaintingMode() == 0) { - Map map = getFrame().getMap(); - - int x = panel.getWidth() / 2 - map.getFont().getWidth(); - int y = panel.getHeight() / 2 - map.getFont().getHeight(); - Case c; - - if ((c = map.getCase((event.getX() - x + 2) / 34, (event.getY() - y + 2) / 34)) != null && event.getX() - x >= 2 && event.getY() - y >= 2) { - if (getFrame().getSelectedSprite() != null) { - Case n; - - switch (getFrame().getSelectedSprite().getCouche()) { - case 0: - n = Case.create(c.getPosX(), c.getPosY(), getFrame().getSelectedSprite().getSprite(), c.getCoucheTwo(), c.getCoucheThree(), c.getCollision()); - break; - case 1: - n = Case.create(c.getPosX(), c.getPosY(), c.getCoucheOne(), getFrame().getSelectedSprite().getSprite(), c.getCoucheThree(), c.getCollision()); - break; - case 2: - n = Case.create(c.getPosX(), c.getPosY(), c.getCoucheOne(), c.getCoucheTwo(), getFrame().getSelectedSprite().getSprite(), c.getCollision()); - break; - default: - n = c; - break; - } - - map.setCase(n.getPosX(), n.getPosY(), n); - panel.repaint(); - } - } - } else if (frame.getSelectedPaintingMode() == 1) { - for (Case c : getFrame().getMap().getAllCases()) { - Map map = getFrame().getMap(); - - if (getFrame().getSelectedSprite() != null) { - if (getFrame().getSelectedSprite().getCouche() - 1 > getFrame().getSelectedLayerIndex()) - return; - - Case n; - - switch (getFrame().getSelectedSprite().getCouche()) { - case 0: - n = Case.create(c.getPosX(), c.getPosY(), getFrame().getSelectedSprite().getSprite(), c.getCoucheTwo(), c.getCoucheThree(), c.getCollision()); - break; - case 1: - n = Case.create(c.getPosX(), c.getPosY(), c.getCoucheOne(), getFrame().getSelectedSprite().getSprite(), c.getCoucheThree(), c.getCollision()); - break; - case 2: - n = Case.create(c.getPosX(), c.getPosY(), c.getCoucheOne(), c.getCoucheTwo(), getFrame().getSelectedSprite().getSprite(), c.getCollision()); - break; - default: - n = c; - break; - } - - map.setCase(n.getPosX(), n.getPosY(), n); - } - } - - panel.repaint(); - } - } - - @Override - public void mouseDragged(MouseEvent event) { - if (frame.getSelectedPaintingMode() == 0) { - mouseClicked(event); - } - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/frame/listeners/OpenMapListener.java b/src/main/java/fr/ynerant/leveleditor/frame/listeners/OpenMapListener.java deleted file mode 100644 index 5976e6e..0000000 --- a/src/main/java/fr/ynerant/leveleditor/frame/listeners/OpenMapListener.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.ynerant.leveleditor.frame.listeners; - -import fr.ynerant.leveleditor.api.editor.EditorAPI; -import fr.ynerant.leveleditor.frame.MainFrame; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -public class OpenMapListener implements ActionListener { - /* !CodeTemplates.overridecomment.nonjd! - * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) - */ - @Override - public void actionPerformed(ActionEvent event) { - if (EditorAPI.open() != null) - MainFrame.getInstance().dispose(); - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/frame/listeners/SpriteMouseListener.java b/src/main/java/fr/ynerant/leveleditor/frame/listeners/SpriteMouseListener.java deleted file mode 100644 index b9e2c03..0000000 --- a/src/main/java/fr/ynerant/leveleditor/frame/listeners/SpriteMouseListener.java +++ /dev/null @@ -1,28 +0,0 @@ -package fr.ynerant.leveleditor.frame.listeners; - -import fr.ynerant.leveleditor.editor.EditorFrame; -import fr.ynerant.leveleditor.editor.SpriteComp; - -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -public class SpriteMouseListener extends MouseAdapter { - private final SpriteComp sprite; - private final EditorFrame frame; - - public SpriteMouseListener(SpriteComp sprc, EditorFrame frame) { - this.sprite = sprc; - this.frame = frame; - } - - @Override - public void mouseReleased(MouseEvent event) { - if (frame.getSelectedSprite() != null) { - frame.getSelectedSprite().setSelected(false); - frame.getSelectedSprite().repaint(); - } - frame.setSelectedSprite(sprite); - sprite.setSelected(true); - sprite.repaint(); - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/game/GameFrame.java b/src/main/java/fr/ynerant/leveleditor/game/GameFrame.java deleted file mode 100644 index a4ed1ee..0000000 --- a/src/main/java/fr/ynerant/leveleditor/game/GameFrame.java +++ /dev/null @@ -1,237 +0,0 @@ -package fr.ynerant.leveleditor.game; - -import fr.ynerant.leveleditor.api.editor.Collision; -import fr.ynerant.leveleditor.api.editor.RawCase; -import fr.ynerant.leveleditor.api.editor.RawMap; -import fr.ynerant.leveleditor.api.editor.sprites.Sprite; -import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister; -import fr.ynerant.leveleditor.editor.CollidPanel; -import fr.ynerant.leveleditor.game.mobs.Mob; -import fr.ynerant.leveleditor.game.towers.AutoTower; -import fr.ynerant.leveleditor.game.towers.BasicTower; -import fr.ynerant.leveleditor.game.towers.NullTower; -import fr.ynerant.leveleditor.game.towers.Tower; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.List; -import java.util.ArrayList; -import java.util.Random; - -public class GameFrame extends JFrame { - private final Random RANDOM = new Random(); - private final RawMap map; - - private int round = 0; - private int hp = 5; - private int reward = 20; - private final List mobs = new ArrayList<>(); - private final List towers = new ArrayList<>(); - - private final JRadioButton basicTower; - private final JRadioButton nullTower; - private final JRadioButton autoTower; - private final JLabel waveLabel; - private final JLabel nbMobsLabel; - private final JLabel hpLabel; - private final JLabel rewardLabel; - private final JLabel winLabel; - - public GameFrame(RawMap map) { - super("Jeu"); - - this.map = map; - this.setSize(600, 600); - this.setPreferredSize(getSize()); - this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - this.setExtendedState(JFrame.MAXIMIZED_BOTH); - this.setLocationRelativeTo(null); - - JPanel root = new JPanel(); - root.setLayout(new BorderLayout()); - this.setContentPane(root); - - JPanel pane = new JPanel(); - pane.setLayout(new GridLayout(8, 1)); - root.add(pane, BorderLayout.SOUTH); - - Grid grid = new Grid(); - grid.setSize(map.getWidth(), map.getHeight()); - grid.setPreferredSize(grid.getSize()); - grid.setMinimumSize(grid.getSize()); - grid.setMaximumSize(grid.getSize()); - root.add(grid, BorderLayout.CENTER); - - ButtonGroup towerSelect = new ButtonGroup(); - - basicTower = new JRadioButton("Tour basique (" + new BasicTower(0, 0).getPrice() + " pièces)"); - basicTower.setSelected(true); - towerSelect.add(basicTower); - pane.add(basicTower); - - nullTower = new JRadioButton("Tour nulle (" + new NullTower(0, 0).getPrice() + " pièces)"); - towerSelect.add(nullTower); - pane.add(nullTower); - - autoTower = new JRadioButton("Tour automatique (" + new AutoTower(0, 0).getPrice() + " pièces)"); - towerSelect.add(autoTower); - pane.add(autoTower); - - waveLabel = new JLabel(); - pane.add(waveLabel); - - nbMobsLabel = new JLabel(); - pane.add(nbMobsLabel); - - hpLabel = new JLabel(); - pane.add(hpLabel); - - rewardLabel = new JLabel(); - pane.add(rewardLabel); - - winLabel = new JLabel(); - pane.add(winLabel); - - setVisible(true); - - new Thread(() -> { - while (hp > 0 && (round < 4 || !mobs.isEmpty())) { - tick(); - - try { - Thread.sleep(50L); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }).start(); - - repaint(); - } - - public RawMap getMap() { - return map; - } - - public void tick() { - if (mobs.isEmpty() && round < 4) { - ++round; - int nb_mobs = round * (RANDOM.nextInt(16) + 1); - for (int i = 1; i <= nb_mobs; ++i) { - Mob mob = Mob.getRandomMob(); - do - mob.move(RANDOM.nextInt(getMap().getWidth() / 16), RANDOM.nextInt(getMap().getHeight() / 16)); - while (getMap().getCase(mob.getX(), mob.getY()).getCollision() != Collision.ANY); - getMap().getCase(mob.getX(), mob.getY()).setCollision(Collision.PARTIAL); - mobs.add(mob); - } - } - - for (Tower tower : towers) { - for (Mob mob : tower.filterDetectedMobs(mobs)) - mob.hit(tower.getDamagePerShot()); - } - - for (Mob mob : new ArrayList<>(mobs)) { - getMap().getCase(mob.getX(), mob.getY()).setCollision(Collision.ANY); - mob.tick(this); - if (mob.getX() < 0 || mob.isDead()) { - mobs.remove(mob); - if (mob.getX() < 0) { - --hp; - if (hp == 0) { - winLabel.setForeground(Color.red); - winLabel.setText("Vous avez perdu !"); - return; - } - } - else - reward += mob.getReward(); - } - else - getMap().getCase(mob.getX(), mob.getY()).setCollision(Collision.PARTIAL); - } - - waveLabel.setText("Vague " + round); - nbMobsLabel.setText(mobs.size() + " mob" + (mobs.size() > 1 ? "s" : "") + " restant" + (mobs.size() > 1 ? "s" : "")); - hpLabel.setText("Points de vie : " + hp); - rewardLabel.setText("Butin : " + reward); - - if (round == 4 && mobs.isEmpty()) { - winLabel.setForeground(Color.green.darker()); - winLabel.setText("Vous avez gagné !"); - } - } - - private class Grid extends JComponent implements MouseListener { - public Grid() { - addMouseListener(this); - } - - @Override - protected void paintComponent(Graphics _g) { - Graphics2D g = (Graphics2D) _g; - - if (getMap().getFont() != null) - g.drawImage(getMap().getFont(), null, null); - - SpriteRegister.refreshAllSprites(); - int SPRITE_SIZE = 32; - for (RawCase c : getMap().getCases()) { - Sprite s1 = SpriteRegister.getCategory(c.getCoucheOne().getCategory()).getSprites().get(c.getCoucheOne().getIndex()); - Sprite s2 = SpriteRegister.getCategory(c.getCoucheTwo().getCategory()).getSprites().get(c.getCoucheTwo().getIndex()); - Sprite s3 = SpriteRegister.getCategory(c.getCoucheThree().getCategory()).getSprites().get(c.getCoucheThree().getIndex()); - g.drawImage(s1.getImage(), SPRITE_SIZE * c.getPosX(), SPRITE_SIZE * c.getPosY(), SPRITE_SIZE, SPRITE_SIZE, Color.white, null); - if (!CollidPanel.isEmpty(s2.getImage())) - g.drawImage(s2.getImage(), SPRITE_SIZE * c.getPosX(), SPRITE_SIZE * c.getPosY(), SPRITE_SIZE, SPRITE_SIZE, null, null); - if (!CollidPanel.isEmpty(s3.getImage())) - g.drawImage(s3.getImage(), SPRITE_SIZE * c.getPosX(), SPRITE_SIZE * c.getPosY(), SPRITE_SIZE, SPRITE_SIZE, null, null); - } - - for (Mob mob : new ArrayList<>(mobs)) { - Sprite s = mob.getSprite(); - g.drawImage(s.getImage(), SPRITE_SIZE * mob.getX(), SPRITE_SIZE * mob.getY(), SPRITE_SIZE, SPRITE_SIZE, null, null); - } - - for (Tower tower : towers) { - Sprite s = tower.getSprite(); - g.drawImage(s.getImage(), SPRITE_SIZE * tower.getX(), SPRITE_SIZE * tower.getY(), SPRITE_SIZE, SPRITE_SIZE, null, null); - } - - repaint(); - } - - @Override - public void mouseClicked(MouseEvent event) {} - - @Override - public void mousePressed(MouseEvent event) {} - - @Override - public void mouseReleased(MouseEvent event) { - int x = event.getX() / 32, y = event.getY() / 32; - Tower tower = basicTower.isSelected() ? new BasicTower(x, y) : - nullTower.isSelected() ? new NullTower(x, y) : - autoTower.isSelected() ? new AutoTower(x, y) : - null; - if (tower == null || tower.getPrice() > reward) - return; - - RawCase c = getMap().getCase(x, y); - if (c == null || c.getCollision() != Collision.ANY) - return; - c.setCollision(Collision.FULL); - - reward -= tower.getPrice(); - towers.add(tower); - } - - @Override - public void mouseEntered(MouseEvent event) {} - - @Override - public void mouseExited(MouseEvent event) {} - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/game/mobs/Mob.java b/src/main/java/fr/ynerant/leveleditor/game/mobs/Mob.java deleted file mode 100644 index 724d6aa..0000000 --- a/src/main/java/fr/ynerant/leveleditor/game/mobs/Mob.java +++ /dev/null @@ -1,133 +0,0 @@ -package fr.ynerant.leveleditor.game.mobs; - -import fr.ynerant.leveleditor.api.editor.RawCase; -import fr.ynerant.leveleditor.api.editor.sprites.Sprite; -import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister; -import fr.ynerant.leveleditor.game.GameFrame; - -import java.util.*; - -public abstract class Mob { - private static final Random RANDOM = new Random(); - private Sprite sprite; - private int x; - private int y; - private int hp; - private long tickRemains; - - public Mob() { - this.hp = getMaxHP(); - this.tickRemains = getSlowness(); - } - - public abstract int getMaxHP(); - - public abstract long getSlowness(); - - public abstract int getReward(); - - public abstract String getName(); - - public Sprite getSprite() { - if (sprite == null) - sprite = SpriteRegister.getCategory(getName()).getSprites().get(0); - return sprite; - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public void move(int x, int y) { - this.x = x; - this.y = y; - } - - public int getHP() { - return hp; - } - - public boolean isDead() { - return hp <= 0; - } - - public void setHP(int hp) { - this.hp = hp; - } - - public boolean hit(int damage) { - if (!isDead()) { - this.hp -= damage; - return true; - } - - return false; - } - - public void tick(GameFrame game) { - if (tickRemains > 0) - --tickRemains; - else { - tickRemains = getSlowness(); - RawCase current = game.getMap().getCase(getX(), getY()); - - if (current.getPosX() == 0) { - move(-1, getY()); - return; - } - - List visited = new ArrayList<>(); - Queue queue = new ArrayDeque<>(); - Map pred = new HashMap<>(); - RawCase last = null; - queue.add(current); - while (!queue.isEmpty()) { - RawCase visiting = queue.poll(); - visited.add(visiting); - for (RawCase neighbour : game.getMap().getNeighbours(visiting)) { - if (visited.contains(neighbour)) - continue; - - pred.put(neighbour, visiting); - queue.add(neighbour); - - if (neighbour.getPosX() == 0) { - last = neighbour; - queue.clear(); - break; - } - } - - if (last != null) { - while (pred.get(last) != current) - last = pred.get(last); - move(last.getPosX(), last.getPosY()); - } - } - } - } - - @Override - public String toString() { - return "Mob{" + - "sprite=" + sprite + - ", x=" + x + - ", y=" + y + - '}'; - } - - public static Mob getRandomMob() { - switch (RANDOM.nextInt(3)) { - case 1: - return new Mob1(); - case 2: - return new Mob2(); - default: - return new MobCancer(); - } - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/game/mobs/Mob1.java b/src/main/java/fr/ynerant/leveleditor/game/mobs/Mob1.java deleted file mode 100644 index 611fcad..0000000 --- a/src/main/java/fr/ynerant/leveleditor/game/mobs/Mob1.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.ynerant.leveleditor.game.mobs; - -public class Mob1 extends Mob { - @Override - public int getMaxHP() { - return 2; - } - - @Override - public long getSlowness() { - return 60; - } - - @Override - public int getReward() { - return 10; - } - - @Override - public String getName() { - return "mob1"; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/game/mobs/Mob2.java b/src/main/java/fr/ynerant/leveleditor/game/mobs/Mob2.java deleted file mode 100644 index 750999f..0000000 --- a/src/main/java/fr/ynerant/leveleditor/game/mobs/Mob2.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.ynerant.leveleditor.game.mobs; - -public class Mob2 extends Mob { - @Override - public int getMaxHP() { - return 6; - } - - @Override - public long getSlowness() { - return 20; - } - - @Override - public int getReward() { - return 20; - } - - @Override - public String getName() { - return "mob2"; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/game/mobs/MobCancer.java b/src/main/java/fr/ynerant/leveleditor/game/mobs/MobCancer.java deleted file mode 100644 index d7571b0..0000000 --- a/src/main/java/fr/ynerant/leveleditor/game/mobs/MobCancer.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.ynerant.leveleditor.game.mobs; - -public class MobCancer extends Mob { - @Override - public int getMaxHP() { - return 50; - } - - @Override - public long getSlowness() { - return 100; - } - - @Override - public int getReward() { - return 100; - } - - @Override - public String getName() { - return "mobcancer"; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/game/towers/AutoTower.java b/src/main/java/fr/ynerant/leveleditor/game/towers/AutoTower.java deleted file mode 100644 index 28dc7c8..0000000 --- a/src/main/java/fr/ynerant/leveleditor/game/towers/AutoTower.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.ynerant.leveleditor.game.towers; - -import fr.ynerant.leveleditor.game.mobs.Mob; - -import java.util.Collection; - -public class AutoTower extends Tower { - public AutoTower(int x, int y) { - super(x, y); - } - - @Override - public String getName() { - return "autotower"; - } - - @Override - public int getDamagePerShot() { - return 20; - } - - @Override - public long getPeriod() { - return 10; - } - - @Override - public int getPrice() { - return 142; - } - - @Override - Collection _filterDetectedMobs(Collection mobs) { - return mobs; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/game/towers/BasicTower.java b/src/main/java/fr/ynerant/leveleditor/game/towers/BasicTower.java deleted file mode 100644 index 4099109..0000000 --- a/src/main/java/fr/ynerant/leveleditor/game/towers/BasicTower.java +++ /dev/null @@ -1,46 +0,0 @@ -package fr.ynerant.leveleditor.game.towers; - -import fr.ynerant.leveleditor.game.mobs.Mob; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public class BasicTower extends Tower { - public BasicTower(int x, int y) { - super(x, y); - } - - @Override - public String getName() { - return "basictower"; - } - - @Override - public int getDamagePerShot() { - return 1; - } - - @Override - public long getPeriod() { - return 5; - } - - @Override - public int getPrice() { - return 10; - } - - @Override - Collection _filterDetectedMobs(Collection mobs) { - List filtered = new ArrayList<>(); - - for (Mob mob : mobs) { - if ((mob.getX() == getX() || mob.getY() == getY()) - && Math.abs(mob.getX() - getX()) <= 3 && Math.abs(mob.getY() - getY()) <= 3) - filtered.add(mob); - } - - return filtered; - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/game/towers/NullTower.java b/src/main/java/fr/ynerant/leveleditor/game/towers/NullTower.java deleted file mode 100644 index 7f08fbd..0000000 --- a/src/main/java/fr/ynerant/leveleditor/game/towers/NullTower.java +++ /dev/null @@ -1,37 +0,0 @@ -package fr.ynerant.leveleditor.game.towers; - -import fr.ynerant.leveleditor.game.mobs.Mob; - -import java.util.ArrayList; -import java.util.Collection; - -public class NullTower extends Tower { - public NullTower(int x, int y) { - super(x, y); - } - - @Override - public String getName() { - return "nulltower"; - } - - @Override - public int getDamagePerShot() { - return Integer.MAX_VALUE; - } - - @Override - public long getPeriod() { - return 1; - } - - @Override - public int getPrice() { - return 5; - } - - @Override - Collection _filterDetectedMobs(Collection mobs) { - return new ArrayList<>(); - } -} diff --git a/src/main/java/fr/ynerant/leveleditor/game/towers/Tower.java b/src/main/java/fr/ynerant/leveleditor/game/towers/Tower.java deleted file mode 100644 index 619bf5d..0000000 --- a/src/main/java/fr/ynerant/leveleditor/game/towers/Tower.java +++ /dev/null @@ -1,57 +0,0 @@ -package fr.ynerant.leveleditor.game.towers; - -import fr.ynerant.leveleditor.api.editor.sprites.Sprite; -import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister; -import fr.ynerant.leveleditor.game.mobs.Mob; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Random; - -public abstract class Tower { - private final Sprite sprite; - private final int x; - private final int y; - private long remainingTicks; - - public Tower(int x, int y) { - this.sprite = SpriteRegister.getCategory(getName()).getSprites().get(0); - this.x = x; - this.y = y; - } - - private static final Random RANDOM = new Random(); - - public Sprite getSprite() { - return sprite; - } - - public abstract String getName(); - - public abstract int getDamagePerShot(); - - public abstract long getPeriod(); - - public abstract int getPrice(); - - abstract Collection _filterDetectedMobs(Collection mobs); - - public Collection filterDetectedMobs(Collection mobs) { - if (remainingTicks > 0) { - --remainingTicks; - return new ArrayList<>(); - } - else { - remainingTicks = getPeriod(); - return _filterDetectedMobs(mobs); - } - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } -} diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/Case.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/Case.scala new file mode 100644 index 0000000..79bbd9f --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/Case.scala @@ -0,0 +1,41 @@ +package fr.ynerant.leveleditor.api.editor + +import fr.ynerant.leveleditor.api.editor.Collision.Collision +import fr.ynerant.leveleditor.api.editor.sprites.Sprite + + +object Case { + def create(posX: Int, posY: Int, couche1: Sprite, couche2: Sprite, couche3: Sprite, collision: Collision): Case = { + val c = new Case + c.x = posX + c.y = posY + c.couche1 = couche1 + c.couche2 = couche2 + c.couche3 = couche3 + c.collision = collision + c + } +} + +class Case { + private var x = 0 + private var y = 0 + private var couche1 = null: Sprite + private var couche2 = null: Sprite + private var couche3 = null: Sprite + private var collision = null: Collision + + def getPosX: Int = x + + def getPosY: Int = y + + def getCoucheOne: Sprite = couche1 + + def getCoucheTwo: Sprite = couche2 + + def getCoucheThree: Sprite = couche3 + + def getCollision: Collision = collision + + override def toString: String = "{Case x=" + x + " y=" + y + " couche1=" + couche1 + " couche2=" + couche2 + " couche3=" + couche3 + " collision=" + collision.toString.toUpperCase + "}\n" +} diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/Collision.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/Collision.scala new file mode 100644 index 0000000..cacf513 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/Collision.scala @@ -0,0 +1,6 @@ +package fr.ynerant.leveleditor.api.editor + +object Collision extends Enumeration { + type Collision = Value + val FULL, PARTIAL, ANY = Value +} diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/EditorAPI.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/EditorAPI.scala new file mode 100644 index 0000000..baa02e4 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/EditorAPI.scala @@ -0,0 +1,160 @@ +package fr.ynerant.leveleditor.api.editor + +import java.awt.Color +import java.awt.image.BufferedImage +import java.io._ +import java.lang.reflect.Type +import java.nio.charset.StandardCharsets +import java.util +import java.util.zip.{GZIPInputStream, GZIPOutputStream} + +import com.google.gson.{Gson, GsonBuilder, JsonDeserializationContext, JsonDeserializer, JsonElement, JsonPrimitive, JsonSerializationContext, JsonSerializer} +import fr.ynerant.leveleditor.api.editor.Collision.Collision +import fr.ynerant.leveleditor.editor.Map +import javax.swing.JFileChooser +import javax.swing.filechooser.FileNameExtensionFilter + +object EditorAPI { + private var LAST_FILE = null: File + + def toRawMap(width: Int, height: Int): RawMap = { + val cases = new util.ArrayList[RawCase] + var y = 1 + while ( { + y < height + }) { + var x = 1 + while ( { + x < width + }) { + val c = RawCase.create(x / 16, y / 16, RawSprite.BLANK, RawSprite.BLANK, RawSprite.BLANK, Collision.ANY) + cases.add(c) + + x += 16 + } + + y += 16 + } + RawMap.create(cases, width, height) + } + + def createGson: Gson = { + val builder = new GsonBuilder + builder.registerTypeAdapter(classOf[Collision.Collision], new JsonDeserializer[Collision.Collision] { + override def deserialize(jsonElement: JsonElement, `type`: Type, jsonDeserializationContext: JsonDeserializationContext): Collision = Collision.withName(jsonElement.getAsString) + }) + builder.registerTypeAdapter(classOf[Collision.Collision], new JsonSerializer[Collision.Collision] { + override def serialize(t: Collision, `type`: Type, jsonSerializationContext: JsonSerializationContext): JsonElement = new JsonPrimitive(t.toString) + }) + builder.enableComplexMapKeySerialization + builder.serializeNulls + builder.setPrettyPrinting() + builder.create + } + + def createJFC: JFileChooser = { + val jfc = new JFileChooser + jfc.setFileFilter(new FileNameExtensionFilter("Fichiers monde (*.gmap, *.dat)", "gmap", "dat")) + jfc.setFileHidingEnabled(true) + jfc.setFileSelectionMode(JFileChooser.FILES_ONLY) + val dir = new File("maps") + assert(dir.isDirectory || dir.mkdirs) + jfc.setCurrentDirectory(dir) + jfc + } + + def saveAs(map: RawMap): Unit = { + val jfc = createJFC + var file = null: File + jfc.showSaveDialog(null) + file = jfc.getSelectedFile + if (file == null) return + if (!file.getName.toLowerCase.endsWith(".gmap") && !file.getName.toLowerCase.endsWith(".dat")) file = new File(file.getParentFile, file.getName + ".gmap") + LAST_FILE = file + save(file, map) + } + + def save(map: RawMap): Unit = { + if (LAST_FILE != null) save(LAST_FILE, map) + else saveAs(map) + } + + def save(file: File, map: RawMap): Unit = { + val json = createGson.toJson(map) + try { + assert(file.createNewFile) + val bos = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(file))) + bos.write(json.getBytes(StandardCharsets.UTF_8)) + bos.close() + } catch { + case ex: IOException => + ex.printStackTrace() + } + } + + def open: Map = { + val jfc = createJFC + var file = null: File + jfc.showOpenDialog(null) + file = jfc.getSelectedFile + if (file == null) return null + LAST_FILE = file + open(file) + } + + def getRawMap(f: File): RawMap = { + var json = null: String + try { + val gis = new GZIPInputStream(new BufferedInputStream(new FileInputStream(f))) + val bytes = new Array[Byte](512 * 1024) + var count = 0 + val text = new StringBuilder + while ( { + count = gis.read(bytes) + count != -1 + }) text.append(new String(bytes, 0, count, StandardCharsets.UTF_8)) + gis.close() + json = text.toString + } catch { + case e: IOException => + e.printStackTrace() + } + createGson.fromJson(json, classOf[RawMap]) + } + + def open(f: File): Map = open(getRawMap(f)) + + def open(map: RawMap): Map = { + if (map.getFont == null) { + val baseWidth = map.getWidth + val baseHeight = map.getHeight + val width = baseWidth + (baseWidth / 16) + 1 + val height = baseHeight + (baseHeight / 16) + 1 + val image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) + val g = image.createGraphics + g.setColor(Color.white) + g.fillRect(0, 0, width, height) + g.setColor(Color.black) + g.drawLine(0, 0, width, 0) + g.drawLine(0, 0, 0, height) + var x = 17 + while ( { + x <= width + }) { + g.drawLine(x, 0, x, height) + + x += 17 + } + var y = 17 + while ( { + y <= height + }) { + g.drawLine(0, y, width, y) + + y += 17 + } + map.setFont(image) + } + new Map(map) + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/RawCase.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawCase.scala new file mode 100644 index 0000000..79706b5 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawCase.scala @@ -0,0 +1,31 @@ +package fr.ynerant.leveleditor.api.editor + +import fr.ynerant.leveleditor.api.editor.Collision.Collision + +object RawCase { + def create(posX: Int, posY: Int, couche1: RawSprite, couche2: RawSprite, couche3: RawSprite, collision: Collision): RawCase = { + new RawCase(posX, posY, couche1, couche2, couche3, collision) + } + + def create(c: Case): RawCase = { + new RawCase(c.getPosX, c.getPosY, RawSprite.create(c.getCoucheOne), RawSprite.create(c.getCoucheTwo), RawSprite.create(c.getCoucheThree), c.getCollision) + } +} + +case class RawCase(var x: Int, var y: Int, var couche1: RawSprite, var couche2: RawSprite, var couche3: RawSprite, var collision: Collision) { + def getPosX: Int = x + + def getPosY: Int = y + + def getCoucheOne: RawSprite = couche1 + + def getCoucheTwo: RawSprite = couche2 + + def getCoucheThree: RawSprite = couche3 + + def getCollision: Collision = collision + + def setCollision(collision: Collision): Unit = { + this.collision = collision + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/RawMap.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawMap.scala new file mode 100644 index 0000000..2ebead2 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawMap.scala @@ -0,0 +1,60 @@ +package fr.ynerant.leveleditor.api.editor + +import fr.ynerant.leveleditor.editor.Map +import java.awt.image.BufferedImage +import java.util +import java.util.stream.Collectors + +import com.google.gson.Gson + + +object RawMap { + def create(cases: util.List[RawCase], width: Int, height: Int): RawMap = { + new RawMap(cases, width, height) + } + + def create(map: Map): RawMap = { + val raw = new RawMap(new util.ArrayList[RawCase], 0, 0) + raw.width = map.getWidth + raw.height = map.getHeight + raw.cases = new util.ArrayList[RawCase] + map.getAllCases.forEach(c => raw.cases.add(RawCase.create(c))) + raw + } +} + +case class RawMap(var cases: util.List[RawCase], var width: Int, var height: Int) { + private var cases_map = null: util.HashMap[Integer, RawCase] + private var font = null: BufferedImage + + def getCases: util.List[RawCase] = cases + + def getCase(x: Int, y: Int): RawCase = { + if (cases_map == null) { + cases_map = new util.HashMap[Integer, RawCase] + getCases.forEach(c => cases_map.put(c.getPosY * width + c.getPosX, c)) + } + cases_map.get(y * getWidth + x) + } + + def getNeighbours(c: RawCase): util.Collection[RawCase] = { + val list = new util.ArrayList[RawCase] + list.add(getCase(c.getPosX - 1, c.getPosY)) + list.add(getCase(c.getPosX, c.getPosY - 1)) + list.add(getCase(c.getPosX + 1, c.getPosY)) + list.add(getCase(c.getPosX, c.getPosY + 1)) + list.stream.filter((_c: RawCase) => _c != null && (_c.getCollision == Collision.ANY)).collect(Collectors.toList()) + } + + def getWidth: Int = width + + def getHeight: Int = height + + def getFont: BufferedImage = font + + def setFont(font: BufferedImage): Unit = { + this.font = font + } + + override def toString: String = new Gson().toJson(this) +} diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/RawSprite.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawSprite.scala new file mode 100644 index 0000000..b85f34f --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawSprite.scala @@ -0,0 +1,20 @@ +package fr.ynerant.leveleditor.api.editor + +import fr.ynerant.leveleditor.api.editor.sprites.Sprite + + +object RawSprite { + val BLANK = new RawSprite("blank", 0) + + def create(spr: Sprite): RawSprite = { + new RawSprite(spr.getCategory.getName, spr.getIndex) + } +} + +case class RawSprite(var category: String, protected var index: Int) { + if (category == null) category = "blank" + + def getCategory: String = category + + def getIndex: Int = index +} diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Category.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Category.scala new file mode 100644 index 0000000..c691993 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Category.scala @@ -0,0 +1,23 @@ +package fr.ynerant.leveleditor.api.editor.sprites + +import java.util + +object Category { + def create(name: String, sprites: util.List[Sprite]): Category = { + val c = new Category + c.name = name + c.sprites = sprites + c + } +} + +class Category private() { + private var sprites = null: util.List[Sprite] + private var name = null: String + + def getName: String = name + + def getSprites: util.List[Sprite] = sprites + + override def toString: String = name +} diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Sprite.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Sprite.scala new file mode 100644 index 0000000..8909732 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Sprite.scala @@ -0,0 +1,38 @@ +package fr.ynerant.leveleditor.api.editor.sprites + +import java.awt._ +import java.awt.image.BufferedImage +import java.util +import java.util.ArrayList + + +object Sprite { + val BLANK = new Sprite(new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB), Category.create("blank", new util.ArrayList[Sprite]), 0) + + val g: Graphics2D + = BLANK.getImage.createGraphics + g.setComposite(AlphaComposite.Clear) + g.setColor(new Color(0, true)) + g.fillRect(0, 0, 16, 16) + +} + +class Sprite(val img: BufferedImage, val cat: Category, val index: Int) { + if (!this.cat.getSprites.contains(this)) this.cat.getSprites.add(this) + + def getImage: BufferedImage = this.img + + def getCategory: Category = cat + + def getIndex: Int = index + + override def hashCode: Int = cat.hashCode ^ getIndex + + override def equals(o: Any): Boolean = { + if (!o.isInstanceOf[Sprite]) return false + val other = o.asInstanceOf[Sprite] + hashCode == other.hashCode + } + + override def toString: String = "{Sprite img=" + img + " cat=" + cat.getName + "}" +} diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.scala new file mode 100644 index 0000000..2c1559d --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.scala @@ -0,0 +1,108 @@ +package fr.ynerant.leveleditor.api.editor.sprites + +import java.io.{BufferedInputStream, BufferedReader, File, FileInputStream, IOException, InputStreamReader} +import java.net.{URISyntaxException, URLDecoder} +import java.nio.file.{Files, Paths} +import java.util +import java.util.Objects +import java.util.jar.JarFile + +import com.google.gson.Gson +import javax.imageio.ImageIO +import fr.ynerant.leveleditor.client.main.Main + +object SpriteRegister { + private var nameToCoords = null: util.Map[String, util.List[util.List[Double]]] + private val sprites = new util.HashMap[String, Category] + + @throws[IOException] + def unpack(): Unit = { + if (Main.isInDevelopmentMode) try { + val dir = new File(getClass.getResource("/assets").toURI) + unpackDir(dir) + } catch { + case e: URISyntaxException => + e.printStackTrace() + } + else { + @SuppressWarnings(Array("deprecation")) val path = URLDecoder.decode(getClass.getProtectionDomain.getCodeSource.getLocation.getPath, "UTF-8") + val jarFile = new File(path) + if (jarFile.isFile) { + val jar = new JarFile(jarFile) + val entries = jar.entries + while ( { + entries.hasMoreElements + }) { + val je = entries.nextElement + val name = je.getName + if (name.startsWith("assets/")) { + val f = new File(name) + if (name.endsWith("/")) if (!f.mkdirs && !f.isDirectory) throw new IOException("Unable to make dir: " + f) + else if (!f.isFile) Files.copy(jar.getInputStream(je), Paths.get(f.toURI)) + } + } + jar.close() + } + } + } + + @throws[IOException] + private def unpackDir(dir: File): Unit = { + for (f <- Objects.requireNonNull(dir.listFiles)) { + if (f.isDirectory) { + unpackDir(f) + } + else { + val path = f.getAbsolutePath.substring(f.getAbsolutePath.indexOf(File.separatorChar + "assets") + 1) + val local = new File(path) + assert(local.getParentFile.isDirectory || local.getParentFile.mkdirs) + assert(!local.exists || local.delete) + Files.copy(Paths.get(f.toURI), Paths.get(local.toURI)) + } + } + } + + @SuppressWarnings(Array("unchecked")) def refreshAllSprites(): Unit = { + if (nameToCoords != null && !nameToCoords.isEmpty && !sprites.isEmpty) return + val assetsDir = new File("assets") + val assets = new util.ArrayList[String] + for (dir <- Objects.requireNonNull(assetsDir.listFiles)) { + assets.add(dir.getName) + } + + assets.forEach(asset => { + try { + val f = new File(assetsDir.getAbsolutePath + "/" + asset + "/textures/sprites") + assert(f.isDirectory || f.mkdirs) + val br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(f, "sprites.json")))) + nameToCoords = new Gson().fromJson(br, classOf[util.Map[_, _]]) + br.close() + nameToCoords.keySet.forEach(key => { + try { + val is = new BufferedInputStream(new FileInputStream(new File(f, key + ".png"))) + val img = ImageIO.read(is) + val cat = Category.create(key, new util.ArrayList[Sprite]) + nameToCoords.get(key).forEach(list => { + val x = list.get(0).intValue + val y = list.get(1).intValue + val child = img.getSubimage(x, y, 16, 16) + new Sprite(child, cat, nameToCoords.get(key).indexOf(list)) + }) + sprites.put(key, cat) + } catch { + case t: Throwable => + System.err.println("Erreur lors de la lecture du sprite '" + key + "'") + t.printStackTrace() + } + }) + } catch { + case e: IOException => + e.printStackTrace() + } + }) + } + + def getCategory(name: String): Category = sprites.get(name) + + def getAllCategories = new util.ArrayList[Category](sprites.values) +} diff --git a/src/main/scala/fr/ynerant/leveleditor/client/main/Main.scala b/src/main/scala/fr/ynerant/leveleditor/client/main/Main.scala new file mode 100644 index 0000000..8fcc208 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/client/main/Main.scala @@ -0,0 +1,185 @@ +package fr.ynerant.leveleditor.client.main + +import fr.ynerant.leveleditor.api.editor.EditorAPI +import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister +import fr.ynerant.leveleditor.frame.MainFrame +import fr.ynerant.leveleditor.game.GameFrame +import javax.swing._ +import java.awt._ +import java.awt.image.BufferedImage +import java.io.File +import java.io.IOException +import java.net.URISyntaxException +import java.net.URL +import java.util.Locale + +import fr.ynerant.leveleditor.client.main.Main.DEV + + +/** + * Class principale qui lance le jeu + * + * @author ÿnérant + * @see #main(String...) + */ +object Main { + /** + * Variable disant si le jeu est lancé en développement ou non. + * + * @see #isInDevelopmentMode() + * @see #main(String...) + * @since 0.1-aplha + */ + private var DEV = false + + /** + * Accesseur disant si le jeu est lancé en développement ou non. + * + * @see #DEV + * @since 0.1-alpha + */ + def isInDevelopmentMode: Boolean = DEV + + /** + * @param args arguments du jeu. Possibilités :
    --edit lancera un éditeur
    --help lance l'aide affichant toutes les options possibles + * @see #launchEditMode() + * @since 0.1-alpha + */ + def main(args: Array[String]): Unit = { + System.setProperty("sun.java2d.noddraw", "true") + Locale.setDefault(Locale.FRANCE) + try UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName) + catch { + case e: Exception => + new ExceptionInInitializerError("Erreur lors du changement de 'look and feel'").printStackTrace() + System.err.print("Caused by ") + e.printStackTrace() + } + try { + new File(getClass.getResource("/assets").toURI) + DEV = true + } catch { + case t: Throwable => + DEV = false + } + + try SpriteRegister.unpack() + catch { + case e: IOException => + e.printStackTrace() + } + SpriteRegister.refreshAllSprites() + + launchFrame() + } + + private def checkJava(): Unit = { + if (GraphicsEnvironment.isHeadless) { + val ex = new HeadlessException("Impossible de lancer un jeu sans \u00e9cran !") + System.err.println("Cette application est un jeu, sans écran, elle aura du mal \u00e0 tourner ...") + ex.printStackTrace() + System.exit(1) + } + try classOf[Map[_, _]].getDeclaredMethod("getOrDefault", classOf[Any], classOf[Any]) + catch { + case ex: NoSuchMethodException => + ex.printStackTrace() + JOptionPane.showMessageDialog(null, "Cette application requiert Java 8.
La page de t\u00e9l\u00e9chargement va maintenant s'ouvrir.") + JOptionPane.showMessageDialog(null, "Si vous êtes certain que Java 8 est installé sur votre machine, assurez-vous qu'il n'y a pas de versions obsolètes de Java,
ou si vous êtes plus expérimentés si le path vers Java est bien défini vers la bonne version.") + try if (Desktop.isDesktopSupported) Desktop.getDesktop.browse(new URL("http://java.com/download").toURI) + else JOptionPane.showMessageDialog(null, "Votre machine ne supporte pas la classe Desktop, impossible d'ouvrir la page.
Rendez-vous y manuellement sur http://java.com/download pour installer Java.") + catch { + case e@(_: IOException | _: URISyntaxException) => + e.printStackTrace() + } + System.exit(1) + } + } + + /** + * Lance la fenêtre principale + * + * @see #main(String...) + * @see #launchEditMode() + */ + private def launchFrame(): Unit = { + MainFrame.getInstance.setVisible(true) + } + + /** + * Permet de lancer l'éditeur de carte + * + * @see #main(String...) + * @see #launchFrame() + * @since 0.1-aplha + */ + def launchEditMode: Boolean = { + System.out.println("Lancement de l'\u00e9diteur de monde ...") + var baseWidth = 0 + var baseHeight = 0 + var width = 0 + var height = 0 + while (baseWidth <= 0) { + try { + val baseWidthStr = JOptionPane.showInputDialog(null, "Veuillez entrez le nombre de cases longueur de votre carte (0 pour annuler) :") + if (baseWidthStr == null) return false + baseWidth = baseWidthStr.toInt * 16 + if (baseWidth < 0) throw new NumberFormatException + if (baseWidth == 0) return false + } catch { + case ignored: NumberFormatException => + + } + } + while (baseHeight <= 0) { + try { + val baseHeightStr = JOptionPane.showInputDialog("Veuillez entrez le nombre de cases hauteur de votre carte (0 pour annuler) :") + if (baseHeightStr == null) return false + baseHeight = baseHeightStr.toInt * 16 + if (baseHeight < 0) throw new NumberFormatException + if (baseHeight == 0) return false + } catch { + case ignored: NumberFormatException => + } + } + width = baseWidth + (baseWidth / 16) + 1 + height = baseHeight + (baseHeight / 16) + 1 + val image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) + val g = image.createGraphics + g.setColor(Color.white) + g.fillRect(0, 0, width, height) + g.setColor(Color.black) + g.drawLine(0, 0, width, 0) + g.drawLine(0, 0, 0, height) + var x = 17 + while ( { + x <= width + }) { + g.drawLine(x, 0, x, height) + + x += 17 + } + var y = 17 + while ( { + y <= height + }) { + g.drawLine(0, y, width, y) + + y += 17 + } + val rm = EditorAPI.toRawMap(baseWidth, baseHeight) + rm.setFont(image) + EditorAPI.open(rm) + true + } + + def launchGameMode: Boolean = { + println("Lancement du jeu ...") + val jfc = EditorAPI.createJFC + jfc.showOpenDialog(MainFrame.getInstance) + if (jfc.getSelectedFile == null) return false + val map = EditorAPI.getRawMap(jfc.getSelectedFile) + new GameFrame(map) + true + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/CollidPanel.scala b/src/main/scala/fr/ynerant/leveleditor/editor/CollidPanel.scala new file mode 100644 index 0000000..bead2dd --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/editor/CollidPanel.scala @@ -0,0 +1,64 @@ +package fr.ynerant.leveleditor.editor + +import fr.ynerant.leveleditor.api.editor.Collision +import javax.swing._ +import java.awt._ +import java.awt.image.BufferedImage + + +@SerialVersionUID(-138754019431984881L) +object CollidPanel { + def isEmpty(image: BufferedImage): Boolean = { + var allrgba = 0 + for (x <- 0 until image.getWidth) { + for (y <- 0 until image.getHeight) { + allrgba += image.getRGB(x, y) + 1 + } + } + allrgba == 0 + } +} + +@SerialVersionUID(-138754019431984881L) +class CollidPanel(val frame: EditorFrame) extends JPanel { + def getMap: Map = frame.getMap + + override def paintComponent(g: Graphics): Unit = { + g.fillRect(0, 0, getWidth, getHeight) + val img = getMap.getFont + val x = getWidth / 2 - img.getWidth + val y = getHeight / 2 - img.getHeight + val width = img.getWidth * 2 + val height = img.getHeight * 2 + g.drawImage(getMap.getFont, x, y, width, height, null) + getMap.getAllCases.forEach(c => { + if (!CollidPanel.isEmpty(c.getCoucheOne.getImage)) { + g.drawImage(c.getCoucheOne.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) + if (!CollidPanel.isEmpty(c.getCoucheTwo.getImage)) { + g.drawImage(c.getCoucheTwo.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) + if (!CollidPanel.isEmpty(c.getCoucheThree.getImage)) + g.drawImage(c.getCoucheThree.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) + } + } + }) + + getMap.getAllCases.forEach(c => { + if (c.getCollision ne Collision.ANY) { + val alpha = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB) + if (c.getCollision eq Collision.FULL) { + val grap = alpha.createGraphics + grap.setColor(new Color(0, 0, 0, 100)) + grap.fillRect(0, 0, 16, 16) + grap.dispose() + } + else if (c.getCollision eq Collision.PARTIAL) { + val grap = alpha.createGraphics + grap.setColor(new Color(255, 0, 255, 70)) + grap.fillRect(0, 0, 16, 16) + grap.dispose() + } + g.drawImage(alpha, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) + } + }) + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala b/src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala new file mode 100644 index 0000000..bbbe6f8 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala @@ -0,0 +1,248 @@ +package fr.ynerant.leveleditor.editor + +import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister +import fr.ynerant.leveleditor.frame.listeners._ +import javax.swing._ +import javax.swing.event.ChangeEvent +import javax.swing.event.ChangeListener +import java.awt._ +import java.awt.event._ +import java.io.File + +import fr.ynerant.leveleditor.api.editor.{EditorAPI, RawMap} + + +@SerialVersionUID(-2705122356101556462L) +class EditorFrame(val map: Map) extends JFrame("Level Editor") with ChangeListener with ActionListener with WindowListener { + final private val save = new JMenuItem("Sauvegarder") + final private val saveAs = new JMenuItem("Sauvegarder sous ...") + final private val exit = new JMenuItem("Quitter") + final private val pen = new JRadioButtonMenuItem("Pinceau") + final private val pot = new JRadioButtonMenuItem("Pot de peinture") + final private val tabs = new JTabbedPane + final private var tabColl = null: CollidPanel + final private var mapPanel = null: MapPanel + final private val resources = new JTabbedPane + final private val couche1 = new JPanel + final private val couche2 = new JPanel + final private val couche3 = new JPanel + final private[editor] val group = new ButtonGroup + private var selectedSprite = null: SpriteComp + + this.setSize(600, 600) + this.setPreferredSize(getSize) + this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE) + this.setExtendedState(Frame.MAXIMIZED_BOTH) + this.setLocationRelativeTo(null) + this.addWindowListener(this) + val content = new JPanel + content.setLayout(new BorderLayout) + this.setContentPane(content) + this.setVisible(true) + this.setVisible(false) + val fichier = new JMenu("Fichier") + fichier.setMnemonic(KeyEvent.VK_F + KeyEvent.VK_ALT) + val nouveau = new JMenuItem("Nouveau") + nouveau.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.VK_CONTROL, true)) + nouveau.addActionListener(new CreateMapListener) + fichier.add(nouveau) + val open = new JMenuItem("Ouvrir") + open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.VK_CONTROL, true)) + open.addActionListener(new OpenMapListener) + fichier.add(open) + fichier.addSeparator() + save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.VK_CONTROL, true)) + save.addActionListener(this) + fichier.add(save) + saveAs.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.VK_CONTROL + KeyEvent.VK_SHIFT, true)) + saveAs.addActionListener(this) + fichier.add(saveAs) + fichier.addSeparator() + exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.VK_CONTROL, true)) + exit.addActionListener(this) + fichier.add(exit) + val bar: JMenuBar = new JMenuBar + bar.add(fichier) + pen.setSelected(true) + pen.addActionListener(this) + pot.addActionListener(this) + group.add(pen) + group.add(pot) + val selectionMode = new JMenu("Mode de s\u00e9lection") + selectionMode.add(pen) + selectionMode.add(pot) + val tools = new JMenu("Outils") + tools.setMnemonic(KeyEvent.VK_O + KeyEvent.VK_ALT) + tools.add(selectionMode) + bar.add(tools) + this.setJMenuBar(bar) + mapPanel = new MapPanel(this) + mapPanel.addMouseListener(new MapMouseListener(mapPanel, this)) + mapPanel.addMouseMotionListener(new MapMouseListener(mapPanel, this)) + tabColl = new CollidPanel(this) + tabColl.addMouseListener(new CollidMapMouseListener(tabColl, this)) + tabColl.addMouseMotionListener(new CollidMapMouseListener(tabColl, this)) + val scrollMap = new JScrollPane(mapPanel) + scrollMap.getHorizontalScrollBar.setUnitIncrement(34) + scrollMap.getVerticalScrollBar.setUnitIncrement(34) + val scrollCollidMap = new JScrollPane(tabColl) + scrollCollidMap.getHorizontalScrollBar.setUnitIncrement(34) + scrollCollidMap.getVerticalScrollBar.setUnitIncrement(34) + tabs.addTab("Carte", scrollMap) + val tabEvents = new JPanel + tabs.addTab("\u00c9vennments", new JScrollPane(tabEvents)) + tabs.addTab("Collisions", scrollCollidMap) + tabs.addChangeListener(this) + content.add(tabs, BorderLayout.CENTER) + couche1.setLayout(new WrapLayout(FlowLayout.LEFT)) + couche2.setLayout(new WrapLayout(FlowLayout.LEFT)) + couche3.setLayout(new WrapLayout(FlowLayout.LEFT)) + val scroll1 = new JScrollPane(couche1, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) + val scroll2 = new JScrollPane(couche2, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) + val scroll3 = new JScrollPane(couche3, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) + scroll1.getHorizontalScrollBar.setMaximum(0) + scroll2.getHorizontalScrollBar.setMaximum(0) + scroll3.getHorizontalScrollBar.setMaximum(0) + resources.addTab("", new ImageIcon(new File("assets/leveleditor/textures/layer 1.png").getAbsolutePath), scroll1) + resources.addTab("", new ImageIcon(new File("assets/leveleditor/textures/layer 2.png").getAbsolutePath), scroll2) + resources.addTab("", new ImageIcon(new File("assets/leveleditor/textures/layer 3.png").getAbsolutePath), scroll3) + resources.addChangeListener(this) + resources.setBackgroundAt(0, Color.white) + resources.setBackgroundAt(1, Color.white) + resources.setBackgroundAt(2, Color.white) + content.add(resources, BorderLayout.EAST) + resize() + drawResources() + revalidate() + repaint() + + private def drawResources(): Unit = { + couche1.removeAll() + couche2.removeAll() + couche3.removeAll() + if (couche1.getComponents.length > 0) return + if (couche1.getWidth == 0 || couche2.getWidth == 0 || couche3.getWidth == 0) { + couche1.repaint() + couche2.repaint() + couche3.repaint() + } + SpriteRegister.getAllCategories.forEach(cat => { + cat.getSprites.forEach(spr => { + val sprc1 = new SpriteComp(spr, 0) + val sprc2 = new SpriteComp(spr, 1) + val sprc3 = new SpriteComp(spr, 2) + sprc1.addMouseListener(new SpriteMouseListener(sprc1, this)) + sprc2.addMouseListener(new SpriteMouseListener(sprc2, this)) + sprc3.addMouseListener(new SpriteMouseListener(sprc3, this)) + couche1.add(sprc1) + couche2.add(sprc2) + couche3.add(sprc3) + }) + }) + couche1.revalidate() + couche2.revalidate() + couche3.revalidate() + couche1.repaint() + couche2.repaint() + couche3.repaint() + } + + def resize(): Unit = { + val cursorPos = resources.getSelectedComponent.asInstanceOf[JScrollPane].getVerticalScrollBar.getValue + tabs.setPreferredSize(new Dimension(getWidth, getHeight / 5)) + tabs.setLocation(0, 0) + val img = getMap.getFont + val width = img.getWidth * 2 + val height = img.getHeight * 2 + mapPanel.setPreferredSize(new Dimension(width, height)) + mapPanel.setLocation(0, getHeight / 5) + tabColl.setPreferredSize(new Dimension(width, height)) + tabColl.setLocation(0, getHeight / 5) + resources.setPreferredSize(new Dimension(getWidth / 4 - 15, getHeight / 5 * 4 - 40)) + resources.setLocation(getWidth / 4 * 3, getHeight / 5) + val scroll1 = resources.getComponent(0).asInstanceOf[JScrollPane] + val scroll2 = resources.getComponent(1).asInstanceOf[JScrollPane] + val scroll3 = resources.getComponent(2).asInstanceOf[JScrollPane] + scroll1.getHorizontalScrollBar.setMaximum(0) + scroll2.getHorizontalScrollBar.setMaximum(0) + scroll3.getHorizontalScrollBar.setMaximum(0) + drawResources() + resources.getSelectedComponent.asInstanceOf[JScrollPane].getVerticalScrollBar.setValue(cursorPos) + } + + def getMap: Map = map + + def getSelectedSprite: SpriteComp = selectedSprite + + def setSelectedSprite(sprite: SpriteComp): Unit = { + this.selectedSprite = sprite + } + + override def stateChanged(event: ChangeEvent): Unit = { + if (event.getSource eq resources) { + if (getSelectedLayerIndex == 0) { + resources.setBackgroundAt(0, Color.white) + resources.setBackgroundAt(1, Color.white) + resources.setBackgroundAt(2, Color.white) + } + else if (getSelectedLayerIndex == 1) { + resources.setBackgroundAt(0, Color.black) + resources.setBackgroundAt(1, Color.white) + resources.setBackgroundAt(2, Color.white) + } + else if (getSelectedLayerIndex == 2) { + resources.setBackgroundAt(0, Color.black) + resources.setBackgroundAt(1, Color.black) + resources.setBackgroundAt(2, Color.white) + } + repaint() + } + else if (event.getSource eq tabs) { + resources.setEnabled(tabs.getSelectedIndex == 0) + couche1.setEnabled(resources.isEnabled) + couche2.setEnabled(resources.isEnabled) + couche3.setEnabled(resources.isEnabled) + repaint() + } + } + + def getSelectedLayerIndex: Int = resources.getSelectedIndex + + override def actionPerformed(event: ActionEvent): Unit = { + if (event.getSource eq save) EditorAPI.save(RawMap.create(map)) + else if (event.getSource eq saveAs) EditorAPI.saveAs(RawMap.create(map)) + else if (event.getSource eq exit) { + val result = JOptionPane.showConfirmDialog(null, "Voulez-vous sauvegarder votre carte avant de quitter ? Toute modification sera perdue", "Confirmation", JOptionPane.YES_NO_CANCEL_OPTION) + if (result == 0) save.doClick() + if (result != 2) dispose() + } + } + + def getSelectedPaintingMode: Int = if (pen.isSelected) 0 + else if (pot.isSelected) 1 + else -1 + + override def windowActivated(event: WindowEvent): Unit = { + } + + override def windowClosed(event: WindowEvent): Unit = { + } + + override def windowClosing(event: WindowEvent): Unit = { + val result = JOptionPane.showConfirmDialog(null, "Voulez-vous sauvegarder avant de quitter ?", "Confirmation", JOptionPane.YES_NO_CANCEL_OPTION) + if (result == 0) EditorAPI.save(RawMap.create(map)) + if (result != 2) dispose() + } + + override def windowDeactivated(event: WindowEvent): Unit = { + } + + override def windowDeiconified(event: WindowEvent): Unit = { + } + + override def windowIconified(event: WindowEvent): Unit = { + } + + override def windowOpened(event: WindowEvent): Unit = { + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/Map.scala b/src/main/scala/fr/ynerant/leveleditor/editor/Map.scala new file mode 100644 index 0000000..75bd2c7 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/editor/Map.scala @@ -0,0 +1,60 @@ +package fr.ynerant.leveleditor.editor + +import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister +import java.awt.image.BufferedImage +import java.util + +import fr.ynerant.leveleditor.api.editor.{Case, RawMap} + + +object Map { + private var cases = null: util.ArrayList[Case] +} + +class Map(val raw: RawMap) { + final private var frame = null: EditorFrame + final private var width = 0 + final private var height = 0 + final private val casesMap = new util.HashMap[Integer, util.Map[Integer, Case]] + final private var font = null: BufferedImage + + Map.cases = new util.ArrayList[Case] + this.width = raw.getWidth + this.height = raw.getHeight + this.font = raw.getFont + + raw.getCases.forEach(rc => + Map.cases.add(Case.create(rc.getPosX, rc.getPosY, SpriteRegister.getCategory(rc.getCoucheOne.getCategory).getSprites.get(rc.getCoucheOne.getIndex), SpriteRegister.getCategory(rc.getCoucheTwo.getCategory).getSprites.get(rc.getCoucheTwo.getIndex), SpriteRegister.getCategory(rc.getCoucheThree.getCategory).getSprites.get(rc.getCoucheThree.getIndex), rc.getCollision)) + ) + + reorganizeMap() + frame = new EditorFrame(this) + getFrame.setVisible(true) + + def getFrame: EditorFrame = frame + + def getWidth: Int = width + + def getHeight: Int = height + + def getCase(x: Int, y: Int): Case = casesMap.getOrDefault(x, new util.HashMap[Integer, Case]).get(y) + + def setCase(x: Int, y: Int, c: Case): Unit = { + casesMap.get(x).put(y, c) + } + + def getFont: BufferedImage = font + + private def reorganizeMap(): Unit = { + for (i <- 0 until width) { + casesMap.put(i, new util.HashMap[Integer, Case]) + } + Map.cases.forEach(c => setCase(c.getPosX, c.getPosY, c)) + } + + def getAllCases: util.List[Case] = { + val list = new util.ArrayList[Case] + casesMap.values.forEach(l => list.addAll(l.values())) + list + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/MapPanel.scala b/src/main/scala/fr/ynerant/leveleditor/editor/MapPanel.scala new file mode 100644 index 0000000..421b3b8 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/editor/MapPanel.scala @@ -0,0 +1,49 @@ +package fr.ynerant.leveleditor.editor + +import javax.swing._ +import java.awt._ +import java.awt.image.BufferedImage + + +@SerialVersionUID(2629019576253690557L) +class MapPanel(val frame: EditorFrame) extends JPanel { + def getMap: Map = frame.getMap + + override def paintComponent(g: Graphics): Unit = { + g.fillRect(0, 0, getWidth, getHeight) + val img = getMap.getFont + val x = getWidth / 2 - img.getWidth + val y = getHeight / 2 - img.getHeight + val width = img.getWidth * 2 + val height = img.getHeight * 2 + g.drawImage(getMap.getFont, x, y, width, height, null) + getMap.getAllCases.forEach(c => { // BufferedImage image; + if (!isEmpty(c.getCoucheOne.getImage)) g.drawImage(c.getCoucheOne.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) + /* if (frame.getSelectedLayerIndex() != 0) + { + image = recalculateAplha(c.getCoucheOne().getImage(), 0); + g.drawImage(image, x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); + }*/ if (!isEmpty(c.getCoucheTwo.getImage) && frame.getSelectedLayerIndex >= 1) g.drawImage(c.getCoucheTwo.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) + /* if (frame.getSelectedLayerIndex() != 1) + { + image = recalculateAplha(c.getCoucheTwo().getImage(), 1); + g.drawImage(image, x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); + }*/ if (!isEmpty(c.getCoucheThree.getImage) && frame.getSelectedLayerIndex == 2) g.drawImage(c.getCoucheThree.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) + /* if (frame.getSelectedLayerIndex() != 2) + { + image = recalculateAplha(c.getCoucheThree().getImage(), 2); + g.drawImage(image, x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); + }*/ + }) + } + + @SuppressWarnings(Array("BooleanMethodIsAlwaysInverted")) private def isEmpty(image: BufferedImage) = { + var allrgba = 0 + for (x <- 0 until image.getWidth) { + for (y <- 0 until image.getHeight) { + allrgba += image.getRGB(x, y) + 1 + } + } + allrgba == 0 + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/SpriteComp.scala b/src/main/scala/fr/ynerant/leveleditor/editor/SpriteComp.scala new file mode 100644 index 0000000..1fb0e15 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/editor/SpriteComp.scala @@ -0,0 +1,40 @@ +package fr.ynerant.leveleditor.editor + +import fr.ynerant.leveleditor.api.editor.sprites.Sprite +import javax.swing._ +import java.awt._ + + +@SerialVersionUID(-6512257366877053285L) +class SpriteComp(val sprite: Sprite, val couche: Int) extends JComponent { + this.setMinimumSize(new Dimension(32, 32)) + this.setMaximumSize(new Dimension(32, 32)) + this.setPreferredSize(new Dimension(32, 32)) + this.setSize(new Dimension(32, 32)) + repaint() + private var selected = false + + def getSprite: Sprite = sprite + + def getCouche: Int = couche + + def isSelected: Boolean = selected + + def setSelected(selected: Boolean): Unit = { + this.selected = selected + } + + override def paintComponent(g: Graphics): Unit = { + super.paintComponent(g) + g.setColor(Color.white) + g.fillRect(0, 0, getWidth, getHeight) + g.drawImage(sprite.getImage, 0, 0, 32, 32, Color.white, null) + if (isSelected) { + g.setColor(Color.black) + g.drawLine(0, 0, getWidth - 1, 0) + g.drawLine(0, 0, 0, getHeight - 1) + g.drawLine(0, getHeight - 1, getWidth - 1, getHeight - 1) + g.drawLine(getWidth - 1, 0, getWidth - 1, getHeight - 1) + } + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/WrapLayout.scala b/src/main/scala/fr/ynerant/leveleditor/editor/WrapLayout.scala new file mode 100644 index 0000000..5cf84ea --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/editor/WrapLayout.scala @@ -0,0 +1,58 @@ +package fr.ynerant.leveleditor.editor + +import javax.swing._ +import java.awt._ + + +@SerialVersionUID(8777237960365591646L) +class WrapLayout(val alignment: Int) extends FlowLayout(alignment) { + override def preferredLayoutSize(target: Container): Dimension = layoutSize(target, preferred = true) + + override def minimumLayoutSize(target: Container): Dimension = { + val minimum = layoutSize(target, preferred = false) + minimum.width -= (getHgap + 1) + minimum + } + + private def layoutSize(target: Container, preferred: Boolean) = { + var targetWidth = target.getSize.width + if (targetWidth == 0) targetWidth = Integer.MAX_VALUE + val hgap = getHgap + val vgap = getVgap + val insets = target.getInsets + val horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2) + val maxWidth = targetWidth - horizontalInsetsAndGap + val dim = new Dimension(0, 0) + var rowWidth = 0 + var rowHeight = 0 + val nmembers = target.getComponentCount + for (i <- 0 until nmembers) { + val m = target.getComponent(i) + if (m.isVisible) { + val d = if (preferred) m.getPreferredSize + else m.getMinimumSize + if (rowWidth + d.width > maxWidth) { + addRow(dim, rowWidth, rowHeight) + rowWidth = 0 + rowHeight = 0 + } + if (rowWidth != 0) rowWidth += hgap + rowWidth += d.width + rowHeight = Math.max(rowHeight, d.height) + } + } + addRow(dim, rowWidth, rowHeight) + dim.width += horizontalInsetsAndGap + dim.height += insets.top + insets.bottom + vgap * 2 + val scrollPane = SwingUtilities.getAncestorOfClass(classOf[JScrollPane], target) + if (scrollPane != null) dim.width -= (hgap + 1) + dim + + } + + private def addRow(dim: Dimension, rowWidth: Int, rowHeight: Int): Unit = { + dim.width = Math.max(dim.width, rowWidth) + if (dim.height > 0) dim.height += getVgap + dim.height += rowHeight + } +} \ No newline at end of file diff --git a/src/main/scala/fr/ynerant/leveleditor/frame/MainFrame.scala b/src/main/scala/fr/ynerant/leveleditor/frame/MainFrame.scala new file mode 100644 index 0000000..4a28a79 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/frame/MainFrame.scala @@ -0,0 +1,89 @@ +package fr.ynerant.leveleditor.frame + +import fr.ynerant.leveleditor.frame.listeners.ChangeLAFListener +import fr.ynerant.leveleditor.frame.listeners.CreateMapListener +import fr.ynerant.leveleditor.frame.listeners.OpenMapListener +import javax.swing._ +import java.awt._ +import java.awt.event.{ActionEvent, KeyEvent} + +import fr.ynerant.leveleditor.client.main.Main + + +/** + * Fenêtre principale du jeu + * + * @author ÿnérant + */ +@SerialVersionUID(-3168760121879418534L) +object MainFrame { + /** + * Instance unique principale + * + * @see #MainFrame() + * @see #getInstance() + */ + private var INSTANCE = null: MainFrame + + /** + * Cet accesseur renvoie l'accesseur unique de la classe + * + * @return l'instance unique de la classe + * @see #INSTANCE + * @see #MainFrame() + */ + def getInstance: MainFrame = { + if (INSTANCE == null) INSTANCE = new MainFrame + INSTANCE + } +} + +@SerialVersionUID(-3168760121879418534L) +class MainFrame @SuppressWarnings(Array("JavadocReference")) private() + +/** + * Constructeur + * + * @see Main#launchFrame() + */ + extends JFrame { + println("Initialisation de la fen\u00eatre") + this.setTitle("Level Editor") + this.setPreferredSize(new Dimension(1000, 800)) + this.setSize(800, 700) + this.setLocationRelativeTo(null) + this.setExtendedState(Frame.MAXIMIZED_BOTH) + this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) + val fichier = new JMenu("Fichier") + fichier.setMnemonic(KeyEvent.VK_F + KeyEvent.VK_ALT) + val display = new JMenu("Affichage") + display.setMnemonic(KeyEvent.VK_A + KeyEvent.VK_ALT) + val createMap = new JMenuItem("Cr\u00e9er") + createMap.addActionListener(new CreateMapListener) + val editMaps = new JMenu("Cartes") + editMaps.add(createMap) + val openMap = new JMenuItem("Ouvrir") + openMap.addActionListener(new OpenMapListener) + editMaps.add(openMap) + fichier.add(editMaps) + val systemLAF = new JMenuItem("Apparence syst\u00e8me") + systemLAF.addActionListener(new ChangeLAFListener(systemLAF, this)) + val changeLAF = new JMenu("Modfier l'apparence") + changeLAF.add(systemLAF) + val javaLAF = new JMenuItem("Apparence Java") + javaLAF.addActionListener(new ChangeLAFListener(javaLAF, this)) + changeLAF.add(javaLAF) + val darkLAF = new JMenuItem("Apparence sombre") + darkLAF.addActionListener(new ChangeLAFListener(darkLAF, this)) + changeLAF.add(darkLAF) + display.add(changeLAF) + val bar = new JMenuBar + bar.add(fichier) + bar.add(display) + this.setJMenuBar(bar) + val start = new JButton("Commencer la partie !") + start.addActionListener((actionEvent: ActionEvent) => { + if (Main.launchGameMode) MainFrame.getInstance.dispose() + }) + this.setContentPane(start) +} diff --git a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/ChangeLAFListener.scala b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/ChangeLAFListener.scala new file mode 100644 index 0000000..d11391d --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/ChangeLAFListener.scala @@ -0,0 +1,41 @@ +package fr.ynerant.leveleditor.frame.listeners + +import javax.swing._ +import java.awt.event.ActionEvent +import java.awt.event.ActionListener + + +class ChangeLAFListener(val item: JMenuItem, val frame: JFrame) extends ActionListener { + override def actionPerformed(event: ActionEvent): Unit = { + if (item.getText.toLowerCase.contains("sys")) { + try UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName) + catch { + case e: Exception => + new ExceptionInInitializerError("Erreur lors du changement de 'look and feel'").printStackTrace() + System.err.print("Caused by ") + e.printStackTrace() + } + SwingUtilities.updateComponentTreeUI(frame) + } + else if (item.getText.toLowerCase.contains("java")) { + try UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName) + catch { + case e: Exception => + new ExceptionInInitializerError("Erreur lors du changement de 'look and feel'").printStackTrace() + System.err.print("Caused by ") + e.printStackTrace() + } + SwingUtilities.updateComponentTreeUI(frame) + } + else if (item.getText.toLowerCase.contains("sombre")) { + try UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel") + catch { + case e: Exception => + new ExceptionInInitializerError("Erreur lors du changement de 'look and feel'").printStackTrace() + System.err.print("Caused by ") + e.printStackTrace() + } + SwingUtilities.updateComponentTreeUI(frame) + } + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.scala b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.scala new file mode 100644 index 0000000..a6cb33c --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.scala @@ -0,0 +1,28 @@ +package fr.ynerant.leveleditor.frame.listeners + +import fr.ynerant.leveleditor.api.editor.{Case, Collision} +import java.awt.event.MouseAdapter +import java.awt.event.MouseEvent + +import fr.ynerant.leveleditor.editor.{CollidPanel, EditorFrame} + + +class CollidMapMouseListener(val panel: CollidPanel, val frame: EditorFrame) extends MouseAdapter { + def getFrame: EditorFrame = frame + + override def mouseReleased(event: MouseEvent): Unit = { + val map = getFrame.getMap + val x = panel.getWidth / 2 - map.getFont.getWidth + val y = panel.getHeight / 2 - map.getFont.getHeight + val c = map.getCase((event.getX - x + 2) / 34, (event.getY - y + 2) / 34) + if (c != null && event.getX - x >= 2 && event.getY - y >= 2) { + val colIndex = c.getCollision.id + var newColIndex = colIndex + 1 + if (newColIndex >= Collision.values.size) newColIndex = 0 + val col = Collision.apply(newColIndex) + val n = Case.create(c.getPosX, c.getPosY, c.getCoucheOne, c.getCoucheTwo, c.getCoucheThree, col) + map.setCase((event.getX - x + 2) / 34, (event.getY - y + 2) / 34, n) + panel.repaint() + } + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CreateMapListener.scala b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CreateMapListener.scala new file mode 100644 index 0000000..b4f251c --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CreateMapListener.scala @@ -0,0 +1,19 @@ +package fr.ynerant.leveleditor.frame.listeners + +import java.awt.event.ActionEvent +import java.awt.event.ActionListener + +import fr.ynerant.leveleditor.client.main.Main +import fr.ynerant.leveleditor.frame.MainFrame + + +/** + * @author ÿnérant + */ +class CreateMapListener extends ActionListener { + /* !CodeTemplates.overridecomment.nonjd! + * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) + */ override def actionPerformed(event: ActionEvent): Unit = { + if (Main.launchEditMode) MainFrame.getInstance.dispose() + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.scala b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.scala new file mode 100644 index 0000000..099078e --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.scala @@ -0,0 +1,69 @@ +package fr.ynerant.leveleditor.frame.listeners + +import java.awt.event.MouseAdapter +import java.awt.event.MouseEvent + +import fr.ynerant.leveleditor.api.editor.Case +import fr.ynerant.leveleditor.editor.{EditorFrame, MapPanel} + + +class MapMouseListener(val panel: MapPanel, val frame: EditorFrame) extends MouseAdapter { + def getFrame: EditorFrame = frame + + override def mouseClicked(event: MouseEvent): Unit = { + if (frame.getSelectedPaintingMode == 0) { + val map = getFrame.getMap + val x = panel.getWidth / 2 - map.getFont.getWidth + val y = panel.getHeight / 2 - map.getFont.getHeight + val c = map.getCase((event.getX - x + 2) / 34, (event.getY - y + 2) / 34): Case + if (c != null && event.getX - x >= 2 && event.getY - y >= 2) if (getFrame.getSelectedSprite != null) { + var n = null: Case + getFrame.getSelectedSprite.getCouche match { + case 0 => + n = Case.create(c.getPosX, c.getPosY, getFrame.getSelectedSprite.getSprite, c.getCoucheTwo, c.getCoucheThree, c.getCollision) + + case 1 => + n = Case.create(c.getPosX, c.getPosY, c.getCoucheOne, getFrame.getSelectedSprite.getSprite, c.getCoucheThree, c.getCollision) + + case 2 => + n = Case.create(c.getPosX, c.getPosY, c.getCoucheOne, c.getCoucheTwo, getFrame.getSelectedSprite.getSprite, c.getCollision) + + case _ => + n = c + + } + map.setCase(n.getPosX, n.getPosY, n) + panel.repaint() + } + } + else if (frame.getSelectedPaintingMode == 1) { + getFrame.getMap.getAllCases.forEach(c => { + val map = getFrame.getMap + if (getFrame.getSelectedSprite != null) { + if (getFrame.getSelectedSprite.getCouche - 1 > getFrame.getSelectedLayerIndex) return + var n = null: Case + getFrame.getSelectedSprite.getCouche match { + case 0 => + n = Case.create(c.getPosX, c.getPosY, getFrame.getSelectedSprite.getSprite, c.getCoucheTwo, c.getCoucheThree, c.getCollision) + + case 1 => + n = Case.create(c.getPosX, c.getPosY, c.getCoucheOne, getFrame.getSelectedSprite.getSprite, c.getCoucheThree, c.getCollision) + + case 2 => + n = Case.create(c.getPosX, c.getPosY, c.getCoucheOne, c.getCoucheTwo, getFrame.getSelectedSprite.getSprite, c.getCollision) + + case _ => + n = c + + } + map.setCase(n.getPosX, n.getPosY, n) + } + }) + panel.repaint() + } + } + + override def mouseDragged(event: MouseEvent): Unit = { + if (frame.getSelectedPaintingMode == 0) mouseClicked(event) + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/OpenMapListener.scala b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/OpenMapListener.scala new file mode 100644 index 0000000..f5ef165 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/OpenMapListener.scala @@ -0,0 +1,16 @@ +package fr.ynerant.leveleditor.frame.listeners + +import java.awt.event.ActionEvent +import java.awt.event.ActionListener + +import fr.ynerant.leveleditor.api.editor.EditorAPI +import fr.ynerant.leveleditor.frame.MainFrame + + +class OpenMapListener extends ActionListener { + /* !CodeTemplates.overridecomment.nonjd! + * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) + */ override def actionPerformed(event: ActionEvent): Unit = { + if (EditorAPI.open != null) MainFrame.getInstance.dispose() + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/SpriteMouseListener.scala b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/SpriteMouseListener.scala new file mode 100644 index 0000000..344d113 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/SpriteMouseListener.scala @@ -0,0 +1,19 @@ +package fr.ynerant.leveleditor.frame.listeners + +import java.awt.event.MouseAdapter +import java.awt.event.MouseEvent + +import fr.ynerant.leveleditor.editor.{EditorFrame, SpriteComp} + + +class SpriteMouseListener(val sprite: SpriteComp, val frame: EditorFrame) extends MouseAdapter { + override def mouseReleased(event: MouseEvent): Unit = { + if (frame.getSelectedSprite != null) { + frame.getSelectedSprite.setSelected(false) + frame.getSelectedSprite.repaint() + } + frame.setSelectedSprite(sprite) + sprite.setSelected(true) + sprite.repaint() + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala new file mode 100644 index 0000000..f244593 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala @@ -0,0 +1,193 @@ +package fr.ynerant.leveleditor.game + +import fr.ynerant.leveleditor.api.editor.{Collision, RawMap} +import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister +import fr.ynerant.leveleditor.game.mobs.Mob +import fr.ynerant.leveleditor.game.towers.AutoTower +import fr.ynerant.leveleditor.game.towers.BasicTower +import fr.ynerant.leveleditor.game.towers.NullTower +import fr.ynerant.leveleditor.game.towers.Tower +import javax.swing._ +import java.awt._ +import java.awt.event.MouseEvent +import java.awt.event.MouseListener +import java.util +import java.util.Random + +import fr.ynerant.leveleditor.editor.CollidPanel + + +class GameFrame(val map: RawMap) extends JFrame("Jeu") { + final private val RANDOM = new Random + private var round = 0 + private var hp = 5 + private var reward = 20 + final private val mobs = new util.ArrayList[Mob] + final private val towers = new util.ArrayList[Tower] + final private var basicTower = null: JRadioButton + final private var nullTower = null: JRadioButton + final private var autoTower = null: JRadioButton + final private var waveLabel = null: JLabel + final private var nbMobsLabel = null: JLabel + final private var hpLabel = null: JLabel + final private var rewardLabel = null: JLabel + final private var winLabel = null: JLabel + + this.setSize(600, 600) + this.setPreferredSize(getSize) + this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) + this.setExtendedState(Frame.MAXIMIZED_BOTH) + this.setLocationRelativeTo(null) + val root = new JPanel + root.setLayout(new BorderLayout) + this.setContentPane(root) + val pane = new JPanel + pane.setLayout(new GridLayout(8, 1)) + root.add(pane, BorderLayout.SOUTH) + val grid = new Grid() + grid.setSize(map.getWidth, map.getHeight) + grid.setPreferredSize(grid.getSize) + grid.setMinimumSize(grid.getSize) + grid.setMaximumSize(grid.getSize) + root.add(grid, BorderLayout.CENTER) + val towerSelect = new ButtonGroup + basicTower = new JRadioButton("Tour basique (" + new BasicTower(0, 0).getPrice + " pièces)") + basicTower.setSelected(true) + towerSelect.add(basicTower) + pane.add(basicTower) + nullTower = new JRadioButton("Tour nulle (" + new NullTower(0, 0).getPrice + " pièces)") + towerSelect.add(nullTower) + pane.add(nullTower) + autoTower = new JRadioButton("Tour automatique (" + new AutoTower(0, 0).getPrice + " pièces)") + towerSelect.add(autoTower) + pane.add(autoTower) + waveLabel = new JLabel + pane.add(waveLabel) + nbMobsLabel = new JLabel + pane.add(nbMobsLabel) + hpLabel = new JLabel + pane.add(hpLabel) + rewardLabel = new JLabel + pane.add(rewardLabel) + winLabel = new JLabel + pane.add(winLabel) + setVisible(true) + new Thread(() => { + while ( { + hp > 0 && (round < 4 || !mobs.isEmpty) + }) { + tick() + try Thread.sleep(50L) + catch { + case e: InterruptedException => + e.printStackTrace() + } + } + }).start() + repaint() + + def getMap: RawMap = map + + def tick(): Unit = { + if (mobs.isEmpty && round < 4) { + round += 1 + val nb_mobs = round * (RANDOM.nextInt(16) + 1) + for (i <- 1 to nb_mobs) { + val mob = Mob.getRandomMob + do mob.move(RANDOM.nextInt(getMap.getWidth / 16), RANDOM.nextInt(getMap.getHeight / 16)) while ( { + getMap.getCase(mob.getX, mob.getY).getCollision != Collision.ANY + }) + getMap.getCase(mob.getX, mob.getY).setCollision(Collision.PARTIAL) + mobs.add(mob) + } + } + towers.forEach(tower => { + tower.filterDetectedMobs(mobs).forEach(mob => { + mob.hit(tower.getDamagePerShot) + }) + }) + new util.ArrayList[Mob](mobs).forEach(mob => { + getMap.getCase(mob.getX, mob.getY).setCollision(Collision.ANY) + mob.tick(this) + if (mob.getX < 0 || mob.isDead) { + mobs.remove(mob) + if (mob.getX < 0) { + hp -= 1 + if (hp == 0) { + winLabel.setForeground(Color.red) + winLabel.setText("Vous avez perdu !") + return + } + } + else reward += mob.getReward + } + else getMap.getCase(mob.getX, mob.getY).setCollision(Collision.PARTIAL) + }) + waveLabel.setText("Vague " + round) + nbMobsLabel.setText(mobs.size + " mob" + (if (mobs.size > 1) "s" + else "") + " restant" + (if (mobs.size > 1) "s" + else "")) + hpLabel.setText("Points de vie : " + hp) + rewardLabel.setText("Butin : " + reward) + if (round == 4 && mobs.isEmpty) { + winLabel.setForeground(Color.green.darker) + winLabel.setText("Vous avez gagné !") + } + } + + class Grid() extends JComponent with MouseListener { + addMouseListener(this) + + override protected def paintComponent(_g: Graphics): Unit = { + val g = _g.asInstanceOf[Graphics2D] + if (getMap.getFont != null) g.drawImage(getMap.getFont, null, null) + SpriteRegister.refreshAllSprites() + val SPRITE_SIZE = 32 + getMap.getCases.forEach(c => { + val s1 = SpriteRegister.getCategory(c.getCoucheOne.getCategory).getSprites.get(c.getCoucheOne.getIndex) + val s2 = SpriteRegister.getCategory(c.getCoucheTwo.getCategory).getSprites.get(c.getCoucheTwo.getIndex) + val s3 = SpriteRegister.getCategory(c.getCoucheThree.getCategory).getSprites.get(c.getCoucheThree.getIndex) + g.drawImage(s1.getImage, SPRITE_SIZE * c.getPosX, SPRITE_SIZE * c.getPosY, SPRITE_SIZE, SPRITE_SIZE, Color.white, null) + if (!CollidPanel.isEmpty(s2.getImage)) g.drawImage(s2.getImage, SPRITE_SIZE * c.getPosX, SPRITE_SIZE * c.getPosY, SPRITE_SIZE, SPRITE_SIZE, null, null) + if (!CollidPanel.isEmpty(s3.getImage)) g.drawImage(s3.getImage, SPRITE_SIZE * c.getPosX, SPRITE_SIZE * c.getPosY, SPRITE_SIZE, SPRITE_SIZE, null, null) + }) + new util.ArrayList[Mob](mobs).forEach(mob => { + val s = mob.getSprite + g.drawImage(s.getImage, SPRITE_SIZE * mob.getX, SPRITE_SIZE * mob.getY, SPRITE_SIZE, SPRITE_SIZE, null, null) + }) + towers.forEach(tower => { + val s = tower.getSprite + g.drawImage(s.getImage, SPRITE_SIZE * tower.getX, SPRITE_SIZE * tower.getY, SPRITE_SIZE, SPRITE_SIZE, null, null) + }) + repaint() + } + + override def mouseClicked(event: MouseEvent): Unit = { + } + + override def mousePressed(event: MouseEvent): Unit = { + } + + override def mouseReleased(event: MouseEvent): Unit = { + val x = event.getX / 32 + val y = event.getY / 32 + val tower = if (basicTower.isSelected) new BasicTower(x, y) + else if (nullTower.isSelected) new NullTower(x, y) + else if (autoTower.isSelected) new AutoTower(x, y) + else null + if (tower == null || tower.getPrice > reward) return + val c = getMap.getCase(x, y) + if (c == null || (c.getCollision ne Collision.ANY)) return + c.setCollision(Collision.FULL) + reward -= tower.getPrice + towers.add(tower) + } + + override def mouseEntered(event: MouseEvent): Unit = { + } + + override def mouseExited(event: MouseEvent): Unit = { + } + } + +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala new file mode 100644 index 0000000..1579338 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala @@ -0,0 +1,108 @@ +package fr.ynerant.leveleditor.game.mobs + +import fr.ynerant.leveleditor.api.editor.sprites.Sprite +import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister +import fr.ynerant.leveleditor.game.GameFrame +import java.util +import java.util.Random + +import fr.ynerant.leveleditor.api.editor.RawCase + + +object Mob { + private val RANDOM = new Random + + def getRandomMob: Mob = RANDOM.nextInt(3) match { + case 1 => + new Mob1 + case 2 => + new Mob2 + case _ => + new MobCancer + } +} + +abstract class Mob() { + private var hp = getMaxHP + private var tickRemains = getSlowness + private var sprite = null: Sprite + private var x = 0 + private var y = 0 + + def getMaxHP: Int + + def getSlowness: Long + + def getReward: Int + + def getName: String + + def getSprite: Sprite = { + if (sprite == null) sprite = SpriteRegister.getCategory(getName).getSprites.get(0) + sprite + } + + def getX: Int = x + + def getY: Int = y + + def move(x: Int, y: Int): Unit = { + this.x = x + this.y = y + } + + def getHP: Int = hp + + def isDead: Boolean = hp <= 0 + + def setHP(hp: Int): Unit = { + this.hp = hp + } + + def hit(damage: Int): Boolean = { + if (!isDead) { + this.hp -= damage + return true + } + false + } + + def tick(game: GameFrame): Unit = { + if (tickRemains > 0) tickRemains -= 1 + else { + tickRemains = getSlowness + val current = game.getMap.getCase(getX, getY) + if (current.getPosX == 0) { + move(-1, getY) + return + } + + val visited = new util.ArrayList[RawCase] + val queue = new util.ArrayDeque[RawCase] + val pred = new util.HashMap[RawCase, RawCase] + var last = null: RawCase + queue.add(current) + while (!queue.isEmpty) { + val visiting = queue.poll + visited.add(visiting) + game.getMap.getNeighbours(visiting).forEach(neighbour => { + if (neighbour != null && !visited.contains(neighbour)) { + pred.put(neighbour, visiting) + queue.add(neighbour) + if (neighbour.getPosX == 0) { + last = neighbour + queue.clear() + return + } + } + }) + if (last != null) { + while (pred.get(last) != current) last = pred.get(last) + move(last.getPosX, last.getPosY) + } + } + } + } + + override def toString: String = "Mob{" + "sprite=" + sprite + ", x=" + x + ", y=" + y + '}' +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob1.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob1.scala new file mode 100644 index 0000000..9c39eeb --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob1.scala @@ -0,0 +1,11 @@ +package fr.ynerant.leveleditor.game.mobs + +class Mob1 extends Mob { + override def getMaxHP = 2 + + override def getSlowness = 60 + + override def getReward = 10 + + override def getName = "mob1" +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob2.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob2.scala new file mode 100644 index 0000000..5df930c --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob2.scala @@ -0,0 +1,11 @@ +package fr.ynerant.leveleditor.game.mobs + +class Mob2 extends Mob { + override def getMaxHP = 6 + + override def getSlowness = 20 + + override def getReward = 20 + + override def getName = "mob2" +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobCancer.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobCancer.scala new file mode 100644 index 0000000..d81c0df --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobCancer.scala @@ -0,0 +1,11 @@ +package fr.ynerant.leveleditor.game.mobs + +class MobCancer extends Mob { + override def getMaxHP = 50 + + override def getSlowness = 100 + + override def getReward = 100 + + override def getName = "mobcancer" +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/AutoTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/AutoTower.scala new file mode 100644 index 0000000..9481bb5 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/AutoTower.scala @@ -0,0 +1,17 @@ +package fr.ynerant.leveleditor.game.towers + +import fr.ynerant.leveleditor.game.mobs.Mob +import java.util + + +class AutoTower(override val x: Int, override val y: Int) extends Tower(x, y) { + override def getName = "autotower" + + override def getDamagePerShot = 20 + + override def getPeriod = 10 + + override def getPrice = 142 + + override private[towers] def _filterDetectedMobs(mobs: util.Collection[Mob]) = mobs +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala new file mode 100644 index 0000000..d095341 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala @@ -0,0 +1,23 @@ +package fr.ynerant.leveleditor.game.towers + +import fr.ynerant.leveleditor.game.mobs.Mob +import java.util + + +class BasicTower(override val x: Int, override val y: Int) extends Tower(x, y) { + override def getName = "basictower" + + override def getDamagePerShot = 1 + + override def getPeriod = 5 + + override def getPrice = 10 + + override private[towers] def _filterDetectedMobs(mobs: util.Collection[Mob]) = { + val filtered = new util.ArrayList[Mob] + mobs.forEach(mob => { + if ((mob.getX == getX || mob.getY == getY) && Math.abs(mob.getX - getX) <= 3 && Math.abs(mob.getY - getY) <= 3) filtered.add(mob) + }) + filtered + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/NullTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/NullTower.scala new file mode 100644 index 0000000..e24814d --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/NullTower.scala @@ -0,0 +1,17 @@ +package fr.ynerant.leveleditor.game.towers + +import fr.ynerant.leveleditor.game.mobs.Mob +import java.util + + +class NullTower(override val x: Int, override val y: Int) extends Tower(x, y) { + override def getName = "nulltower" + + override def getDamagePerShot: Int = Integer.MAX_VALUE + + override def getPeriod = 1 + + override def getPrice = 5 + + override private[towers] def _filterDetectedMobs(mobs: util.Collection[Mob]) = new util.ArrayList[Mob] +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala new file mode 100644 index 0000000..431e690 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala @@ -0,0 +1,42 @@ +package fr.ynerant.leveleditor.game.towers + +import fr.ynerant.leveleditor.api.editor.sprites.Sprite +import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister +import fr.ynerant.leveleditor.game.mobs.Mob +import java.util +import java.util.Random + + +object Tower { + private val RANDOM = new Random +} + +abstract class Tower(val x: Int, val y: Int) { + final private val sprite = SpriteRegister.getCategory(getName).getSprites.get(0) + private var remainingTicks = 0L + + def getSprite: Sprite = sprite + + def getName: String + + def getDamagePerShot: Int + + def getPeriod: Long + + def getPrice: Int + + private[towers] def _filterDetectedMobs(mobs: util.Collection[Mob]): util.Collection[Mob] + + def filterDetectedMobs(mobs: util.Collection[Mob]): util.Collection[Mob] = if (remainingTicks > 0) { + remainingTicks -= 1 + new util.ArrayList[Mob] + } + else { + remainingTicks = getPeriod + _filterDetectedMobs(mobs) + } + + def getX: Int = x + + def getY: Int = y +} From 031815e055f72e9d1df1b73b7bf87a9d68843fad Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sat, 4 Apr 2020 21:56:14 +0200 Subject: [PATCH 02/13] Better Scala code --- .../ynerant/leveleditor/api/editor/Case.scala | 7 +- .../leveleditor/api/editor/Collision.scala | 9 +- .../leveleditor/api/editor/EditorAPI.scala | 39 ++----- .../leveleditor/api/editor/RawCase.scala | 10 +- .../leveleditor/api/editor/RawMap.scala | 50 ++++----- .../api/editor/sprites/Category.scala | 12 +- .../api/editor/sprites/Sprite.scala | 10 +- .../api/editor/sprites/SpriteRegister.scala | 45 ++++---- .../leveleditor/client/main/Main.scala | 15 +-- .../leveleditor/editor/CollidPanel.scala | 15 +-- .../leveleditor/editor/EditorFrame.scala | 17 ++- .../fr/ynerant/leveleditor/editor/GMap.scala | 61 ++++++++++ .../fr/ynerant/leveleditor/editor/Map.scala | 60 ---------- .../ynerant/leveleditor/editor/MapPanel.scala | 9 +- .../listeners/CollidMapMouseListener.scala | 11 +- .../frame/listeners/MapMouseListener.scala | 5 +- .../ynerant/leveleditor/game/GameFrame.scala | 104 +++++++++--------- .../ynerant/leveleditor/game/mobs/Mob.scala | 19 ++-- .../leveleditor/game/towers/AutoTower.scala | 3 +- .../leveleditor/game/towers/BasicTower.scala | 9 +- .../leveleditor/game/towers/NullTower.scala | 3 +- .../leveleditor/game/towers/Tower.scala | 17 ++- 22 files changed, 249 insertions(+), 281 deletions(-) create mode 100644 src/main/scala/fr/ynerant/leveleditor/editor/GMap.scala delete mode 100644 src/main/scala/fr/ynerant/leveleditor/editor/Map.scala diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/Case.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/Case.scala index 79bbd9f..f084bd7 100644 --- a/src/main/scala/fr/ynerant/leveleditor/api/editor/Case.scala +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/Case.scala @@ -1,11 +1,10 @@ package fr.ynerant.leveleditor.api.editor -import fr.ynerant.leveleditor.api.editor.Collision.Collision import fr.ynerant.leveleditor.api.editor.sprites.Sprite object Case { - def create(posX: Int, posY: Int, couche1: Sprite, couche2: Sprite, couche3: Sprite, collision: Collision): Case = { + def create(posX: Int, posY: Int, couche1: Sprite, couche2: Sprite, couche3: Sprite, collision: String): Case = { val c = new Case c.x = posX c.y = posY @@ -23,7 +22,7 @@ class Case { private var couche1 = null: Sprite private var couche2 = null: Sprite private var couche3 = null: Sprite - private var collision = null: Collision + private var collision = null: String def getPosX: Int = x @@ -35,7 +34,7 @@ class Case { def getCoucheThree: Sprite = couche3 - def getCollision: Collision = collision + def getCollision: String = collision override def toString: String = "{Case x=" + x + " y=" + y + " couche1=" + couche1 + " couche2=" + couche2 + " couche3=" + couche3 + " collision=" + collision.toString.toUpperCase + "}\n" } diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/Collision.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/Collision.scala index cacf513..5de47e7 100644 --- a/src/main/scala/fr/ynerant/leveleditor/api/editor/Collision.scala +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/Collision.scala @@ -1,6 +1,9 @@ package fr.ynerant.leveleditor.api.editor -object Collision extends Enumeration { - type Collision = Value - val FULL, PARTIAL, ANY = Value +object Collision { + val FULL: String = "FULL" + val PARTIAL: String = "PARTIAL" + val ANY: String = "ANY" + + val values: IndexedSeq[String] = IndexedSeq(FULL, PARTIAL, ANY) } diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/EditorAPI.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/EditorAPI.scala index baa02e4..9f12661 100644 --- a/src/main/scala/fr/ynerant/leveleditor/api/editor/EditorAPI.scala +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/EditorAPI.scala @@ -3,22 +3,19 @@ package fr.ynerant.leveleditor.api.editor import java.awt.Color import java.awt.image.BufferedImage import java.io._ -import java.lang.reflect.Type import java.nio.charset.StandardCharsets -import java.util import java.util.zip.{GZIPInputStream, GZIPOutputStream} -import com.google.gson.{Gson, GsonBuilder, JsonDeserializationContext, JsonDeserializer, JsonElement, JsonPrimitive, JsonSerializationContext, JsonSerializer} -import fr.ynerant.leveleditor.api.editor.Collision.Collision -import fr.ynerant.leveleditor.editor.Map +import fr.ynerant.leveleditor.editor.GMap import javax.swing.JFileChooser import javax.swing.filechooser.FileNameExtensionFilter +import net.liftweb.json._ object EditorAPI { private var LAST_FILE = null: File def toRawMap(width: Int, height: Int): RawMap = { - val cases = new util.ArrayList[RawCase] + var cases = Nil: List[RawCase] var y = 1 while ( { y < height @@ -28,7 +25,7 @@ object EditorAPI { x < width }) { val c = RawCase.create(x / 16, y / 16, RawSprite.BLANK, RawSprite.BLANK, RawSprite.BLANK, Collision.ANY) - cases.add(c) + cases ::= c x += 16 } @@ -38,20 +35,6 @@ object EditorAPI { RawMap.create(cases, width, height) } - def createGson: Gson = { - val builder = new GsonBuilder - builder.registerTypeAdapter(classOf[Collision.Collision], new JsonDeserializer[Collision.Collision] { - override def deserialize(jsonElement: JsonElement, `type`: Type, jsonDeserializationContext: JsonDeserializationContext): Collision = Collision.withName(jsonElement.getAsString) - }) - builder.registerTypeAdapter(classOf[Collision.Collision], new JsonSerializer[Collision.Collision] { - override def serialize(t: Collision, `type`: Type, jsonSerializationContext: JsonSerializationContext): JsonElement = new JsonPrimitive(t.toString) - }) - builder.enableComplexMapKeySerialization - builder.serializeNulls - builder.setPrettyPrinting() - builder.create - } - def createJFC: JFileChooser = { val jfc = new JFileChooser jfc.setFileFilter(new FileNameExtensionFilter("Fichiers monde (*.gmap, *.dat)", "gmap", "dat")) @@ -80,7 +63,8 @@ object EditorAPI { } def save(file: File, map: RawMap): Unit = { - val json = createGson.toJson(map) + implicit val formats: DefaultFormats.type = DefaultFormats + val json = Serialization.writePretty(map) try { assert(file.createNewFile) val bos = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(file))) @@ -92,7 +76,7 @@ object EditorAPI { } } - def open: Map = { + def open: GMap = { val jfc = createJFC var file = null: File jfc.showOpenDialog(null) @@ -119,12 +103,13 @@ object EditorAPI { case e: IOException => e.printStackTrace() } - createGson.fromJson(json, classOf[RawMap]) + implicit val formats: DefaultFormats.type = DefaultFormats + parse(json).extract[RawMap] } - def open(f: File): Map = open(getRawMap(f)) + def open(f: File): GMap = open(getRawMap(f)) - def open(map: RawMap): Map = { + def open(map: RawMap): GMap = { if (map.getFont == null) { val baseWidth = map.getWidth val baseHeight = map.getHeight @@ -155,6 +140,6 @@ object EditorAPI { } map.setFont(image) } - new Map(map) + new GMap(map) } } diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/RawCase.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawCase.scala index 79706b5..548fce6 100644 --- a/src/main/scala/fr/ynerant/leveleditor/api/editor/RawCase.scala +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawCase.scala @@ -1,9 +1,7 @@ package fr.ynerant.leveleditor.api.editor -import fr.ynerant.leveleditor.api.editor.Collision.Collision - object RawCase { - def create(posX: Int, posY: Int, couche1: RawSprite, couche2: RawSprite, couche3: RawSprite, collision: Collision): RawCase = { + def create(posX: Int, posY: Int, couche1: RawSprite, couche2: RawSprite, couche3: RawSprite, collision: String): RawCase = { new RawCase(posX, posY, couche1, couche2, couche3, collision) } @@ -12,7 +10,7 @@ object RawCase { } } -case class RawCase(var x: Int, var y: Int, var couche1: RawSprite, var couche2: RawSprite, var couche3: RawSprite, var collision: Collision) { +case class RawCase(var x: Int, var y: Int, var couche1: RawSprite, var couche2: RawSprite, var couche3: RawSprite, var collision: String) { def getPosX: Int = x def getPosY: Int = y @@ -23,9 +21,9 @@ case class RawCase(var x: Int, var y: Int, var couche1: RawSprite, var couche2: def getCoucheThree: RawSprite = couche3 - def getCollision: Collision = collision + def getCollision: String = collision - def setCollision(collision: Collision): Unit = { + def setCollision(collision: String): Unit = { this.collision = collision } } diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/RawMap.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawMap.scala index 2ebead2..6264c28 100644 --- a/src/main/scala/fr/ynerant/leveleditor/api/editor/RawMap.scala +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawMap.scala @@ -1,50 +1,45 @@ package fr.ynerant.leveleditor.api.editor -import fr.ynerant.leveleditor.editor.Map import java.awt.image.BufferedImage -import java.util -import java.util.stream.Collectors -import com.google.gson.Gson +import fr.ynerant.leveleditor.editor.GMap +import net.liftweb.json._ object RawMap { - def create(cases: util.List[RawCase], width: Int, height: Int): RawMap = { + def create(cases: List[RawCase], width: Int, height: Int): RawMap = { new RawMap(cases, width, height) } - def create(map: Map): RawMap = { - val raw = new RawMap(new util.ArrayList[RawCase], 0, 0) - raw.width = map.getWidth - raw.height = map.getHeight - raw.cases = new util.ArrayList[RawCase] - map.getAllCases.forEach(c => raw.cases.add(RawCase.create(c))) + def create(map: GMap): RawMap = { + val raw = new RawMap(Nil, map.getWidth, map.getHeight) + map.getAllCases.foreach(c => raw.cases ::= RawCase.create(c)) raw } } -case class RawMap(var cases: util.List[RawCase], var width: Int, var height: Int) { - private var cases_map = null: util.HashMap[Integer, RawCase] +case class RawMap(var cases: List[RawCase], var width: Int, var height: Int) { + private var cases_map = null: Map[Integer, RawCase] private var font = null: BufferedImage - def getCases: util.List[RawCase] = cases + def getNeighbours(c: RawCase): Iterable[RawCase] = { + var list = Nil: List[RawCase] + list ::= getCase(c.getPosX, c.getPosY + 1) + list ::= getCase(c.getPosX + 1, c.getPosY) + list ::= getCase(c.getPosX, c.getPosY - 1) + list ::= getCase(c.getPosX - 1, c.getPosY) + list.filter((_c: RawCase) => _c != null && _c.getCollision.equals(Collision.ANY)) + } def getCase(x: Int, y: Int): RawCase = { if (cases_map == null) { - cases_map = new util.HashMap[Integer, RawCase] - getCases.forEach(c => cases_map.put(c.getPosY * width + c.getPosX, c)) + cases_map = Map() + getCases.foreach(c => cases_map = cases_map.updated(c.getPosY * width + c.getPosX, c)) } - cases_map.get(y * getWidth + x) + cases_map.getOrElse(y * getWidth + x, null) } - def getNeighbours(c: RawCase): util.Collection[RawCase] = { - val list = new util.ArrayList[RawCase] - list.add(getCase(c.getPosX - 1, c.getPosY)) - list.add(getCase(c.getPosX, c.getPosY - 1)) - list.add(getCase(c.getPosX + 1, c.getPosY)) - list.add(getCase(c.getPosX, c.getPosY + 1)) - list.stream.filter((_c: RawCase) => _c != null && (_c.getCollision == Collision.ANY)).collect(Collectors.toList()) - } + def getCases: List[RawCase] = cases def getWidth: Int = width @@ -56,5 +51,8 @@ case class RawMap(var cases: util.List[RawCase], var width: Int, var height: Int this.font = font } - override def toString: String = new Gson().toJson(this) + override def toString: String = { + implicit val formats: DefaultFormats.type = DefaultFormats + Serialization.writePretty(this) + } } diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Category.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Category.scala index c691993..8b32892 100644 --- a/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Category.scala +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Category.scala @@ -1,9 +1,9 @@ package fr.ynerant.leveleditor.api.editor.sprites -import java.util +import scala.collection.mutable.ListBuffer object Category { - def create(name: String, sprites: util.List[Sprite]): Category = { + def create(name: String, sprites: ListBuffer[Sprite]): Category = { val c = new Category c.name = name c.sprites = sprites @@ -12,12 +12,16 @@ object Category { } class Category private() { - private var sprites = null: util.List[Sprite] + private var sprites = null: ListBuffer[Sprite] private var name = null: String def getName: String = name - def getSprites: util.List[Sprite] = sprites + def getSprites: ListBuffer[Sprite] = sprites + + def addSprite(s: Sprite): Unit = { + this.sprites += s + } override def toString: String = name } diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Sprite.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Sprite.scala index 8909732..07ad085 100644 --- a/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Sprite.scala +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/Sprite.scala @@ -2,15 +2,13 @@ package fr.ynerant.leveleditor.api.editor.sprites import java.awt._ import java.awt.image.BufferedImage -import java.util -import java.util.ArrayList +import scala.collection.mutable.ListBuffer object Sprite { - val BLANK = new Sprite(new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB), Category.create("blank", new util.ArrayList[Sprite]), 0) + val BLANK = new Sprite(new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB), Category.create("blank", ListBuffer()), 0) - val g: Graphics2D - = BLANK.getImage.createGraphics + val g: Graphics2D = BLANK.getImage.createGraphics g.setComposite(AlphaComposite.Clear) g.setColor(new Color(0, true)) g.fillRect(0, 0, 16, 16) @@ -18,7 +16,7 @@ object Sprite { } class Sprite(val img: BufferedImage, val cat: Category, val index: Int) { - if (!this.cat.getSprites.contains(this)) this.cat.getSprites.add(this) + if (!this.cat.getSprites.contains(this)) this.cat.addSprite(this) def getImage: BufferedImage = this.img diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.scala index 2c1559d..34f83d2 100644 --- a/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.scala +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.scala @@ -1,19 +1,20 @@ package fr.ynerant.leveleditor.api.editor.sprites -import java.io.{BufferedInputStream, BufferedReader, File, FileInputStream, IOException, InputStreamReader} +import java.io.{BufferedInputStream, File, FileInputStream, IOException} import java.net.{URISyntaxException, URLDecoder} import java.nio.file.{Files, Paths} -import java.util import java.util.Objects import java.util.jar.JarFile -import com.google.gson.Gson -import javax.imageio.ImageIO import fr.ynerant.leveleditor.client.main.Main +import javax.imageio.ImageIO +import net.liftweb.json._ + +import scala.collection.mutable.ListBuffer object SpriteRegister { - private var nameToCoords = null: util.Map[String, util.List[util.List[Double]]] - private val sprites = new util.HashMap[String, Category] + private var nameToCoords = Map(): Map[String, List[List[Int]]] + private var sprites = Map(): Map[String, Category] @throws[IOException] def unpack(): Unit = { @@ -63,32 +64,32 @@ object SpriteRegister { } @SuppressWarnings(Array("unchecked")) def refreshAllSprites(): Unit = { - if (nameToCoords != null && !nameToCoords.isEmpty && !sprites.isEmpty) return + if (nameToCoords != null && nameToCoords.nonEmpty && sprites.nonEmpty) return val assetsDir = new File("assets") - val assets = new util.ArrayList[String] + var assets = Nil: List[String] for (dir <- Objects.requireNonNull(assetsDir.listFiles)) { - assets.add(dir.getName) + assets ::= dir.getName } - assets.forEach(asset => { + assets.foreach(asset => { try { val f = new File(assetsDir.getAbsolutePath + "/" + asset + "/textures/sprites") assert(f.isDirectory || f.mkdirs) - val br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(f, "sprites.json")))) - nameToCoords = new Gson().fromJson(br, classOf[util.Map[_, _]]) - br.close() - nameToCoords.keySet.forEach(key => { + val json = Files.readString(new File(f, "sprites.json").toPath) + implicit val formats: DefaultFormats.type = DefaultFormats + nameToCoords = parse(json).extract[Map[String, List[List[Int]]]] + nameToCoords.keySet.foreach(key => { try { val is = new BufferedInputStream(new FileInputStream(new File(f, key + ".png"))) val img = ImageIO.read(is) - val cat = Category.create(key, new util.ArrayList[Sprite]) - nameToCoords.get(key).forEach(list => { - val x = list.get(0).intValue - val y = list.get(1).intValue + val cat = Category.create(key, ListBuffer()) + nameToCoords(key).foreach(list => { + val x = list.head.intValue + val y = list(1).intValue val child = img.getSubimage(x, y, 16, 16) - new Sprite(child, cat, nameToCoords.get(key).indexOf(list)) + new Sprite(child, cat, nameToCoords(key).toIndexedSeq.indexOf(list)) }) - sprites.put(key, cat) + sprites += (key -> cat) } catch { case t: Throwable => System.err.println("Erreur lors de la lecture du sprite '" + key + "'") @@ -102,7 +103,7 @@ object SpriteRegister { }) } - def getCategory(name: String): Category = sprites.get(name) + def getCategory(name: String): Category = sprites(name) - def getAllCategories = new util.ArrayList[Category](sprites.values) + def getAllCategories: List[Category] = sprites.values.toList } diff --git a/src/main/scala/fr/ynerant/leveleditor/client/main/Main.scala b/src/main/scala/fr/ynerant/leveleditor/client/main/Main.scala index 8fcc208..e1a0df0 100644 --- a/src/main/scala/fr/ynerant/leveleditor/client/main/Main.scala +++ b/src/main/scala/fr/ynerant/leveleditor/client/main/Main.scala @@ -1,19 +1,16 @@ package fr.ynerant.leveleditor.client.main +import java.awt._ +import java.awt.image.BufferedImage +import java.io.{File, IOException} +import java.net.{URISyntaxException, URL} +import java.util.Locale + import fr.ynerant.leveleditor.api.editor.EditorAPI import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister import fr.ynerant.leveleditor.frame.MainFrame import fr.ynerant.leveleditor.game.GameFrame import javax.swing._ -import java.awt._ -import java.awt.image.BufferedImage -import java.io.File -import java.io.IOException -import java.net.URISyntaxException -import java.net.URL -import java.util.Locale - -import fr.ynerant.leveleditor.client.main.Main.DEV /** diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/CollidPanel.scala b/src/main/scala/fr/ynerant/leveleditor/editor/CollidPanel.scala index bead2dd..d0e58f3 100644 --- a/src/main/scala/fr/ynerant/leveleditor/editor/CollidPanel.scala +++ b/src/main/scala/fr/ynerant/leveleditor/editor/CollidPanel.scala @@ -1,9 +1,10 @@ package fr.ynerant.leveleditor.editor +import java.awt._ +import java.awt.image.BufferedImage + import fr.ynerant.leveleditor.api.editor.Collision import javax.swing._ -import java.awt._ -import java.awt.image.BufferedImage @SerialVersionUID(-138754019431984881L) @@ -21,8 +22,6 @@ object CollidPanel { @SerialVersionUID(-138754019431984881L) class CollidPanel(val frame: EditorFrame) extends JPanel { - def getMap: Map = frame.getMap - override def paintComponent(g: Graphics): Unit = { g.fillRect(0, 0, getWidth, getHeight) val img = getMap.getFont @@ -31,7 +30,7 @@ class CollidPanel(val frame: EditorFrame) extends JPanel { val width = img.getWidth * 2 val height = img.getHeight * 2 g.drawImage(getMap.getFont, x, y, width, height, null) - getMap.getAllCases.forEach(c => { + getMap.getAllCases.foreach(c => { if (!CollidPanel.isEmpty(c.getCoucheOne.getImage)) { g.drawImage(c.getCoucheOne.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) if (!CollidPanel.isEmpty(c.getCoucheTwo.getImage)) { @@ -42,8 +41,8 @@ class CollidPanel(val frame: EditorFrame) extends JPanel { } }) - getMap.getAllCases.forEach(c => { - if (c.getCollision ne Collision.ANY) { + getMap.getAllCases.foreach(c => { + if (c.getCollision.equals(Collision.ANY)) { val alpha = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB) if (c.getCollision eq Collision.FULL) { val grap = alpha.createGraphics @@ -61,4 +60,6 @@ class CollidPanel(val frame: EditorFrame) extends JPanel { } }) } + + def getMap: GMap = frame.getMap } diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala b/src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala index bbbe6f8..a7fa70d 100644 --- a/src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala +++ b/src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala @@ -1,19 +1,18 @@ package fr.ynerant.leveleditor.editor -import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister -import fr.ynerant.leveleditor.frame.listeners._ -import javax.swing._ -import javax.swing.event.ChangeEvent -import javax.swing.event.ChangeListener import java.awt._ import java.awt.event._ import java.io.File +import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister import fr.ynerant.leveleditor.api.editor.{EditorAPI, RawMap} +import fr.ynerant.leveleditor.frame.listeners._ +import javax.swing._ +import javax.swing.event.{ChangeEvent, ChangeListener} @SerialVersionUID(-2705122356101556462L) -class EditorFrame(val map: Map) extends JFrame("Level Editor") with ChangeListener with ActionListener with WindowListener { +class EditorFrame(val map: GMap) extends JFrame("Level Editor") with ChangeListener with ActionListener with WindowListener { final private val save = new JMenuItem("Sauvegarder") final private val saveAs = new JMenuItem("Sauvegarder sous ...") final private val exit = new JMenuItem("Quitter") @@ -126,8 +125,8 @@ class EditorFrame(val map: Map) extends JFrame("Level Editor") with ChangeListen couche2.repaint() couche3.repaint() } - SpriteRegister.getAllCategories.forEach(cat => { - cat.getSprites.forEach(spr => { + SpriteRegister.getAllCategories.foreach(cat => { + cat.getSprites.foreach(spr => { val sprc1 = new SpriteComp(spr, 0) val sprc2 = new SpriteComp(spr, 1) val sprc3 = new SpriteComp(spr, 2) @@ -170,7 +169,7 @@ class EditorFrame(val map: Map) extends JFrame("Level Editor") with ChangeListen resources.getSelectedComponent.asInstanceOf[JScrollPane].getVerticalScrollBar.setValue(cursorPos) } - def getMap: Map = map + def getMap: GMap = map def getSelectedSprite: SpriteComp = selectedSprite diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/GMap.scala b/src/main/scala/fr/ynerant/leveleditor/editor/GMap.scala new file mode 100644 index 0000000..2018ff1 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/editor/GMap.scala @@ -0,0 +1,61 @@ +package fr.ynerant.leveleditor.editor + +import java.awt.image.BufferedImage + +import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister +import fr.ynerant.leveleditor.api.editor.{Case, RawMap} + + +object GMap { + private var cases = Nil: List[Case] +} + +class GMap(val raw: RawMap) { + final private var frame = null: EditorFrame + final private var width = 0 + final private var height = 0 + private var casesMap = Map(): Map[Int, Map[Int, Case]] + final private var font = null: BufferedImage + + GMap.cases = Nil + this.width = raw.getWidth + this.height = raw.getHeight + this.font = raw.getFont + + raw.getCases.foreach(rc => + GMap.cases = Case.create(rc.getPosX, rc.getPosY, SpriteRegister.getCategory(rc.getCoucheOne.getCategory).getSprites(rc.getCoucheOne.getIndex), SpriteRegister.getCategory(rc.getCoucheTwo.getCategory).getSprites(rc.getCoucheTwo.getIndex), SpriteRegister.getCategory(rc.getCoucheThree.getCategory).getSprites(rc.getCoucheThree.getIndex), rc.getCollision) :: GMap.cases + ) + + reorganizeMap() + frame = new EditorFrame(this) + getFrame.setVisible(true) + + def getFrame: EditorFrame = frame + + def getWidth: Int = width + + def getHeight: Int = height + + def getCase(x: Int, y: Int): Case = casesMap.getOrElse(x, Map())(y) + + def getAllCases: List[Case] = { + val list = Nil: List[Case] + casesMap.values.foreach(l => list.appendedAll(l.values)) + list + } + + def getFont: BufferedImage = font + + private def reorganizeMap(): Unit = { + for (i <- 0 until width) { + casesMap += (i -> Map()) + } + GMap.cases.foreach(c => setCase(c.getPosX, c.getPosY, c)) + } + + def setCase(x: Int, y: Int, c: Case): Unit = { + var map = casesMap(x) + map = map + (y -> c) + casesMap = casesMap.updated(x, map) + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/Map.scala b/src/main/scala/fr/ynerant/leveleditor/editor/Map.scala deleted file mode 100644 index 75bd2c7..0000000 --- a/src/main/scala/fr/ynerant/leveleditor/editor/Map.scala +++ /dev/null @@ -1,60 +0,0 @@ -package fr.ynerant.leveleditor.editor - -import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister -import java.awt.image.BufferedImage -import java.util - -import fr.ynerant.leveleditor.api.editor.{Case, RawMap} - - -object Map { - private var cases = null: util.ArrayList[Case] -} - -class Map(val raw: RawMap) { - final private var frame = null: EditorFrame - final private var width = 0 - final private var height = 0 - final private val casesMap = new util.HashMap[Integer, util.Map[Integer, Case]] - final private var font = null: BufferedImage - - Map.cases = new util.ArrayList[Case] - this.width = raw.getWidth - this.height = raw.getHeight - this.font = raw.getFont - - raw.getCases.forEach(rc => - Map.cases.add(Case.create(rc.getPosX, rc.getPosY, SpriteRegister.getCategory(rc.getCoucheOne.getCategory).getSprites.get(rc.getCoucheOne.getIndex), SpriteRegister.getCategory(rc.getCoucheTwo.getCategory).getSprites.get(rc.getCoucheTwo.getIndex), SpriteRegister.getCategory(rc.getCoucheThree.getCategory).getSprites.get(rc.getCoucheThree.getIndex), rc.getCollision)) - ) - - reorganizeMap() - frame = new EditorFrame(this) - getFrame.setVisible(true) - - def getFrame: EditorFrame = frame - - def getWidth: Int = width - - def getHeight: Int = height - - def getCase(x: Int, y: Int): Case = casesMap.getOrDefault(x, new util.HashMap[Integer, Case]).get(y) - - def setCase(x: Int, y: Int, c: Case): Unit = { - casesMap.get(x).put(y, c) - } - - def getFont: BufferedImage = font - - private def reorganizeMap(): Unit = { - for (i <- 0 until width) { - casesMap.put(i, new util.HashMap[Integer, Case]) - } - Map.cases.forEach(c => setCase(c.getPosX, c.getPosY, c)) - } - - def getAllCases: util.List[Case] = { - val list = new util.ArrayList[Case] - casesMap.values.forEach(l => list.addAll(l.values())) - list - } -} diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/MapPanel.scala b/src/main/scala/fr/ynerant/leveleditor/editor/MapPanel.scala index 421b3b8..5146e49 100644 --- a/src/main/scala/fr/ynerant/leveleditor/editor/MapPanel.scala +++ b/src/main/scala/fr/ynerant/leveleditor/editor/MapPanel.scala @@ -1,14 +1,13 @@ package fr.ynerant.leveleditor.editor -import javax.swing._ import java.awt._ import java.awt.image.BufferedImage +import javax.swing._ + @SerialVersionUID(2629019576253690557L) class MapPanel(val frame: EditorFrame) extends JPanel { - def getMap: Map = frame.getMap - override def paintComponent(g: Graphics): Unit = { g.fillRect(0, 0, getWidth, getHeight) val img = getMap.getFont @@ -17,7 +16,7 @@ class MapPanel(val frame: EditorFrame) extends JPanel { val width = img.getWidth * 2 val height = img.getHeight * 2 g.drawImage(getMap.getFont, x, y, width, height, null) - getMap.getAllCases.forEach(c => { // BufferedImage image; + getMap.getAllCases.foreach(c => { // BufferedImage image; if (!isEmpty(c.getCoucheOne.getImage)) g.drawImage(c.getCoucheOne.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) /* if (frame.getSelectedLayerIndex() != 0) { @@ -37,6 +36,8 @@ class MapPanel(val frame: EditorFrame) extends JPanel { }) } + def getMap: GMap = frame.getMap + @SuppressWarnings(Array("BooleanMethodIsAlwaysInverted")) private def isEmpty(image: BufferedImage) = { var allrgba = 0 for (x <- 0 until image.getWidth) { diff --git a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.scala b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.scala index a6cb33c..84b2b5e 100644 --- a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.scala +++ b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.scala @@ -1,9 +1,8 @@ package fr.ynerant.leveleditor.frame.listeners -import fr.ynerant.leveleditor.api.editor.{Case, Collision} -import java.awt.event.MouseAdapter -import java.awt.event.MouseEvent +import java.awt.event.{MouseAdapter, MouseEvent} +import fr.ynerant.leveleditor.api.editor.Case import fr.ynerant.leveleditor.editor.{CollidPanel, EditorFrame} @@ -16,11 +15,7 @@ class CollidMapMouseListener(val panel: CollidPanel, val frame: EditorFrame) ext val y = panel.getHeight / 2 - map.getFont.getHeight val c = map.getCase((event.getX - x + 2) / 34, (event.getY - y + 2) / 34) if (c != null && event.getX - x >= 2 && event.getY - y >= 2) { - val colIndex = c.getCollision.id - var newColIndex = colIndex + 1 - if (newColIndex >= Collision.values.size) newColIndex = 0 - val col = Collision.apply(newColIndex) - val n = Case.create(c.getPosX, c.getPosY, c.getCoucheOne, c.getCoucheTwo, c.getCoucheThree, col) + val n = Case.create(c.getPosX, c.getPosY, c.getCoucheOne, c.getCoucheTwo, c.getCoucheThree, c.getCollision) map.setCase((event.getX - x + 2) / 34, (event.getY - y + 2) / 34, n) panel.repaint() } diff --git a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.scala b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.scala index 099078e..7692b5c 100644 --- a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.scala +++ b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.scala @@ -1,7 +1,6 @@ package fr.ynerant.leveleditor.frame.listeners -import java.awt.event.MouseAdapter -import java.awt.event.MouseEvent +import java.awt.event.{MouseAdapter, MouseEvent} import fr.ynerant.leveleditor.api.editor.Case import fr.ynerant.leveleditor.editor.{EditorFrame, MapPanel} @@ -37,7 +36,7 @@ class MapMouseListener(val panel: MapPanel, val frame: EditorFrame) extends Mous } } else if (frame.getSelectedPaintingMode == 1) { - getFrame.getMap.getAllCases.forEach(c => { + getFrame.getMap.getAllCases.foreach(c => { val map = getFrame.getMap if (getFrame.getSelectedSprite != null) { if (getFrame.getSelectedSprite.getCouche - 1 > getFrame.getSelectedLayerIndex) return diff --git a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala index f244593..635b2aa 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala @@ -1,20 +1,17 @@ package fr.ynerant.leveleditor.game -import fr.ynerant.leveleditor.api.editor.{Collision, RawMap} -import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister -import fr.ynerant.leveleditor.game.mobs.Mob -import fr.ynerant.leveleditor.game.towers.AutoTower -import fr.ynerant.leveleditor.game.towers.BasicTower -import fr.ynerant.leveleditor.game.towers.NullTower -import fr.ynerant.leveleditor.game.towers.Tower -import javax.swing._ +import java.awt.event.{MouseEvent, MouseListener} import java.awt._ -import java.awt.event.MouseEvent -import java.awt.event.MouseListener -import java.util import java.util.Random +import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister +import fr.ynerant.leveleditor.api.editor.{Collision, RawMap} import fr.ynerant.leveleditor.editor.CollidPanel +import fr.ynerant.leveleditor.game.mobs.Mob +import fr.ynerant.leveleditor.game.towers.{AutoTower, BasicTower, NullTower, Tower} +import javax.swing._ + +import scala.collection.mutable.ListBuffer class GameFrame(val map: RawMap) extends JFrame("Jeu") { @@ -22,8 +19,8 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { private var round = 0 private var hp = 5 private var reward = 20 - final private val mobs = new util.ArrayList[Mob] - final private val towers = new util.ArrayList[Tower] + private var mobs = ListBuffer[Mob]() + private var towers = ListBuffer[Tower]() final private var basicTower = null: JRadioButton final private var nullTower = null: JRadioButton final private var autoTower = null: JRadioButton @@ -74,7 +71,7 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { setVisible(true) new Thread(() => { while ( { - hp > 0 && (round < 4 || !mobs.isEmpty) + hp > 0 && (round < 4 || mobs.nonEmpty) }) { tick() try Thread.sleep(50L) @@ -92,25 +89,25 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { if (mobs.isEmpty && round < 4) { round += 1 val nb_mobs = round * (RANDOM.nextInt(16) + 1) - for (i <- 1 to nb_mobs) { + for (_ <- 1 to nb_mobs) { val mob = Mob.getRandomMob do mob.move(RANDOM.nextInt(getMap.getWidth / 16), RANDOM.nextInt(getMap.getHeight / 16)) while ( { - getMap.getCase(mob.getX, mob.getY).getCollision != Collision.ANY + !getMap.getCase(mob.getX, mob.getY).getCollision.equals(Collision.ANY) }) getMap.getCase(mob.getX, mob.getY).setCollision(Collision.PARTIAL) - mobs.add(mob) + mobs += mob } } - towers.forEach(tower => { - tower.filterDetectedMobs(mobs).forEach(mob => { + towers.foreach(tower => { + tower.filterDetectedMobs(mobs).foreach(mob => { mob.hit(tower.getDamagePerShot) }) }) - new util.ArrayList[Mob](mobs).forEach(mob => { + mobs.foreach(mob => { getMap.getCase(mob.getX, mob.getY).setCollision(Collision.ANY) mob.tick(this) if (mob.getX < 0 || mob.isDead) { - mobs.remove(mob) + mobs -= mob if (mob.getX < 0) { hp -= 1 if (hp == 0) { @@ -138,36 +135,6 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { class Grid() extends JComponent with MouseListener { addMouseListener(this) - override protected def paintComponent(_g: Graphics): Unit = { - val g = _g.asInstanceOf[Graphics2D] - if (getMap.getFont != null) g.drawImage(getMap.getFont, null, null) - SpriteRegister.refreshAllSprites() - val SPRITE_SIZE = 32 - getMap.getCases.forEach(c => { - val s1 = SpriteRegister.getCategory(c.getCoucheOne.getCategory).getSprites.get(c.getCoucheOne.getIndex) - val s2 = SpriteRegister.getCategory(c.getCoucheTwo.getCategory).getSprites.get(c.getCoucheTwo.getIndex) - val s3 = SpriteRegister.getCategory(c.getCoucheThree.getCategory).getSprites.get(c.getCoucheThree.getIndex) - g.drawImage(s1.getImage, SPRITE_SIZE * c.getPosX, SPRITE_SIZE * c.getPosY, SPRITE_SIZE, SPRITE_SIZE, Color.white, null) - if (!CollidPanel.isEmpty(s2.getImage)) g.drawImage(s2.getImage, SPRITE_SIZE * c.getPosX, SPRITE_SIZE * c.getPosY, SPRITE_SIZE, SPRITE_SIZE, null, null) - if (!CollidPanel.isEmpty(s3.getImage)) g.drawImage(s3.getImage, SPRITE_SIZE * c.getPosX, SPRITE_SIZE * c.getPosY, SPRITE_SIZE, SPRITE_SIZE, null, null) - }) - new util.ArrayList[Mob](mobs).forEach(mob => { - val s = mob.getSprite - g.drawImage(s.getImage, SPRITE_SIZE * mob.getX, SPRITE_SIZE * mob.getY, SPRITE_SIZE, SPRITE_SIZE, null, null) - }) - towers.forEach(tower => { - val s = tower.getSprite - g.drawImage(s.getImage, SPRITE_SIZE * tower.getX, SPRITE_SIZE * tower.getY, SPRITE_SIZE, SPRITE_SIZE, null, null) - }) - repaint() - } - - override def mouseClicked(event: MouseEvent): Unit = { - } - - override def mousePressed(event: MouseEvent): Unit = { - } - override def mouseReleased(event: MouseEvent): Unit = { val x = event.getX / 32 val y = event.getY / 32 @@ -177,10 +144,41 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { else null if (tower == null || tower.getPrice > reward) return val c = getMap.getCase(x, y) - if (c == null || (c.getCollision ne Collision.ANY)) return + println(x + ", " + y + ", " + tower + ", " + c) + if (c == null || !c.getCollision.equals(Collision.ANY)) return c.setCollision(Collision.FULL) reward -= tower.getPrice - towers.add(tower) + towers += tower + } + + override def mouseClicked(event: MouseEvent): Unit = { + } + + override def mousePressed(event: MouseEvent): Unit = { + } + + override protected def paintComponent(_g: Graphics): Unit = { + val g = _g.asInstanceOf[Graphics2D] + if (getMap.getFont != null) g.drawImage(getMap.getFont, null, null) + SpriteRegister.refreshAllSprites() + val SPRITE_SIZE = 32 + getMap.getCases.foreach(c => { + val s1 = SpriteRegister.getCategory(c.getCoucheOne.getCategory).getSprites(c.getCoucheOne.getIndex) + val s2 = SpriteRegister.getCategory(c.getCoucheTwo.getCategory).getSprites(c.getCoucheTwo.getIndex) + val s3 = SpriteRegister.getCategory(c.getCoucheThree.getCategory).getSprites(c.getCoucheThree.getIndex) + g.drawImage(s1.getImage, SPRITE_SIZE * c.getPosX, SPRITE_SIZE * c.getPosY, SPRITE_SIZE, SPRITE_SIZE, Color.white, null) + if (!CollidPanel.isEmpty(s2.getImage)) g.drawImage(s2.getImage, SPRITE_SIZE * c.getPosX, SPRITE_SIZE * c.getPosY, SPRITE_SIZE, SPRITE_SIZE, null, null) + if (!CollidPanel.isEmpty(s3.getImage)) g.drawImage(s3.getImage, SPRITE_SIZE * c.getPosX, SPRITE_SIZE * c.getPosY, SPRITE_SIZE, SPRITE_SIZE, null, null) + }) + mobs.foreach(mob => { + val s = mob.getSprite + g.drawImage(s.getImage, SPRITE_SIZE * mob.getX, SPRITE_SIZE * mob.getY, SPRITE_SIZE, SPRITE_SIZE, null, null) + }) + towers.foreach(tower => { + val s = tower.getSprite + g.drawImage(s.getImage, SPRITE_SIZE * tower.getX, SPRITE_SIZE * tower.getY, SPRITE_SIZE, SPRITE_SIZE, null, null) + }) + repaint() } override def mouseEntered(event: MouseEvent): Unit = { diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala index 1579338..cda4f5e 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala @@ -1,12 +1,11 @@ package fr.ynerant.leveleditor.game.mobs -import fr.ynerant.leveleditor.api.editor.sprites.Sprite -import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister -import fr.ynerant.leveleditor.game.GameFrame import java.util import java.util.Random import fr.ynerant.leveleditor.api.editor.RawCase +import fr.ynerant.leveleditor.api.editor.sprites.{Sprite, SpriteRegister} +import fr.ynerant.leveleditor.game.GameFrame object Mob { @@ -38,7 +37,7 @@ abstract class Mob() { def getName: String def getSprite: Sprite = { - if (sprite == null) sprite = SpriteRegister.getCategory(getName).getSprites.get(0) + if (sprite == null) sprite = SpriteRegister.getCategory(getName).getSprites.head sprite } @@ -77,17 +76,17 @@ abstract class Mob() { return } - val visited = new util.ArrayList[RawCase] + var visited = Nil: List[RawCase] val queue = new util.ArrayDeque[RawCase] - val pred = new util.HashMap[RawCase, RawCase] + var pred = Map(): Map[RawCase, RawCase] var last = null: RawCase queue.add(current) while (!queue.isEmpty) { val visiting = queue.poll - visited.add(visiting) - game.getMap.getNeighbours(visiting).forEach(neighbour => { + visited ::= visiting + game.getMap.getNeighbours(visiting).foreach(neighbour => { if (neighbour != null && !visited.contains(neighbour)) { - pred.put(neighbour, visiting) + pred += (neighbour -> visiting) queue.add(neighbour) if (neighbour.getPosX == 0) { last = neighbour @@ -97,7 +96,7 @@ abstract class Mob() { } }) if (last != null) { - while (pred.get(last) != current) last = pred.get(last) + while (pred(last) != current) last = pred(last) move(last.getPosX, last.getPosY) } } diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/AutoTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/AutoTower.scala index 9481bb5..dbfd876 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/AutoTower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/AutoTower.scala @@ -1,7 +1,6 @@ package fr.ynerant.leveleditor.game.towers import fr.ynerant.leveleditor.game.mobs.Mob -import java.util class AutoTower(override val x: Int, override val y: Int) extends Tower(x, y) { @@ -13,5 +12,5 @@ class AutoTower(override val x: Int, override val y: Int) extends Tower(x, y) { override def getPrice = 142 - override private[towers] def _filterDetectedMobs(mobs: util.Collection[Mob]) = mobs + override private[towers] def _filterDetectedMobs(mobs: Iterable[Mob]) = mobs } diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala index d095341..a5782f3 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala @@ -1,7 +1,6 @@ package fr.ynerant.leveleditor.game.towers import fr.ynerant.leveleditor.game.mobs.Mob -import java.util class BasicTower(override val x: Int, override val y: Int) extends Tower(x, y) { @@ -13,11 +12,7 @@ class BasicTower(override val x: Int, override val y: Int) extends Tower(x, y) { override def getPrice = 10 - override private[towers] def _filterDetectedMobs(mobs: util.Collection[Mob]) = { - val filtered = new util.ArrayList[Mob] - mobs.forEach(mob => { - if ((mob.getX == getX || mob.getY == getY) && Math.abs(mob.getX - getX) <= 3 && Math.abs(mob.getY - getY) <= 3) filtered.add(mob) - }) - filtered + override private[towers] def _filterDetectedMobs(mobs: Iterable[Mob]) = { + mobs.filter(mob => (mob.getX == getX || mob.getY == getY) && Math.abs(mob.getX - getX) <= 3 && Math.abs(mob.getY - getY) <= 3) } } diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/NullTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/NullTower.scala index e24814d..9714172 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/NullTower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/NullTower.scala @@ -1,7 +1,6 @@ package fr.ynerant.leveleditor.game.towers import fr.ynerant.leveleditor.game.mobs.Mob -import java.util class NullTower(override val x: Int, override val y: Int) extends Tower(x, y) { @@ -13,5 +12,5 @@ class NullTower(override val x: Int, override val y: Int) extends Tower(x, y) { override def getPrice = 5 - override private[towers] def _filterDetectedMobs(mobs: util.Collection[Mob]) = new util.ArrayList[Mob] + override private[towers] def _filterDetectedMobs(mobs: Iterable[Mob]) = Nil } diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala index 431e690..2884076 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala @@ -1,18 +1,17 @@ package fr.ynerant.leveleditor.game.towers -import fr.ynerant.leveleditor.api.editor.sprites.Sprite -import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister -import fr.ynerant.leveleditor.game.mobs.Mob -import java.util import java.util.Random +import fr.ynerant.leveleditor.api.editor.sprites.{Sprite, SpriteRegister} +import fr.ynerant.leveleditor.game.mobs.Mob + object Tower { private val RANDOM = new Random } abstract class Tower(val x: Int, val y: Int) { - final private val sprite = SpriteRegister.getCategory(getName).getSprites.get(0) + final private val sprite = SpriteRegister.getCategory(getName).getSprites.head private var remainingTicks = 0L def getSprite: Sprite = sprite @@ -25,17 +24,17 @@ abstract class Tower(val x: Int, val y: Int) { def getPrice: Int - private[towers] def _filterDetectedMobs(mobs: util.Collection[Mob]): util.Collection[Mob] - - def filterDetectedMobs(mobs: util.Collection[Mob]): util.Collection[Mob] = if (remainingTicks > 0) { + def filterDetectedMobs(mobs: Iterable[Mob]): Iterable[Mob] = if (remainingTicks > 0) { remainingTicks -= 1 - new util.ArrayList[Mob] + Nil } else { remainingTicks = getPeriod _filterDetectedMobs(mobs) } + private[towers] def _filterDetectedMobs(mobs: Iterable[Mob]): Iterable[Mob] + def getX: Int = x def getY: Int = y From 3b55678835e2120e794a3383214b84d0d1a52fb4 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sat, 4 Apr 2020 22:22:20 +0200 Subject: [PATCH 03/13] Editor Map don't display --- src/main/scala/fr/ynerant/leveleditor/editor/GMap.scala | 6 +++--- .../leveleditor/frame/listeners/MapMouseListener.scala | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/GMap.scala b/src/main/scala/fr/ynerant/leveleditor/editor/GMap.scala index 2018ff1..9a438c5 100644 --- a/src/main/scala/fr/ynerant/leveleditor/editor/GMap.scala +++ b/src/main/scala/fr/ynerant/leveleditor/editor/GMap.scala @@ -36,11 +36,11 @@ class GMap(val raw: RawMap) { def getHeight: Int = height - def getCase(x: Int, y: Int): Case = casesMap.getOrElse(x, Map())(y) + def getCase(x: Int, y: Int): Case = casesMap.getOrElse(x, Map()).getOrElse(y, null) def getAllCases: List[Case] = { - val list = Nil: List[Case] - casesMap.values.foreach(l => list.appendedAll(l.values)) + var list = Nil: List[Case] + casesMap.values.foreach(l => list = list.appendedAll(l.values)) list } diff --git a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.scala b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.scala index 7692b5c..aff973d 100644 --- a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.scala +++ b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/MapMouseListener.scala @@ -29,7 +29,6 @@ class MapMouseListener(val panel: MapPanel, val frame: EditorFrame) extends Mous case _ => n = c - } map.setCase(n.getPosX, n.getPosY, n) panel.repaint() From 8b745c068a9a6a2f6ddb34cf2e1e933479291528 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 5 Apr 2020 00:30:12 +0200 Subject: [PATCH 04/13] Fix pathfinder, increase performance --- .../leveleditor/api/editor/RawMap.scala | 6 +-- .../ynerant/leveleditor/game/GameFrame.scala | 39 +++++++++++++----- .../ynerant/leveleditor/game/PathFinder.scala | 40 +++++++++++++++++++ .../ynerant/leveleditor/game/mobs/Mob.scala | 27 +------------ 4 files changed, 75 insertions(+), 37 deletions(-) create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/PathFinder.scala diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/RawMap.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawMap.scala index 6264c28..810cdb4 100644 --- a/src/main/scala/fr/ynerant/leveleditor/api/editor/RawMap.scala +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawMap.scala @@ -24,11 +24,11 @@ case class RawMap(var cases: List[RawCase], var width: Int, var height: Int) { def getNeighbours(c: RawCase): Iterable[RawCase] = { var list = Nil: List[RawCase] - list ::= getCase(c.getPosX, c.getPosY + 1) - list ::= getCase(c.getPosX + 1, c.getPosY) list ::= getCase(c.getPosX, c.getPosY - 1) + list ::= getCase(c.getPosX + 1, c.getPosY) + list ::= getCase(c.getPosX, c.getPosY + 1) list ::= getCase(c.getPosX - 1, c.getPosY) - list.filter((_c: RawCase) => _c != null && _c.getCollision.equals(Collision.ANY)) + list.filter((_c: RawCase) => _c != null) } def getCase(x: Int, y: Int): RawCase = { diff --git a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala index 635b2aa..d03789b 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala @@ -1,7 +1,7 @@ package fr.ynerant.leveleditor.game -import java.awt.event.{MouseEvent, MouseListener} import java.awt._ +import java.awt.event.{MouseEvent, MouseListener} import java.util.Random import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister @@ -21,6 +21,7 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { private var reward = 20 private var mobs = ListBuffer[Mob]() private var towers = ListBuffer[Tower]() + private val pathFinder = PathFinder(this) final private var basicTower = null: JRadioButton final private var nullTower = null: JRadioButton final private var autoTower = null: JRadioButton @@ -70,10 +71,16 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { pane.add(winLabel) setVisible(true) new Thread(() => { - while ( { - hp > 0 && (round < 4 || mobs.nonEmpty) - }) { - tick() + pathFinder.calculatePath() + + while (hp > 0 && (round < 4 || mobs.nonEmpty)) { + try + tick() + catch { + case e: Throwable => + e.printStackTrace() + } + try Thread.sleep(50L) catch { case e: InterruptedException => @@ -85,10 +92,12 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { def getMap: RawMap = map + def getPathFinder: PathFinder = pathFinder + def tick(): Unit = { if (mobs.isEmpty && round < 4) { round += 1 - val nb_mobs = round * (RANDOM.nextInt(16) + 1) + val nb_mobs = round * (RANDOM.nextInt(8) + 1) for (_ <- 1 to nb_mobs) { val mob = Mob.getRandomMob do mob.move(RANDOM.nextInt(getMap.getWidth / 16), RANDOM.nextInt(getMap.getHeight / 16)) while ( { @@ -144,11 +153,23 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { else null if (tower == null || tower.getPrice > reward) return val c = getMap.getCase(x, y) - println(x + ", " + y + ", " + tower + ", " + c) if (c == null || !c.getCollision.equals(Collision.ANY)) return c.setCollision(Collision.FULL) - reward -= tower.getPrice - towers += tower + + pathFinder.invalidate() + + val accessible = getMap.getCases.filter(c => !Collision.FULL.equals(c.getCollision)) + if (accessible.exists(c => c.getPosX > 0 && pathFinder.nextPos(c.getPosX, c.getPosY) == null) || !accessible.exists(c => c.getPosX == 0 && !c.getCollision.equals(Collision.FULL))) { + println(accessible.exists(c => c.getPosX > 0 && pathFinder.nextPos(c.getPosX, c.getPosY) == null)) + println(!accessible.exists(c => c.getPosX == 0 && pathFinder.nextPos(c.getPosX, c.getPosY) != null)) + // We ensure that the end of the game is accessible from everywhere, the tower should not block the game + c.setCollision(Collision.ANY) + pathFinder.invalidate() + } + else { + reward -= tower.getPrice + towers += tower + } } override def mouseClicked(event: MouseEvent): Unit = { diff --git a/src/main/scala/fr/ynerant/leveleditor/game/PathFinder.scala b/src/main/scala/fr/ynerant/leveleditor/game/PathFinder.scala new file mode 100644 index 0000000..64d9e60 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/PathFinder.scala @@ -0,0 +1,40 @@ +package fr.ynerant.leveleditor.game + +import java.util + +import fr.ynerant.leveleditor.api.editor.{Collision, RawCase} + +case class PathFinder(game: GameFrame) { + var pred: Map[Int, RawCase] = Map(): Map[Int, RawCase] + + def invalidate(): Unit = calculatePath() + + def calculatePath(): Unit = { + pred = Map() + val queue = new util.ArrayDeque[RawCase] + + for (i <- 0 until game.getMap.getHeight / 16) { + val start = game.getMap.getCase(0, i) + if (!start.getCollision.equals(Collision.FULL)) { + pred += (coords(start) -> null) + queue.add(start) + } + } + + while (!queue.isEmpty) { + val visiting = queue.poll + game.getMap.getNeighbours(visiting).foreach(neighbour => { + if (neighbour != null && !neighbour.collision.equals(Collision.FULL) && !pred.contains(coords(neighbour))) { + pred += (coords(neighbour) -> visiting) + queue.add(neighbour) + } + }) + } + } + + def coords(rawCase: RawCase): Int = rawCase.getPosY * game.getMap.getWidth / 16 + rawCase.getPosX + + def nextPos(x: Int, y: Int): RawCase = { + pred.getOrElse(y * game.getMap.getWidth / 16 + x, null) + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala index cda4f5e..c785274 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala @@ -1,6 +1,5 @@ package fr.ynerant.leveleditor.game.mobs -import java.util import java.util.Random import fr.ynerant.leveleditor.api.editor.RawCase @@ -76,30 +75,8 @@ abstract class Mob() { return } - var visited = Nil: List[RawCase] - val queue = new util.ArrayDeque[RawCase] - var pred = Map(): Map[RawCase, RawCase] - var last = null: RawCase - queue.add(current) - while (!queue.isEmpty) { - val visiting = queue.poll - visited ::= visiting - game.getMap.getNeighbours(visiting).foreach(neighbour => { - if (neighbour != null && !visited.contains(neighbour)) { - pred += (neighbour -> visiting) - queue.add(neighbour) - if (neighbour.getPosX == 0) { - last = neighbour - queue.clear() - return - } - } - }) - if (last != null) { - while (pred(last) != current) last = pred(last) - move(last.getPosX, last.getPosY) - } - } + val newCase: RawCase = game.getPathFinder.nextPos(getX, getY) + move(newCase.getPosX, newCase.getPosY) } } From 48eb15d57e80c19ec8a2e79f4ac7eac57d19d9cd Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 5 Apr 2020 01:15:45 +0200 Subject: [PATCH 05/13] Project can be launched through sbt run, project is now fully translated --- .gitignore | 3 + build.sbt | 77 ++++++++++++++++++ lib/gson-2.8.6.jar | Bin 240255 -> 0 bytes lib/jopt-simple-6.0-alpha-3.jar | Bin 79368 -> 0 bytes src/main/resources/META-INF/MANIFEST.MF | 3 - src/main/resources/log4j2.xml | 7 -- .../api/editor/sprites/SpriteRegister.scala | 4 +- .../ynerant/leveleditor/game/GameFrame.scala | 1 + 8 files changed, 84 insertions(+), 11 deletions(-) create mode 100644 build.sbt delete mode 100755 lib/gson-2.8.6.jar delete mode 100755 lib/jopt-simple-6.0-alpha-3.jar delete mode 100644 src/main/resources/META-INF/MANIFEST.MF delete mode 100644 src/main/resources/log4j2.xml diff --git a/.gitignore b/.gitignore index 5217bcf..0dacc34 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,9 @@ img.png image.png /maps/ /assets/ +lib/ out/ +project/ +target/ TheGame.jar diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..30d87ad --- /dev/null +++ b/build.sbt @@ -0,0 +1,77 @@ +// The simplest possible sbt build file is just one line: + +scalaVersion := "2.13.1" +// That is, to create a valid sbt build, all you've got to do is define the +// version of Scala you'd like your project to use. + +// ============================================================================ + +// Lines like the above defining `scalaVersion` are called "settings". Settings +// are key/value pairs. In the case of `scalaVersion`, the key is "scalaVersion" +// and the value is "2.13.1" + +// It's possible to define many kinds of settings, such as: + +name := "the-game" +organization := "fr.ynerant" +version := "1.0" + +// Note, it's not required for you to define these three settings. These are +// mostly only necessary if you intend to publish your library's binaries on a +// place like Sonatype or Bintray. + + +// Want to use a published library in your project? +// You can define other libraries as dependencies in your build like this: + +// https://mvnrepository.com/artifact/net.liftweb/lift-json +libraryDependencies += "net.liftweb" %% "lift-json" % "3.4.1" + +// Here, `libraryDependencies` is a set of dependencies, and by using `+=`, +// we're adding the cats dependency to the set of dependencies that sbt will go +// and fetch when it starts up. +// Now, in any Scala file, you can import classes, objects, etc., from cats with +// a regular import. + +// TIP: To find the "dependency" that you need to add to the +// `libraryDependencies` set, which in the above example looks like this: + +// "org.typelevel" %% "cats-core" % "2.0.0" + +// You can use Scaladex, an index of all known published Scala libraries. There, +// after you find the library you want, you can just copy/paste the dependency +// information that you need into your build file. For example, on the +// typelevel/cats Scaladex page, +// https://index.scala-lang.org/typelevel/cats, you can copy/paste the sbt +// dependency from the sbt box on the right-hand side of the screen. + +// IMPORTANT NOTE: while build files look _kind of_ like regular Scala, it's +// important to note that syntax in *.sbt files doesn't always behave like +// regular Scala. For example, notice in this build file that it's not required +// to put our settings into an enclosing object or class. Always remember that +// sbt is a bit different, semantically, than vanilla Scala. + +// ============================================================================ + +// Most moderately interesting Scala projects don't make use of the very simple +// build file style (called "bare style") used in this build.sbt file. Most +// intermediate Scala projects make use of so-called "multi-project" builds. A +// multi-project build makes it possible to have different folders which sbt can +// be configured differently for. That is, you may wish to have different +// dependencies or different testing frameworks defined for different parts of +// your codebase. Multi-project builds make this possible. + +// Here's a quick glimpse of what a multi-project build looks like for this +// build, with only one "subproject" defined, called `root`: + +// lazy val root = (project in file(".")). +// settings( +// inThisBuild(List( +// organization := "ch.epfl.scala", +// scalaVersion := "2.13.1" +// )), +// name := "hello-world" +// ) + +// To learn more about multi-project builds, head over to the official sbt +// documentation at http://www.scala-sbt.org/documentation.html diff --git a/lib/gson-2.8.6.jar b/lib/gson-2.8.6.jar deleted file mode 100755 index 4765c4afeb2cdfa224422b174a4e5d94ffc9f714..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240255 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 LEN=v=6@>o*Edn-* diff --git a/lib/jopt-simple-6.0-alpha-3.jar b/lib/jopt-simple-6.0-alpha-3.jar deleted file mode 100755 index 5838e9027ece78267b0e073b2660767965f10739..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79368 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 z 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�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 I0r>0x08A7S*#H0l diff --git a/src/main/resources/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF deleted file mode 100644 index 09456ce..0000000 --- a/src/main/resources/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: fr.ynerant.leveleditor.client.main.Main - diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml deleted file mode 100644 index 8736eb0..0000000 --- a/src/main/resources/log4j2.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.scala index 34f83d2..9dc343f 100644 --- a/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.scala +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/sprites/SpriteRegister.scala @@ -38,7 +38,9 @@ object SpriteRegister { val name = je.getName if (name.startsWith("assets/")) { val f = new File(name) - if (name.endsWith("/")) if (!f.mkdirs && !f.isDirectory) throw new IOException("Unable to make dir: " + f) + if (name.endsWith("/")) { + if (!f.mkdirs && !f.isDirectory) throw new IOException("Unable to make dir: " + f) + } else if (!f.isFile) Files.copy(jar.getInputStream(je), Paths.get(f.toURI)) } } diff --git a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala index d03789b..5923b26 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala @@ -149,6 +149,7 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { val y = event.getY / 32 val tower = if (basicTower.isSelected) new BasicTower(x, y) else if (nullTower.isSelected) new NullTower(x, y) + else if (autoTower.isSelected) new AutoTower(x, y) else null if (tower == null || tower.getPrice > reward) return From e50d485e4bb9e3fff89b052b7e71773b2ae31ecb Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 5 Apr 2020 01:16:47 +0200 Subject: [PATCH 06/13] Comments in build.sbt are useless --- build.sbt | 71 +------------------------------------------------------ 1 file changed, 1 insertion(+), 70 deletions(-) diff --git a/build.sbt b/build.sbt index 30d87ad..781bd08 100644 --- a/build.sbt +++ b/build.sbt @@ -1,77 +1,8 @@ -// The simplest possible sbt build file is just one line: - scalaVersion := "2.13.1" -// That is, to create a valid sbt build, all you've got to do is define the -// version of Scala you'd like your project to use. -// ============================================================================ - -// Lines like the above defining `scalaVersion` are called "settings". Settings -// are key/value pairs. In the case of `scalaVersion`, the key is "scalaVersion" -// and the value is "2.13.1" - -// It's possible to define many kinds of settings, such as: - -name := "the-game" +name := "TheGame" organization := "fr.ynerant" version := "1.0" -// Note, it's not required for you to define these three settings. These are -// mostly only necessary if you intend to publish your library's binaries on a -// place like Sonatype or Bintray. - - -// Want to use a published library in your project? -// You can define other libraries as dependencies in your build like this: - // https://mvnrepository.com/artifact/net.liftweb/lift-json libraryDependencies += "net.liftweb" %% "lift-json" % "3.4.1" - -// Here, `libraryDependencies` is a set of dependencies, and by using `+=`, -// we're adding the cats dependency to the set of dependencies that sbt will go -// and fetch when it starts up. -// Now, in any Scala file, you can import classes, objects, etc., from cats with -// a regular import. - -// TIP: To find the "dependency" that you need to add to the -// `libraryDependencies` set, which in the above example looks like this: - -// "org.typelevel" %% "cats-core" % "2.0.0" - -// You can use Scaladex, an index of all known published Scala libraries. There, -// after you find the library you want, you can just copy/paste the dependency -// information that you need into your build file. For example, on the -// typelevel/cats Scaladex page, -// https://index.scala-lang.org/typelevel/cats, you can copy/paste the sbt -// dependency from the sbt box on the right-hand side of the screen. - -// IMPORTANT NOTE: while build files look _kind of_ like regular Scala, it's -// important to note that syntax in *.sbt files doesn't always behave like -// regular Scala. For example, notice in this build file that it's not required -// to put our settings into an enclosing object or class. Always remember that -// sbt is a bit different, semantically, than vanilla Scala. - -// ============================================================================ - -// Most moderately interesting Scala projects don't make use of the very simple -// build file style (called "bare style") used in this build.sbt file. Most -// intermediate Scala projects make use of so-called "multi-project" builds. A -// multi-project build makes it possible to have different folders which sbt can -// be configured differently for. That is, you may wish to have different -// dependencies or different testing frameworks defined for different parts of -// your codebase. Multi-project builds make this possible. - -// Here's a quick glimpse of what a multi-project build looks like for this -// build, with only one "subproject" defined, called `root`: - -// lazy val root = (project in file(".")). -// settings( -// inThisBuild(List( -// organization := "ch.epfl.scala", -// scalaVersion := "2.13.1" -// )), -// name := "hello-world" -// ) - -// To learn more about multi-project builds, head over to the official sbt -// documentation at http://www.scala-sbt.org/documentation.html From 37f0b663fcdc9655bcec2b69faefed1a0c2d51f1 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 5 Apr 2020 01:41:10 +0200 Subject: [PATCH 07/13] Fixed collisions in editor and sample map --- samples/Test.gmap | Bin 1872 -> 1953 bytes .../leveleditor/api/editor/EditorAPI.scala | 2 +- .../leveleditor/editor/CollidPanel.scala | 17 ++++++----------- .../ynerant/leveleditor/editor/MapPanel.scala | 17 ++--------------- .../listeners/CollidMapMouseListener.scala | 9 +++++++-- .../ynerant/leveleditor/game/GameFrame.scala | 2 -- 6 files changed, 16 insertions(+), 31 deletions(-) diff --git a/samples/Test.gmap b/samples/Test.gmap index 966847eb18822edd9a44f343bc80b8eb5bb0f6ec..eb7a7d819444b5751df0d64123e89f0973a11eda 100644 GIT binary patch literal 1953 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 { - if (!CollidPanel.isEmpty(c.getCoucheOne.getImage)) { - g.drawImage(c.getCoucheOne.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) - if (!CollidPanel.isEmpty(c.getCoucheTwo.getImage)) { - g.drawImage(c.getCoucheTwo.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) - if (!CollidPanel.isEmpty(c.getCoucheThree.getImage)) - g.drawImage(c.getCoucheThree.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) - } - } + if (!CollidPanel.isEmpty(c.getCoucheOne.getImage)) g.drawImage(c.getCoucheOne.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) + if (!CollidPanel.isEmpty(c.getCoucheTwo.getImage)) g.drawImage(c.getCoucheTwo.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) + if (!CollidPanel.isEmpty(c.getCoucheThree.getImage)) g.drawImage(c.getCoucheThree.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) }) getMap.getAllCases.foreach(c => { - if (c.getCollision.equals(Collision.ANY)) { + if (!c.getCollision.equals(Collision.ANY)) { val alpha = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB) - if (c.getCollision eq Collision.FULL) { + if (c.getCollision.equals(Collision.FULL)) { val grap = alpha.createGraphics grap.setColor(new Color(0, 0, 0, 100)) grap.fillRect(0, 0, 16, 16) grap.dispose() } - else if (c.getCollision eq Collision.PARTIAL) { + else if (c.getCollision.equals(Collision.PARTIAL)) { val grap = alpha.createGraphics grap.setColor(new Color(255, 0, 255, 70)) grap.fillRect(0, 0, 16, 16) diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/MapPanel.scala b/src/main/scala/fr/ynerant/leveleditor/editor/MapPanel.scala index 5146e49..732dcaa 100644 --- a/src/main/scala/fr/ynerant/leveleditor/editor/MapPanel.scala +++ b/src/main/scala/fr/ynerant/leveleditor/editor/MapPanel.scala @@ -18,21 +18,8 @@ class MapPanel(val frame: EditorFrame) extends JPanel { g.drawImage(getMap.getFont, x, y, width, height, null) getMap.getAllCases.foreach(c => { // BufferedImage image; if (!isEmpty(c.getCoucheOne.getImage)) g.drawImage(c.getCoucheOne.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) - /* if (frame.getSelectedLayerIndex() != 0) - { - image = recalculateAplha(c.getCoucheOne().getImage(), 0); - g.drawImage(image, x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - }*/ if (!isEmpty(c.getCoucheTwo.getImage) && frame.getSelectedLayerIndex >= 1) g.drawImage(c.getCoucheTwo.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) - /* if (frame.getSelectedLayerIndex() != 1) - { - image = recalculateAplha(c.getCoucheTwo().getImage(), 1); - g.drawImage(image, x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - }*/ if (!isEmpty(c.getCoucheThree.getImage) && frame.getSelectedLayerIndex == 2) g.drawImage(c.getCoucheThree.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) - /* if (frame.getSelectedLayerIndex() != 2) - { - image = recalculateAplha(c.getCoucheThree().getImage(), 2); - g.drawImage(image, x + c.getPosX() * 34 + 2, y + c.getPosY() * 34 + 2, 32, 32, null); - }*/ + if (!isEmpty(c.getCoucheTwo.getImage) && frame.getSelectedLayerIndex >= 1) g.drawImage(c.getCoucheTwo.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) + if (!isEmpty(c.getCoucheThree.getImage) && frame.getSelectedLayerIndex == 2) g.drawImage(c.getCoucheThree.getImage, x + c.getPosX * 34 + 2, y + c.getPosY * 34 + 2, 32, 32, null) }) } diff --git a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.scala b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.scala index 84b2b5e..1082122 100644 --- a/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.scala +++ b/src/main/scala/fr/ynerant/leveleditor/frame/listeners/CollidMapMouseListener.scala @@ -2,7 +2,7 @@ package fr.ynerant.leveleditor.frame.listeners import java.awt.event.{MouseAdapter, MouseEvent} -import fr.ynerant.leveleditor.api.editor.Case +import fr.ynerant.leveleditor.api.editor.{Case, Collision} import fr.ynerant.leveleditor.editor.{CollidPanel, EditorFrame} @@ -15,7 +15,12 @@ class CollidMapMouseListener(val panel: CollidPanel, val frame: EditorFrame) ext val y = panel.getHeight / 2 - map.getFont.getHeight val c = map.getCase((event.getX - x + 2) / 34, (event.getY - y + 2) / 34) if (c != null && event.getX - x >= 2 && event.getY - y >= 2) { - val n = Case.create(c.getPosX, c.getPosY, c.getCoucheOne, c.getCoucheTwo, c.getCoucheThree, c.getCollision) + val col = c.getCollision match { + case Collision.ANY => Collision.PARTIAL + case Collision.PARTIAL => Collision.FULL + case Collision.FULL => Collision.ANY + } + val n = Case.create(c.getPosX, c.getPosY, c.getCoucheOne, c.getCoucheTwo, c.getCoucheThree, col) map.setCase((event.getX - x + 2) / 34, (event.getY - y + 2) / 34, n) panel.repaint() } diff --git a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala index 5923b26..b7b50e4 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala @@ -161,8 +161,6 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { val accessible = getMap.getCases.filter(c => !Collision.FULL.equals(c.getCollision)) if (accessible.exists(c => c.getPosX > 0 && pathFinder.nextPos(c.getPosX, c.getPosY) == null) || !accessible.exists(c => c.getPosX == 0 && !c.getCollision.equals(Collision.FULL))) { - println(accessible.exists(c => c.getPosX > 0 && pathFinder.nextPos(c.getPosX, c.getPosY) == null)) - println(!accessible.exists(c => c.getPosX == 0 && pathFinder.nextPos(c.getPosX, c.getPosY) != null)) // We ensure that the end of the game is accessible from everywhere, the tower should not block the game c.setCollision(Collision.ANY) pathFinder.invalidate() From ca79095672c98451705445e2c4238f9262aaaf79 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 10 Apr 2020 20:04:59 +0200 Subject: [PATCH 08/13] Add new mobs and new towers --- README.md | 2 +- .../textures/sprites/basictower.png | Bin 697 -> 1608 bytes .../textures/sprites/explodertower.png | Bin 0 -> 1680 bytes .../{nulltower.png => freezertower.png} | Bin .../sprites/{autotower.png => lasertower.png} | Bin .../leveleditor/textures/sprites/mob1.png | Bin 760 -> 1801 bytes .../leveleditor/textures/sprites/mob2.png | Bin 731 -> 1818 bytes .../textures/sprites/mobbreaker.png | Bin 0 -> 1820 bytes .../textures/sprites/mobhealer.png | Bin 0 -> 1811 bytes .../textures/sprites/mobspeeder.png | Bin 0 -> 1811 bytes .../sprites/{mobcancer.png => mobstrong.png} | Bin .../leveleditor/textures/sprites/sprites.json | 24 +++++++- .../textures/sprites/upgradetower.png | Bin 0 -> 1693 bytes .../textures/sprites/walltower.png | Bin 0 -> 697 bytes .../ynerant/leveleditor/game/GameFrame.scala | 50 ++++++++++------ .../ynerant/leveleditor/game/mobs/Mob.scala | 56 +++++++++++++++--- .../ynerant/leveleditor/game/mobs/Mob1.scala | 2 +- .../ynerant/leveleditor/game/mobs/Mob2.scala | 2 +- .../leveleditor/game/mobs/MobBreaker.scala | 18 ++++++ .../leveleditor/game/mobs/MobHealer.scala | 17 ++++++ .../leveleditor/game/mobs/MobSpeeder.scala | 17 ++++++ .../mobs/{MobCancer.scala => MobStrong.scala} | 6 +- .../leveleditor/game/towers/AutoTower.scala | 16 ----- .../leveleditor/game/towers/BasicTower.scala | 13 ++-- .../game/towers/ExploderTower.scala | 26 ++++++++ .../game/towers/FreezerTower.scala | 17 ++++++ .../leveleditor/game/towers/LaserTower.scala | 18 ++++++ .../leveleditor/game/towers/NullTower.scala | 16 ----- .../leveleditor/game/towers/Tower.scala | 16 ++--- .../game/towers/UpgradeTower.scala | 19 ++++++ .../leveleditor/game/towers/WallTower.scala | 16 +++++ 31 files changed, 273 insertions(+), 78 deletions(-) create mode 100644 src/main/resources/assets/leveleditor/textures/sprites/explodertower.png rename src/main/resources/assets/leveleditor/textures/sprites/{nulltower.png => freezertower.png} (100%) rename src/main/resources/assets/leveleditor/textures/sprites/{autotower.png => lasertower.png} (100%) create mode 100644 src/main/resources/assets/leveleditor/textures/sprites/mobbreaker.png create mode 100644 src/main/resources/assets/leveleditor/textures/sprites/mobhealer.png create mode 100644 src/main/resources/assets/leveleditor/textures/sprites/mobspeeder.png rename src/main/resources/assets/leveleditor/textures/sprites/{mobcancer.png => mobstrong.png} (100%) create mode 100644 src/main/resources/assets/leveleditor/textures/sprites/upgradetower.png create mode 100644 src/main/resources/assets/leveleditor/textures/sprites/walltower.png create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/mobs/MobBreaker.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/mobs/MobHealer.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/mobs/MobSpeeder.scala rename src/main/scala/fr/ynerant/leveleditor/game/mobs/{MobCancer.scala => MobStrong.scala} (51%) delete mode 100644 src/main/scala/fr/ynerant/leveleditor/game/towers/AutoTower.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/towers/ExploderTower.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/towers/FreezerTower.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/towers/LaserTower.scala delete mode 100644 src/main/scala/fr/ynerant/leveleditor/game/towers/NullTower.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/towers/UpgradeTower.scala create mode 100644 src/main/scala/fr/ynerant/leveleditor/game/towers/WallTower.scala diff --git a/README.md b/README.md index 977d1b7..09df135 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ Un sprite est une image de taille 16x16, qui contient des informations sur l'end Un Mob est une classe abstraite contenant des informations abstraites (détaillées plus haut). Un type de mob sera donc une classe héritant de `Mob`, telles que `Mob1`, `Mob2` et `MobCancer`. -Il en est de même pour les tours, avec `BasicTower`, `NullTower` et `AutoTower`. +Il en est de même pour les tours, avec `BasicTower`, `WallTower` et `AutoTower`. L'intérêt de l'héritage par rapport à un type donné à une classe Mob (paramètres donnés dans une enumération `MobType` par exemple) est de pouvoir mieux personnaliser les fonctions, par exemple en imaginant des dégâts aléatoires. diff --git a/src/main/resources/assets/leveleditor/textures/sprites/basictower.png b/src/main/resources/assets/leveleditor/textures/sprites/basictower.png index 89f32ad277b7ad20f96fa32063214fa405d9f319..84b127147c1ac242db4a04a03769f105b5d8a95f 100644 GIT binary patch delta 1460 zcmV;l1xxz51;`ALBYy*pdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+U=KbZZszh z#=mol9s%1J%yIZD^#(nD9~gGCo1}S@R+Xx1mki7pu#JC)nYi)C@6-K;ACs~Rnk?oR zJ$@mF%mp{*uV2|U`LOHr;BPlia(C}why<-%j~0)7K+YJ?M}OXqo&vc(D9Yn>)aQ4Qfp+zs=S zM~F>)TC}}gb9S3^T&pV~V#)C=>b4Sc8|CbECBdE+Q4%i2ecC0X7`978j&jHbCU% zV7U{9GC>(($}fxi&Y-W#oNF%;xwB{J0?cb0!i`04)ffgMG*3`<2l!T=6Y_u+Ak-aZ z!vc%1mx`+NmRqtx3&tthYjacT*Zid@z_!8}5+LxAL@AO_%!vqrGyp2(jU{je0aE1- zCpm~juz$fOfN6(0iS}4lzT`M1K|&=;0vl{lzzRW;KPeb;sHkXA)u>5Lvz90^IP9<( zQ(VVwNs>a+6jMr;aw;YkOf6b6vuq`E7M#YKu^qGJoJ)bt0?j45g7F2C%2jHpT4PPs zYObXreOhSRVoS|hZl!aVj(yx?Pu+U%Wzaw>jejuIjX2V!qdG!DENLRZ)2bF@ZFVVkh z^J)}tw_$P5sbl(S)$a$x2{}?Z9o}XQr-RPS^_}}!D`dw6O}x7ZU;d;Mr&v?_l}}%` z?(a_gFDRlZtT{x)g6H_UhmWs!ah~OWeeTcEtK>}v_ypovrW+RV2J!T! zrE}gVji9)+$>b`7 zkz)aWRj800KlmT~?$#_!PPj?o1km+j+aJR~_b$+^+xGXdZ8uMVz%y{Awf)rwF!M=z zy{*NLfWB?u;<~NLd%)!mF!-cPhU7>An*Kroct4|W$^iqnKxobFt+kKS2OvXTrEY+O zLtvyx+3Ozf?&<99-!rZLegI)ga-aqU-Gcy=vjH#(1PT!xAFZb>f0OJ1C?JMOL_t(Y z$74Lxljg?2@c%ypiNLsc=1yc?XM5A#85xr{0w+|(sN(EX>4Tx04R}tkv&MmKpe$iQ>7{u2Ro=Z z1gzp;lcSTOi+H=vFfp1AHR!EHg}-c!PL)(>6Ho6Ngw{R*BDv$4t5)@gvujI=^wwxh(L^ zkeN)(6NiY!Tnj5L%<`s2JVhKRGn4MTb#9GnKkaoUl`2jE6ZG`Ifxh*u>=Vs z6qHdw5jG;U>VKqINYH-N!$08qC2}d`Du9t=0VQaVT|f9A{O;DuPEOR5f>EIT#c@7{ zfxs?Mt2oa0vE$TE0RJ;^r8oVhDlqd&dZnp_kAR+S;NrTeDSN=>4$${x$foQ{ewsoy z3%sAvH>H8zTcB&L-dkfIrw>4qx{BWb2Zz8&j+S|Wp8vXqMe`0d1c?>W~ zlS>6L2?7}jFajt^)De?~1t=nrNkl#@YXWF}%ZKz@+~i4DT5j7<>NnF??WP xU}SlEyq#-4>Dh4DL;>SyK{V=sQ3njP0{~ScE{-$6k52#q002ovPDHLkV1k0U31k2O diff --git a/src/main/resources/assets/leveleditor/textures/sprites/explodertower.png b/src/main/resources/assets/leveleditor/textures/sprites/explodertower.png new file mode 100644 index 0000000000000000000000000000000000000000..dc70397528141cd76694d8fd2ef46790cd02b2b1 GIT binary patch literal 1680 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 diff --git a/src/main/resources/assets/leveleditor/textures/sprites/mob2.png b/src/main/resources/assets/leveleditor/textures/sprites/mob2.png index 1f0471ff96e95168371cbc4271e3a8291ebc243e..a91a8f2e1bef1744c72e4d70a73ef2483828acce 100644 GIT binary patch delta 1706 zcmV;b237gn1)2_!BYy-ndQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+U-|ca_lG! z{bv=k1SB33%fURVW(TwUIXvuicRIP9WPYY9rffhKM?y!!-KPEXcQ=3GViIqB5REBD zi_0gUIAfr8U3osq`uW@wdk*g8=6b;pIrMH#HEwx>oT1NKUVk=DhCJK=rM6!j_b>7W zV%-K#i`$T+Wx&=AlsAy$ZP~B+u`S1>a=V3k?m)Lh*KNkbJK-22LWZYjD-sjN%GL|w zR)?cbrv1y%D?GfHJrM=n(s z*j%hUzsxJ!+JEVANB1?_X<**Hcu0fTw%k3i7q5QG&EpFS&*`3=-gqSbGR*fLxe=+G zOW*F^tM=a3?y`^Aa@?CbcS2^2pm>ZVn9CxX;0_qeYza+KE(KIqTkL^WC=r9iPM#`d z>W11J6e{r1b7MizT-Z&Sf{Vn(4buH+)LB4(b&A9&NPm@)2Hd;ZzR%be75_9+{8Li7-pCi8_f1t z5J#Z5+;Wp>2fcuP)fh=#>j#jB?Eq)UfdU)J1&U;aS%?rw1womtvh#d^0SbXDoMi7@ z1UD!Gn141{BQ$k6@RH+{1QWqUC*TGJ3bMQp$RF{F9Lm83A3}&hf`$}wbkQ4BSd0?K zaht`7mmpC@RFY(M>NRLoQPre5adJ3~Lqa(wO)2FJn;FPCnhgC6$-##^{1J|L$e~9% zazXkOUqXpRik4JzUKE?s--`C@Ie z`mTL}HQKE4WNPTi#Tuj{t2Z-W05UiOW9$ix%U}Qr&4V+m&1Q1?UTCU2&N8{VFx<%OvY9fj+k19>Z>WU zW`909V%CZ&W1@L{Qh(GN`~L^(q&qgzx@P?$K9CPaD5)NE?5*Z7N0RZmp;l?lnk!P9 zhB>wNp+~uO08Pchf^!DBG;DQOn%HSoQ5eg7F4gzQ+ZQBv2h!G=y*UTyT}jLTUcK+7 zX%EM_vSDTTOwl~meC%H^VZP|hhbGJm+keR0gi|Qm9^4<=QU<~Z1*OR1I$@B4|YK;}=7cg9pP7SJWNIdAxiT?s@xf$%e+M>>Hcfaw{q zd1mQ5{V&ij&`*IzVVk?k{^*>J^U%dHd>yl^vZ6ZbYh)Nd!Y6Pp`LsX_;J|NzxkoVM z6y>lBttTwb_VENa_Jbq+{Soi${uHDlIMn_API&wu!@%G!DED?-?(Q4GGWs9U_6zh~ zAcr4V_}6Xz1#!R;Do8gVevu&+e|VgIkv&MmKpe$iKSU`N5j#k6$WR@`f~bh2R-p(L zLaorMgUO{|(4-+rad8w}3l4rPRvlcNb#-tR1i=pwCr2km7b)?7NufoI2gm(*ckglc z4)8ZBOf`e!fT~$WI++l%xmBV26+wj1k0?eZX6kdIn1bi{x`&UicX6KOe|_%H(W~T5 z2KWTxS*9Bn@dokqrloVYbn8f)E?zc8HFR+hO=a|lT+VhJJy$f%)=3M|BF)kras zru~G6KkE2Ja>?W>gOOtae^scE96$IU{O;B)Ois8-;RMk2V%s0XK=&@ttlReYv28a` zfWR|wrM3Ol1~BtUdcCd1j)1;x;NrTi$$P-%4lwwnONQh~0h<0o0eC;7Z^{7!w?Jsk z?X9(s(+40!U8Qb-gF|4XNZIQi@9ydB?cX!4{(b;qN^+nE1>J)Hld}OZ2?PoeA|P4> z8b6cl0Vsd4NklnnfeHOr0DdGhd`PPsaR2}S07*qoM6N<$f;M(P AwEzGB delta 628 zcmV-)0*n2c4%-EgBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmP!xqvQ>7vm2Ro=Z zWT@g`K~%(1t5Adrp;lE=Cr2km7b)?+ zq|hS93y=44-aUu+?gNB+nQ2zXIH2janM%aPOm+7C6 zsqSJt%fIi>>QQqR0|FxPEHg}-c!PL)(>6Ho6GvE4R*BDv$4t5)@gvt2kKZ^KTo!m{ z#7w8=i6g{fp^cR`W<^sYo+6H_nojvb#$%Q97H6$oWzBo?7lw2C$}-n!4IzO=EJ1<@ z1yz(#hK(5QI)5n^Qgj~o@ejIwiChY~N?_zzKm{6P*AM;&zh`UZCnvn5a2)7-ah#7~ zAhZiKYL4@L>^O}RAovVi=`DYy4$OR#UTbO5BcOL1xVUa<${ujJ1N1)`vMIY#kd~0o z1Mg?_Ow3aStW0PgF|4XK-ud)?-K56pWDAZ&H4QR8Ao!1E{ws= zlk){J2?7}c05L?0Y!#C&1}J~BNklU=V-L(0KM7M6t0E1H&^kt0do{%H#C{ z>o3y1!0?5Oq25A=f#EL;1H)%dOqCyb5jKC}f(tVacq|M90}u(xLI+4y<_}cr4=V!$ z$9D#X-)s>6UuFh|@9YeXH;>?tg?bAe28OTP3=IF77#gn}$LWG$5RCxwbukrwA6@VO O0000 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 fb-<_t2HF7tQ+6*is1m2x00000NkvXXu0mjf { - tower.filterDetectedMobs(mobs).foreach(mob => { - mob.hit(tower.getDamagePerShot) - }) - }) + towers.foreach(tower => tower.shot(this)) mobs.foreach(mob => { getMap.getCase(mob.getX, mob.getY).setCollision(Collision.ANY) mob.tick(this) @@ -148,9 +162,11 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { val x = event.getX / 32 val y = event.getY / 32 val tower = if (basicTower.isSelected) new BasicTower(x, y) - else if (nullTower.isSelected) new NullTower(x, y) - - else if (autoTower.isSelected) new AutoTower(x, y) + else if (wallTower.isSelected) new WallTower(x, y) + else if (freezerTower.isSelected) new FreezerTower(x, y) + else if (explodeTower.isSelected) new ExploderTower(x, y) + else if (upgradeTower.isSelected) new UpgradeTower(x, y) + else if (laserTower.isSelected) new LaserTower(x, y) else null if (tower == null || tower.getPrice > reward) return val c = getMap.getCase(x, y) diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala index c785274..ab36000 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob.scala @@ -1,35 +1,48 @@ package fr.ynerant.leveleditor.game.mobs -import java.util.Random - import fr.ynerant.leveleditor.api.editor.RawCase import fr.ynerant.leveleditor.api.editor.sprites.{Sprite, SpriteRegister} import fr.ynerant.leveleditor.game.GameFrame +import scala.util.Random object Mob { private val RANDOM = new Random - def getRandomMob: Mob = RANDOM.nextInt(3) match { - case 1 => + def getRandomMob: Mob = RANDOM.nextInt(6) match { + case 0 => new Mob1 - case 2 => + case 1 => new Mob2 - case _ => - new MobCancer + case 2 => + new MobStrong + case 3 => + new MobHealer + case 4 => + new MobBreaker + case 5 => + new MobSpeeder } } abstract class Mob() { private var hp = getMaxHP - private var tickRemains = getSlowness + private var tickRemains = 0L private var sprite = null: Sprite private var x = 0 private var y = 0 + private var freezeTime = 0 + private var speedMultiplier = 1 + + tickRemains = getSlowness def getMaxHP: Int - def getSlowness: Long + def _getSlowness: Long + + def getSlowness: Long = { + (_getSlowness * Random.between(0.95, 1.05) * (if (freezeTime > 0) 2 else 1) / speedMultiplier).toLong + } def getReward: Int @@ -49,6 +62,18 @@ abstract class Mob() { this.y = y } + def freeze(time: Int): Unit = { + if (freezeTime == 0) + tickRemains *= 2 + freezeTime = time + } + + def speedup(multiplier: Int): Unit = speedMultiplier = multiplier + + def heal(hp: Int): Unit = { + this.hp = Math.min(hp + 1, getMaxHP) + } + def getHP: Int = hp def isDead: Boolean = hp <= 0 @@ -65,7 +90,13 @@ abstract class Mob() { false } + /** + * Called each game tick + */ def tick(game: GameFrame): Unit = { + if (freezeTime > 0) + freezeTime -= 1 + if (tickRemains > 0) tickRemains -= 1 else { tickRemains = getSlowness @@ -75,10 +106,17 @@ abstract class Mob() { return } + _tick(game) + val newCase: RawCase = game.getPathFinder.nextPos(getX, getY) move(newCase.getPosX, newCase.getPosY) } } + /** + * Custom mobs override this function to do some custom stuff + */ + def _tick(game: GameFrame): Unit = () + override def toString: String = "Mob{" + "sprite=" + sprite + ", x=" + x + ", y=" + y + '}' } diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob1.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob1.scala index 9c39eeb..5218785 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob1.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob1.scala @@ -3,7 +3,7 @@ package fr.ynerant.leveleditor.game.mobs class Mob1 extends Mob { override def getMaxHP = 2 - override def getSlowness = 60 + override def _getSlowness = 50 override def getReward = 10 diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob2.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob2.scala index 5df930c..28f17c6 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob2.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/Mob2.scala @@ -3,7 +3,7 @@ package fr.ynerant.leveleditor.game.mobs class Mob2 extends Mob { override def getMaxHP = 6 - override def getSlowness = 20 + override def _getSlowness = 20 override def getReward = 20 diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobBreaker.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobBreaker.scala new file mode 100644 index 0000000..d783797 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobBreaker.scala @@ -0,0 +1,18 @@ +package fr.ynerant.leveleditor.game.mobs + +import fr.ynerant.leveleditor.game.GameFrame + +class MobBreaker extends Mob { + override def getMaxHP = 40 + + override def _getSlowness = 120 + + override def getReward = 70 + + override def getName = "mobhealer" + + override def _tick(game: GameFrame): Unit = { + game.getTowers.filter(tower => Math.abs(tower.getX - getX) + Math.abs(tower.getY - getY) <= 1).foreach(tower => game.breakTower(tower)) + game.getPathFinder.invalidate + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobHealer.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobHealer.scala new file mode 100644 index 0000000..22ee208 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobHealer.scala @@ -0,0 +1,17 @@ +package fr.ynerant.leveleditor.game.mobs + +import fr.ynerant.leveleditor.game.GameFrame + +class MobHealer extends Mob { + override def getMaxHP = 20 + + override def _getSlowness = 60 + + override def getReward = 20 + + override def getName = "mobhealer" + + override def _tick(game: GameFrame): Unit = { + game.getMobs.filter(mob => Math.pow(mob.getX - getX, 2) + Math.pow(mob.getY - getY, 2) <= 9).foreach(mob => mob.heal(1)) + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobSpeeder.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobSpeeder.scala new file mode 100644 index 0000000..53df575 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobSpeeder.scala @@ -0,0 +1,17 @@ +package fr.ynerant.leveleditor.game.mobs + +import fr.ynerant.leveleditor.game.GameFrame + +class MobSpeeder extends Mob { + override def getMaxHP = 25 + + override def _getSlowness = 60 + + override def getReward = 30 + + override def getName = "mobspeeder" + + override def _tick(game: GameFrame): Unit = { + game.getMobs.filter(mob => Math.pow(mob.getX - getX, 2) + Math.pow(mob.getY - getY, 2) <= 9).foreach(mob => mob.speedup(3)) + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobCancer.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobStrong.scala similarity index 51% rename from src/main/scala/fr/ynerant/leveleditor/game/mobs/MobCancer.scala rename to src/main/scala/fr/ynerant/leveleditor/game/mobs/MobStrong.scala index d81c0df..2150246 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobCancer.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobStrong.scala @@ -1,11 +1,11 @@ package fr.ynerant.leveleditor.game.mobs -class MobCancer extends Mob { +class MobStrong extends Mob { override def getMaxHP = 50 - override def getSlowness = 100 + override def _getSlowness = 100 override def getReward = 100 - override def getName = "mobcancer" + override def getName = "mobstrong" } diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/AutoTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/AutoTower.scala deleted file mode 100644 index dbfd876..0000000 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/AutoTower.scala +++ /dev/null @@ -1,16 +0,0 @@ -package fr.ynerant.leveleditor.game.towers - -import fr.ynerant.leveleditor.game.mobs.Mob - - -class AutoTower(override val x: Int, override val y: Int) extends Tower(x, y) { - override def getName = "autotower" - - override def getDamagePerShot = 20 - - override def getPeriod = 10 - - override def getPrice = 142 - - override private[towers] def _filterDetectedMobs(mobs: Iterable[Mob]) = mobs -} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala index a5782f3..fea43eb 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala @@ -1,18 +1,23 @@ package fr.ynerant.leveleditor.game.towers -import fr.ynerant.leveleditor.game.mobs.Mob +import fr.ynerant.leveleditor.game.GameFrame + +import scala.util.Random class BasicTower(override val x: Int, override val y: Int) extends Tower(x, y) { override def getName = "basictower" - override def getDamagePerShot = 1 + override def getDamagePerShot = if (isUpgraded) 3 else 1 override def getPeriod = 5 override def getPrice = 10 - override private[towers] def _filterDetectedMobs(mobs: Iterable[Mob]) = { - mobs.filter(mob => (mob.getX == getX || mob.getY == getY) && Math.abs(mob.getX - getX) <= 3 && Math.abs(mob.getY - getY) <= 3) + override private[towers] def _shot(game: GameFrame): Unit = { + var l = game.getMobs.filter(mob => Math.pow(mob.getX - getX, 2) + Math.pow(mob.getY - getY, 2) <= 9).toList + l = Random.shuffle(l) + if (l.nonEmpty) + l.head.hit(getDamagePerShot) } } diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/ExploderTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/ExploderTower.scala new file mode 100644 index 0000000..442c6c8 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/ExploderTower.scala @@ -0,0 +1,26 @@ +package fr.ynerant.leveleditor.game.towers + +import fr.ynerant.leveleditor.game.GameFrame + +import scala.util.Random + +class ExploderTower(override val x: Int, override val y: Int) extends Tower(x, y) { + override def getName = "explodertower" + + override def getDamagePerShot = if (isUpgraded) 7 else 3 + + override def getPeriod = 20 + + override def getPrice = 70 + + override private[towers] def _shot(game: GameFrame): Unit = { + var l = game.getMobs.filter(mob => Math.pow(mob.getX - getX, 2) + Math.pow(mob.getY - getY, 2) <= 25).toList + l = Random.shuffle(l) + if (l.nonEmpty) { + val target = l.head + target.hit(getDamagePerShot) + game.getMobs.filter(mob => Math.pow(mob.getX - target.getX, 2) + Math.pow(mob.getX - target.getX, 2) <= 9) + .foreach(mob => mob.hit(getDamagePerShot)) + } + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/FreezerTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/FreezerTower.scala new file mode 100644 index 0000000..370482b --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/FreezerTower.scala @@ -0,0 +1,17 @@ +package fr.ynerant.leveleditor.game.towers; + +import fr.ynerant.leveleditor.game.GameFrame + +class FreezerTower(override val x: Int, override val y: Int) extends Tower(x, y) { + override def getName = "freezertower" + + override def getDamagePerShot = if (isUpgraded) 1 else 0 + + override def getPeriod = 10 + + override def getPrice = 40 + + override private[towers] def _shot(game: GameFrame): Unit = { + game.getMobs.filter(mob => Math.abs(mob.getX - getX) <= 3 && Math.abs(mob.getY - getY) <= 3).foreach(mob => mob.freeze(if (isUpgraded) 100 else 40)) + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/LaserTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/LaserTower.scala new file mode 100644 index 0000000..bc0045e --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/LaserTower.scala @@ -0,0 +1,18 @@ +package fr.ynerant.leveleditor.game.towers + +import fr.ynerant.leveleditor.game.GameFrame + + +class LaserTower(override val x: Int, override val y: Int) extends Tower(x, y) { + override def getName = "lasertower" + + override def getDamagePerShot = 3 + + override def getPeriod = 40 + + override def getPrice = 80 + + override private[towers] def _shot(game: GameFrame): Unit = { + game.getMobs.filter(mob => mob.getX == getX || mob.getY == getY).foreach(mob => mob.hit(getDamagePerShot)) + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/NullTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/NullTower.scala deleted file mode 100644 index 9714172..0000000 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/NullTower.scala +++ /dev/null @@ -1,16 +0,0 @@ -package fr.ynerant.leveleditor.game.towers - -import fr.ynerant.leveleditor.game.mobs.Mob - - -class NullTower(override val x: Int, override val y: Int) extends Tower(x, y) { - override def getName = "nulltower" - - override def getDamagePerShot: Int = Integer.MAX_VALUE - - override def getPeriod = 1 - - override def getPrice = 5 - - override private[towers] def _filterDetectedMobs(mobs: Iterable[Mob]) = Nil -} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala index 2884076..68a9c22 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala @@ -3,8 +3,7 @@ package fr.ynerant.leveleditor.game.towers import java.util.Random import fr.ynerant.leveleditor.api.editor.sprites.{Sprite, SpriteRegister} -import fr.ynerant.leveleditor.game.mobs.Mob - +import fr.ynerant.leveleditor.game.GameFrame object Tower { private val RANDOM = new Random @@ -13,6 +12,7 @@ object Tower { abstract class Tower(val x: Int, val y: Int) { final private val sprite = SpriteRegister.getCategory(getName).getSprites.head private var remainingTicks = 0L + private var upgraded = false def getSprite: Sprite = sprite @@ -24,16 +24,18 @@ abstract class Tower(val x: Int, val y: Int) { def getPrice: Int - def filterDetectedMobs(mobs: Iterable[Mob]): Iterable[Mob] = if (remainingTicks > 0) { + def upgrade: Unit = upgraded = true + + def isUpgraded: Boolean = upgraded + + def shot(game: GameFrame): Unit = if (remainingTicks > 0) remainingTicks -= 1 - Nil - } else { remainingTicks = getPeriod - _filterDetectedMobs(mobs) + _shot(game) } - private[towers] def _filterDetectedMobs(mobs: Iterable[Mob]): Iterable[Mob] + private[towers] def _shot(game: GameFrame): Unit def getX: Int = x diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/UpgradeTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/UpgradeTower.scala new file mode 100644 index 0000000..94b3c31 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/UpgradeTower.scala @@ -0,0 +1,19 @@ +package fr.ynerant.leveleditor.game.towers + +import fr.ynerant.leveleditor.game.GameFrame + +import scala.util.Random + +class UpgradeTower(override val x: Int, override val y: Int) extends Tower(x, y) { + override def getName = "upgradetower" + + override def getDamagePerShot = if (isUpgraded) 1 else 0 + + override def getPeriod = 60 + + override def getPrice = 65 + + override private[towers] def _shot(game: GameFrame): Unit = { + game.getTowers.filter(tower => Math.pow(tower.getX - getX, 2) + Math.pow(tower.getY - getY, 2) <= 25 && tower != this).foreach(tower => tower.upgrade) + } +} diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/WallTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/WallTower.scala new file mode 100644 index 0000000..72d3334 --- /dev/null +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/WallTower.scala @@ -0,0 +1,16 @@ +package fr.ynerant.leveleditor.game.towers + +import fr.ynerant.leveleditor.game.GameFrame + + +class WallTower(override val x: Int, override val y: Int) extends Tower(x, y) { + override def getName = "walltower" + + override def getDamagePerShot: Int = Integer.MAX_VALUE + + override def getPeriod = 1 + + override def getPrice = 5 + + override private[towers] def _shot(game: GameFrame): Unit = () +} From 939698b21ad13a00ff2388335a7649bb131d2efe Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 10 Apr 2020 20:38:13 +0200 Subject: [PATCH 09/13] Update Readme --- README.md | 126 +++++++++++++++++- .../leveleditor/game/mobs/MobBreaker.scala | 2 +- .../leveleditor/game/mobs/MobHealer.scala | 2 +- .../leveleditor/game/mobs/MobSpeeder.scala | 2 +- 4 files changed, 124 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 09df135..6979fac 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ --- title: Projet programmation 2 -author: Yohann D'ANELLO +author: Yohann D'ANELLO, Édouard Némery --- # The Game @@ -30,7 +30,7 @@ Une tour contient également diverses propriétés : * Des dégâts par tir * Une vitesse de tir * Un prix -* Une fonction permettant de récupérer les mobs sur lesquels tirer +* Une fonction indiquant ce qu'il se passe lorsque la tour tire Le jeu fonctionne par tick. Toutes les 50 millisecondes a lieu un tick. Toutes les tours sont mises à jour, puis les mobs se déplacent éventuellement. La vitesse des tours et des mobs influe sur le fait de faire quelque chose pendant le @@ -43,6 +43,122 @@ Si un mob doit se déplacer, un chemin est calculé jusqu'au bord de la fenêtre de collisions est en effet géré, empêchant 2 mobs ou tours de se trouver au même endroit. Si un tel chemin existe, alors le mob avance d'une case selon ce chemin. Sinon, il reste sur place. +### Différents mobs + +Il existe différents types de mobs. Ils contiennent 3 propriétés : points de vie (dégâts nécessaires pour être tués), +lenteur (nombre de ticks de jeu nécessaires à déclencher un tick chez le mob), butin (nombre de pièces ramassé par +le joueur lorsque le mob est tué). + +À chaque tick de mob, une fonction de tick spécifique au mob est appelée, qui permet des actions supplémentaires. + +Les mobs peuvent être gelés, si tel est le cas le nombre de ticks d'attente est multiplié par 2. Par ailleurs, un facteur +aléatoire compris entre 0.95 et 1.05 est appliqué. + +#### Mob1 + +Ne fait rien de spécial. + +* Points de vie : 2 +* Lenteur : 50 +* Butin : 10 + +#### Mob2 + +Ne fait rien de spécial. + +* Points de vie : 6 +* Lenteur : 20 +* Butin : 20 + +#### MobStrong + +Ne fait rien de spécial. + +* Points de vie : 50 +* Lenteur : 100 +* Butin : 100 + +#### MobHealer + +Soigne de 2 points de vie à chacun de ses ticks tous les mobs à 3 blocs à la ronde, à l'exception de lui-même. + +* Points de vie : 20 +* Lenteur : 60 +* Butin : 20 + +#### MobSpeeder + +Accélère d'un facteur 3 les ticks des mobs à 3 blocs à la ronde, à l'exception de lui-même. + +* Point de vie : 25 +* Lenteur : 60 +* Butin : 30 + +#### MobBreaker + +Casse les tours sur son passage (à tuer à distance) + +* Points de vie : 110 +* Lenteur : 120 +* Butin : 70 + +### Différentes tours + +Différentes tours sont à la disposition du joueur, avec des prix différents (rendant toutes les tours non accessibles +au début du jeu). Elles ont toutes un nombre de dégât indicatif, un nombre de ticks à attendre entre 2 tirs, et si +elle est améliorée ou non (voir UpgradeTower). Elles disposent aussi d'une fonction `shot` précisant l'action de la tour +à chaque tir. + +#### BasicTower + +Cette tour tire sur une unique cible aléatoire à 3 blocs à la ronde. + +* Période : 5 +* Prix : 10 +* Dégâts : 1 (3 si améliorée) + +#### WallTower + +Cette tour ne fait rien, agit uniquement comme un mur empêchant les mobs de passer par là. + +* Période : +infini +* Prix : 5 +* Dégâts : 0 + +#### FreezeTower + +Cette tour ne faît aucun dégât et gêle pendant 40 ticks (2 secondes), 100 ticks (5 secondes) si améliorée, tous les mobs +à 3 blocs à la ronde. + +* Période : 10 +* Prix : 40 +* Dégâts : 0 (1 si améliorée) + +#### ExploderTower + +Cette tour lance des projectiles explosifs, qui inflige le double des dégâts à la cible ainsi que des dégâts aux mobs +présents à 3 blocs à la ronde de ce mob. La portée est de 5 blocs. + +* Période : 20 +* Prix : 70 +* Dégâts : 3 (7 si améliorée) + +#### UpgradeTower + +Cette tour améliore de façon permanente toutes les tours à 5 blocs à la ronde (sauf elle-même). + +* Période : 60 +* Prix : 65 +* Dégâts : 0 (1 si améliorée) + +#### LaserTower + +Cette tour tire des rayons laser dans les quatre directions et chaque mob reçoit des dégâts. + +* Période : 40 +* Prix : 80 +* Dégâts : 3 + ## Implémentation Le projet est intégralement fait en Java. On ne détaillera pas ici la partie éditeur de niveau, bien qu'elle soit @@ -67,10 +183,10 @@ Une case est une position et 3 sprites (couche 1, couche 2, couche 3). Un sprite est une image de taille 16x16, qui contient des informations sur l'endroit où le chercher. Un Mob est une classe abstraite contenant des informations abstraites (détaillées plus haut). Un type de mob sera donc -une classe héritant de `Mob`, telles que `Mob1`, `Mob2` et `MobCancer`. +une classe héritant de `Mob`. -Il en est de même pour les tours, avec `BasicTower`, `WallTower` et `AutoTower`. +Il en est de même pour les tours, qui hérite de `Tower`. L'intérêt de l'héritage par rapport à un type donné à une classe Mob (paramètres donnés dans une enumération `MobType` -par exemple) est de pouvoir mieux personnaliser les fonctions, par exemple en imaginant des dégâts aléatoires. +par exemple) est de pouvoir mieux personnaliser les fonctions, par exemple en intégrant les dégâts aléatoires. diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobBreaker.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobBreaker.scala index d783797..c533556 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobBreaker.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobBreaker.scala @@ -3,7 +3,7 @@ package fr.ynerant.leveleditor.game.mobs import fr.ynerant.leveleditor.game.GameFrame class MobBreaker extends Mob { - override def getMaxHP = 40 + override def getMaxHP = 110 override def _getSlowness = 120 diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobHealer.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobHealer.scala index 22ee208..c8a6ef5 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobHealer.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobHealer.scala @@ -12,6 +12,6 @@ class MobHealer extends Mob { override def getName = "mobhealer" override def _tick(game: GameFrame): Unit = { - game.getMobs.filter(mob => Math.pow(mob.getX - getX, 2) + Math.pow(mob.getY - getY, 2) <= 9).foreach(mob => mob.heal(1)) + game.getMobs.filter(mob => Math.pow(mob.getX - getX, 2) + Math.pow(mob.getY - getY, 2) <= 9).foreach(mob => mob.heal(2)) } } diff --git a/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobSpeeder.scala b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobSpeeder.scala index 53df575..2ef1261 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobSpeeder.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/mobs/MobSpeeder.scala @@ -12,6 +12,6 @@ class MobSpeeder extends Mob { override def getName = "mobspeeder" override def _tick(game: GameFrame): Unit = { - game.getMobs.filter(mob => Math.pow(mob.getX - getX, 2) + Math.pow(mob.getY - getY, 2) <= 9).foreach(mob => mob.speedup(3)) + game.getMobs.filter(mob => Math.pow(mob.getX - getX, 2) + Math.pow(mob.getY - getY, 2) <= 9 && mob != this).foreach(mob => mob.speedup(3)) } } From 6fe23277b35c2f91bc8a63d795cdd2f2ff390cf4 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 10 Apr 2020 20:45:51 +0200 Subject: [PATCH 10/13] PDF was missing --- README.md | 2 +- README.pdf | Bin 138521 -> 174338 bytes .../leveleditor/game/towers/LaserTower.scala | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6979fac..b8b23e0 100644 --- a/README.md +++ b/README.md @@ -157,7 +157,7 @@ Cette tour tire des rayons laser dans les quatre directions et chaque mob reçoi * Période : 40 * Prix : 80 -* Dégâts : 3 +* Dégâts : 3 (8 si améliorée) ## Implémentation diff --git a/README.pdf b/README.pdf index 109e9e2d345720202ff854ba5edeadf0ffb36d36..3640db0fe697980478152bcd348c384eba241c08 100644 GIT binary patch delta 119204 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

7IX$ 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 diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/LaserTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/LaserTower.scala index bc0045e..8984ebd 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/LaserTower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/LaserTower.scala @@ -6,7 +6,7 @@ import fr.ynerant.leveleditor.game.GameFrame class LaserTower(override val x: Int, override val y: Int) extends Tower(x, y) { override def getName = "lasertower" - override def getDamagePerShot = 3 + override def getDamagePerShot = if (isUpgraded) 8 else 3 override def getPeriod = 40 From 3b474963a8188cc044fc81afd761428f6c3abb4b Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Mon, 27 Apr 2020 11:19:00 +0200 Subject: [PATCH 11/13] Fix some towers --- .../scala/fr/ynerant/leveleditor/api/editor/RawCase.scala | 2 +- .../fr/ynerant/leveleditor/game/towers/BasicTower.scala | 1 - .../fr/ynerant/leveleditor/game/towers/FreezerTower.scala | 5 ++++- .../fr/ynerant/leveleditor/game/towers/LaserTower.scala | 1 - .../fr/ynerant/leveleditor/game/towers/UpgradeTower.scala | 4 ++-- .../scala/fr/ynerant/leveleditor/game/towers/WallTower.scala | 1 - 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/scala/fr/ynerant/leveleditor/api/editor/RawCase.scala b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawCase.scala index 548fce6..88b038c 100644 --- a/src/main/scala/fr/ynerant/leveleditor/api/editor/RawCase.scala +++ b/src/main/scala/fr/ynerant/leveleditor/api/editor/RawCase.scala @@ -21,7 +21,7 @@ case class RawCase(var x: Int, var y: Int, var couche1: RawSprite, var couche2: def getCoucheThree: RawSprite = couche3 - def getCollision: String = collision + def getCollision: String = collision // FULL, PARTIAL or ANY def setCollision(collision: String): Unit = { this.collision = collision diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala index fea43eb..0f07191 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/BasicTower.scala @@ -4,7 +4,6 @@ import fr.ynerant.leveleditor.game.GameFrame import scala.util.Random - class BasicTower(override val x: Int, override val y: Int) extends Tower(x, y) { override def getName = "basictower" diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/FreezerTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/FreezerTower.scala index 370482b..ad59c62 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/FreezerTower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/FreezerTower.scala @@ -12,6 +12,9 @@ class FreezerTower(override val x: Int, override val y: Int) extends Tower(x, y) override def getPrice = 40 override private[towers] def _shot(game: GameFrame): Unit = { - game.getMobs.filter(mob => Math.abs(mob.getX - getX) <= 3 && Math.abs(mob.getY - getY) <= 3).foreach(mob => mob.freeze(if (isUpgraded) 100 else 40)) + game.getMobs.filter(mob => Math.abs(mob.getX - getX) <= 3 && Math.abs(mob.getY - getY) <= 3).foreach(mob => { + mob.freeze(if (isUpgraded) 100 else 40) + mob.hit(getDamagePerShot) + }) } } diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/LaserTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/LaserTower.scala index 8984ebd..50912d0 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/LaserTower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/LaserTower.scala @@ -2,7 +2,6 @@ package fr.ynerant.leveleditor.game.towers import fr.ynerant.leveleditor.game.GameFrame - class LaserTower(override val x: Int, override val y: Int) extends Tower(x, y) { override def getName = "lasertower" diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/UpgradeTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/UpgradeTower.scala index 94b3c31..a72c76a 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/UpgradeTower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/UpgradeTower.scala @@ -2,8 +2,6 @@ package fr.ynerant.leveleditor.game.towers import fr.ynerant.leveleditor.game.GameFrame -import scala.util.Random - class UpgradeTower(override val x: Int, override val y: Int) extends Tower(x, y) { override def getName = "upgradetower" @@ -15,5 +13,7 @@ class UpgradeTower(override val x: Int, override val y: Int) extends Tower(x, y) override private[towers] def _shot(game: GameFrame): Unit = { game.getTowers.filter(tower => Math.pow(tower.getX - getX, 2) + Math.pow(tower.getY - getY, 2) <= 25 && tower != this).foreach(tower => tower.upgrade) + if (isUpgraded) + game.getMobs.filter(mob => Math.pow(mob.getX - getX, 2) + Math.pow(mob.getY - getY, 2) <= 9).foreach(mob => mob.hit(getDamagePerShot)) } } diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/WallTower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/WallTower.scala index 72d3334..2e62cef 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/WallTower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/WallTower.scala @@ -2,7 +2,6 @@ package fr.ynerant.leveleditor.game.towers import fr.ynerant.leveleditor.game.GameFrame - class WallTower(override val x: Int, override val y: Int) extends Tower(x, y) { override def getName = "walltower" From 500132a8168981e082af500fbba6c7c73fdeb5b7 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Mon, 27 Apr 2020 13:49:14 +0200 Subject: [PATCH 12/13] Use scala Random --- src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala | 7 +++---- .../scala/fr/ynerant/leveleditor/game/towers/Tower.scala | 6 ------ 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala index 4993ba5..b445247 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala @@ -2,7 +2,6 @@ package fr.ynerant.leveleditor.game import java.awt._ import java.awt.event.{MouseEvent, MouseListener} -import java.util.Random import fr.ynerant.leveleditor.api.editor.sprites.SpriteRegister import fr.ynerant.leveleditor.api.editor.{Collision, RawMap} @@ -12,10 +11,10 @@ import fr.ynerant.leveleditor.game.towers._ import javax.swing._ import scala.collection.mutable.ListBuffer +import scala.util.Random class GameFrame(val map: RawMap) extends JFrame("Jeu") { - final private val RANDOM = new Random private var round = 0 private var hp = 5 private var reward = 20 @@ -115,10 +114,10 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { def tick(): Unit = { if (mobs.isEmpty && round < 4) { round += 1 - val nb_mobs = round * (RANDOM.nextInt(8) + 1) + val nb_mobs = round * (Random.nextInt(8) + 1) for (_ <- 1 to nb_mobs) { val mob = Mob.getRandomMob - do mob.move(RANDOM.nextInt(getMap.getWidth / 16), RANDOM.nextInt(getMap.getHeight / 16)) while ( { + do mob.move(Random.nextInt(getMap.getWidth / 16), Random.nextInt(getMap.getHeight / 16)) while ( { !getMap.getCase(mob.getX, mob.getY).getCollision.equals(Collision.ANY) }) getMap.getCase(mob.getX, mob.getY).setCollision(Collision.PARTIAL) diff --git a/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala b/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala index 68a9c22..e1cde90 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/towers/Tower.scala @@ -1,14 +1,8 @@ package fr.ynerant.leveleditor.game.towers -import java.util.Random - import fr.ynerant.leveleditor.api.editor.sprites.{Sprite, SpriteRegister} import fr.ynerant.leveleditor.game.GameFrame -object Tower { - private val RANDOM = new Random -} - abstract class Tower(val x: Int, val y: Int) { final private val sprite = SpriteRegister.getCategory(getName).getSprites.head private var remainingTicks = 0L From 3e504310a9fc9ce15d548ce514ad2367e5f4c9e9 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Mon, 27 Apr 2020 17:54:40 +0200 Subject: [PATCH 13/13] Larger grid --- src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala | 2 +- src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala b/src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala index a7fa70d..fa7afa2 100644 --- a/src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala +++ b/src/main/scala/fr/ynerant/leveleditor/editor/EditorFrame.scala @@ -28,7 +28,7 @@ class EditorFrame(val map: GMap) extends JFrame("Level Editor") with ChangeListe final private[editor] val group = new ButtonGroup private var selectedSprite = null: SpriteComp - this.setSize(600, 600) + this.setSize(1000, 1000) this.setPreferredSize(getSize) this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE) this.setExtendedState(Frame.MAXIMIZED_BOTH) diff --git a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala index b445247..60f0328 100644 --- a/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala +++ b/src/main/scala/fr/ynerant/leveleditor/game/GameFrame.scala @@ -33,7 +33,7 @@ class GameFrame(val map: RawMap) extends JFrame("Jeu") { final private var rewardLabel = null: JLabel final private var winLabel = null: JLabel - this.setSize(600, 600) + this.setSize(1000, 1000) this.setPreferredSize(getSize) this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) this.setExtendedState(Frame.MAXIMIZED_BOTH)