Skip to content
Snippets Groups Projects
Commit aa89aa83 authored by Yanis O's avatar Yanis O
Browse files

Merge branch 'melissa'

parents ff834972 f996b97f
No related branches found
No related tags found
No related merge requests found
Pipeline #41507 passed
Showing
with 766 additions and 186 deletions
......@@ -6,89 +6,26 @@ import java.util.List;
import java.util.Map;
import java.util.Random;
import app.SimulatorApplication;
import model.Board;
import model.Entity;
import model.EntityFactory;
import model.EntityScenario;
import model.EntitySpawner;
import model.Model;
import model.Road;
import model.Scenario;
import model.Square;
import util.Matrix;
import util.PathGenerator;
import util.Position;
import util.PositionUtil;
public class FireFighterScenario extends EntityScenario implements Board<Square> {
private Matrix<Square> matrix;
private int step;
private int turnsToSpawnAirTanker;
private Map<EntityFactory, Integer> initialMap;
public FireFighterScenario(int columns, int rows) {
this.matrix = new Matrix<Square>(columns, rows);
initScenario(matrix);
this.turnsToSpawnAirTanker = SimulatorApplication.TURNS_FOR_SPAWNING_AIRTANKER;
this.step = 0;
}
public void placeInitialEntities(Map<EntityFactory, Integer> entityCounts) {
EntitySpawner spawner = new EntitySpawner(this);
spawner.spawnEntities(entityCounts);
public class FireFighterScenario extends Scenario implements Model{
public FireFighterScenario(int columns, int rows, Map<EntityFactory, Integer> initialMap) {
super(columns, rows, initialMap);
generateRoads();
this.initialMap = entityCounts;
}
public Square getStates(Position position) {
if (position.x() > matrix.size() || position.y() > matrix.size()) {
throw new IllegalArgumentException(
"The position x:" + position.x() + " y:" + position.y() + " is out of the board.");
}
return matrix.get(position.x(), position.y());
}
public void setSquare(Square square) {
Position position = square.getPosition();
if (!(getStates(position).isEmpty())) {
return;
}
if (doesPositionExist(position)) {
matrix.set(position.x(), position.y(), square);
}
}
public void setSquare(Square square, boolean replaceStates) {
Position position = square.getPosition();
if (!(getStates(position).isEmpty()) && !replaceStates) {
return;
}
matrix.set(position.x(), position.y(), square);
}
public void addEntityAtSquare(Entity entity, Position position) {
if (doesPositionExist(position)) {
matrix.get(position.x(), position.y()).addEntity(entity);
}
}
public int rowCount() {
return matrix.getRows();
}
public int columnCount() {
return matrix.getColumns();
}
@Override
public void clearCaseFrom(Entity entity, Position position) {
matrix.get(position.x(), position.y()).getEntities().removeIf(element -> element.equals(entity));
}
public List<Position> updateToNextGeneration() {
ArrayList<Position> changedPositions = new ArrayList<>();
Iterator<Square> iterator = matrix.iterator();
Iterator<Square> iterator = getMatrix().iterator();
List<Entity> updatedEntities = new ArrayList<Entity>();
while (iterator.hasNext()) {
Square s = iterator.next();
if (s.isEmpty())
......@@ -102,10 +39,12 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
}
List<Entity> entities = new ArrayList<>(s.getEntities());
for (Entity e : entities) {
if(updatedEntities.contains(e))continue;
if (e.getAge() >= stepNumber() - 1) {
continue;
}
e.incrementAge();
updatedEntities.add(e);
changedPositions.addAll(e.nextTurn(this));
}
}
......@@ -115,7 +54,6 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
// Check if it's time to spawn an AirTanker
if (this.step % this.turnsToSpawnAirTanker == 0) {
System.out.println("apparation");
// Spawn an AirTanker at a random edge position
spawnAirTanker(changedPositions);
}
......@@ -156,74 +94,6 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
changedPositions.add(position);
}
public Position getNearestEntity(Position fromPos, Class<?> entityType) {
int rows = matrix.getRows();
int cols = matrix.getColumns();
Position nearestPosition = fromPos;
// Définir la distance maximale possible
int maxDistance = rows + cols;
// Parcourir les distances croissantes à partir de 1
for (int distance = 1; distance < maxDistance; distance++) {
List<Position> positionsAtDistance = PositionUtil.getPositionsAtManhattanDistance(fromPos, distance, rows, cols);
for (Position currentPos : positionsAtDistance) {
Square currentSquare = matrix.get(currentPos.x(), currentPos.y());
for (Entity currentEntity : currentSquare.getEntities()) {
if (entityType.isInstance(currentEntity)) {
// Dès qu'une entité est trouvée à cette distance, elle est la plus proche
// possible
return currentPos;
}
}
}
}
return nearestPosition; // Retourne null si aucune entité n'est trouvée
}
public void reset() {
step = 0;
matrix.clear();
initScenario(matrix);
placeInitialEntities(initialMap);
}
public int stepNumber() {
return this.step;
}
@Override
public boolean doesPositionExist(Position position) {
return matrix.validateIndex(position);
}
@Override
public int getStepNumber() {
return step;
}
@Override
public boolean doesSquareContainEntity(Position squarePos, Class<?> entityType) {
return getStates(squarePos).getEntities().stream().anyMatch(entityType::isInstance);
}
@Override
public boolean isPositionEmpty(Position position) {
return getStates(position).isEmpty();
}
@Override
public boolean isPositionFree(Position position, int priority) {
List<Entity> entities = matrix.get(position.x(), position.y()).getEntities();
for (Entity e : entities) {
if (e.getPriority() == priority) {
return false;
}
}
return true;
}
private void generateRoads() {
if(columnCount() < 10 || rowCount() < 10){
return;
......@@ -265,4 +135,17 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
}
}
@Override
public Board<Square> getBoard() {
return this;
}
public void reset() {
step = 0;
super.getMatrix().clear();
initScenario(super.getMatrix());
placeInitialEntities(initialMap);
generateRoads();
}
}
......@@ -8,9 +8,20 @@ import model.Board;
import model.Square;
import util.Position;
import util.PositionUtil;
import view.ViewElement;
public class MotorizedFireFighter extends FireFighter {
private final Color viewColor = Color.CYAN;
private static javafx.scene.image.Image cloudImage;
static {
try {
cloudImage = new javafx.scene.image.Image(Cloud.class.getResource("/view/icons/fire/camion.png").toExternalForm());
} catch (Exception e) {
e.printStackTrace();
}
}
public MotorizedFireFighter(Position position, Board<Square> b) {
super(position, b);
......@@ -54,7 +65,12 @@ public class MotorizedFireFighter extends FireFighter {
List<Position> positions = new ArrayList<>();
// Find the nearest fire
Position nearestFirePos = b.getNearestEntity(getPosition(), Fire.class);
Position nearestFirePos;
try {
nearestFirePos = b.getNearestEntity(getPosition(), Fire.class, null);
} catch (Exception e) {
return List.of();
}
if (nearestFirePos != null) {
// Get the next position after moving up to two steps towards the fire
Position nextPos = getNextPositionTowards(getPosition(), nearestFirePos, b, 2);
......@@ -109,4 +125,8 @@ public class MotorizedFireFighter extends FireFighter {
lastThreePosition.add(this.getPosition());
}
@Override
public ViewElement getViewElement() {
return new ViewElement(cloudImage);
}
}
\ No newline at end of file
......@@ -7,12 +7,22 @@ import model.Board;
import model.Entity;
import model.Square;
import util.Position;
import view.ViewElement;
public class Mountain implements Entity{
private final int priority = 0;
Position position;
private int age;
private final Color viewColor = Color.CHOCOLATE;
private static javafx.scene.image.Image cloudImage;
static {
try {
cloudImage = new javafx.scene.image.Image(Cloud.class.getResource("/view/icons/fire/montagne.png").toExternalForm());
} catch (Exception e) {
e.printStackTrace();
}
}
public Mountain(Position p ){
this.position = p;
......@@ -64,4 +74,9 @@ public class Mountain implements Entity{
public int getPriority() {
return this.priority;
}
@Override
public ViewElement getViewElement() {
return new ViewElement(cloudImage);
}
}
......@@ -7,6 +7,7 @@ import model.Board;
import model.Entity;
import model.Square;
import util.Position;
import view.ViewElement;
public class Rockery implements Entity{
private final int priority = 0;
......@@ -14,6 +15,16 @@ public class Rockery implements Entity{
private int age;
private int burn;
private final Color viewColor = Color.LIMEGREEN;
private static javafx.scene.image.Image cloudImage;
static {
try {
cloudImage = new javafx.scene.image.Image(Cloud.class.getResource("/view/icons/fire/rochers.png").toExternalForm());
} catch (Exception e) {
e.printStackTrace();
}
}
public Rockery(Position p ){
this.position = p;
......@@ -78,4 +89,9 @@ public class Rockery implements Entity{
public void resetBurn() {
this.burn = 0;
}
@Override
public ViewElement getViewElement() {
return new ViewElement(cloudImage);
}
}
package model.rockpapercisor;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javafx.scene.paint.Color;
import model.Board;
import model.Entity;
import model.Square;
import model.firefighterscenario.Cloud;
import util.Position;
import util.PositionUtil;
import view.ViewElement;
public class Cisor implements Entity {
private final int priority = 0;
Position position;
private int age;
private final Color viewColor = Color.RED;
private static javafx.scene.image.Image cloudImage;
static {
try {
cloudImage = new javafx.scene.image.Image(Cloud.class.getResource("/view/icons/pfc/cis.png").toExternalForm());
} catch (Exception e) {
e.printStackTrace();
}
}
public Cisor(Position p) {
this.position = p;
}
public Cisor(Position p, int age) {
this.position = p;
this.age = age;
}
@Override
public List<Position> nextTurn(Board<Square> board) {
Position target = null;
target = board.getNearestEntity(position, Paper.class, null);
Position ennemy = null;
ennemy = board.getNearestEntity(position, Rock.class, null);
if(ennemy == null && target == null){
return List.of();
}
Position nextPos = null;
// Vérifier la proximité d'un ennemi avant de choisir la direction.
if (ennemy != null && PositionUtil.getManhattanDistance(position, ennemy) < 5) {
nextPos = PositionUtil.getNextPositionAwayFrom(position, ennemy, board);
} else if(target != null){
nextPos = PositionUtil.getNextPositionTowards(position, target, board);
}
if (nextPos != null && board.doesPositionExist(nextPos)) {
board.addEntityAtSquare(this, nextPos);
board.clearCaseFrom(this, position);
Position oldPosition = new Position(position.x(), position.y());
this.position = nextPos;
if (board.doesSquareContainEntity(nextPos, Paper.class)) {
List<Entity> entities = board.getStates(nextPos).getEntities();
entities.removeIf(p -> p instanceof Paper);
}
List<Position> result = new ArrayList<>();
if (target != null)
result.add(target);
if (oldPosition != null)
result.add(oldPosition);
if (position != null)
result.add(position);
if (ennemy != null)
result.add(ennemy);
return result;
}
return List.of();
}
@Override
public Position getPosition() {
return this.position;
}
@Override
public void setPosition(Position p) {
this.position = p;
}
@Override
public int getAge() {
return this.age;
}
@Override
public void setAge(int age) {
this.age = age;
}
@Override
public void incrementAge() {
this.age += 1;
}
@Override
public Color getViewColor() {
return this.viewColor;
}
@Override
public int getPriority() {
return this.priority;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || getClass() != obj.getClass())
return false;
Cisor cisor = (Cisor) obj;
return age == cisor.age &&
Objects.equals(position, cisor.position);
}
@Override
public int hashCode() {
return Objects.hash(position, age);
}
@Override
public ViewElement getViewElement() {
return new ViewElement(cloudImage);
}
}
package model.rockpapercisor;
import java.util.ArrayList;
import java.util.List;
import javafx.scene.paint.Color;
import model.Board;
import model.Entity;
import model.Square;
import model.firefighterscenario.Cloud;
import util.Position;
import util.PositionUtil;
import view.ViewElement;
public class Paper implements Entity {
private final int priority = 0;
Position position;
private int age;
private final Color viewColor = Color.GRAY;
private static javafx.scene.image.Image cloudImage;
static {
try {
cloudImage = new javafx.scene.image.Image(Cloud.class.getResource("/view/icons/pfc/paper.png").toExternalForm());
} catch (Exception e) {
e.printStackTrace();
}
}
public Paper(Position p) {
this.position = p;
}
public Paper(Position p, int age) {
this.position = p;
this.age = age;
}
@Override
public List<Position> nextTurn(Board<Square> board) {
Position target = null;
target = board.getNearestEntity(position, Rock.class, null);
Position ennemy = null;
ennemy = board.getNearestEntity(position, Cisor.class, null);
if(ennemy == null && target == null){
return List.of();
}
Position nextPos = null;
// Vérifier la proximité d'un ennemi avant de choisir la direction.
if (ennemy != null && PositionUtil.getManhattanDistance(position, ennemy) < 5) {
nextPos = PositionUtil.getNextPositionAwayFrom(position, ennemy, board);
} else if(target != null){
nextPos = PositionUtil.getNextPositionTowards(position, target, board);
}
if (nextPos != null && board.doesPositionExist(nextPos)) {
board.addEntityAtSquare(this, nextPos);
board.clearCaseFrom(this, position);
Position oldPosition = new Position(position.x(), position.y());
this.position = nextPos;
if (board.doesSquareContainEntity(nextPos, Rock.class)) {
List<Entity> entities = board.getStates(nextPos).getEntities();
entities.removeIf(p -> p instanceof Rock);
}
List<Position> result = new ArrayList<>();
if (target != null)
result.add(target);
if (oldPosition != null)
result.add(oldPosition);
if (position != null)
result.add(position);
if (ennemy != null)
result.add(ennemy);
return result;
}
return List.of();
}
@Override
public Position getPosition() {
return this.position;
}
@Override
public void setPosition(Position p) {
this.position = p;
}
@Override
public int getAge() {
return this.age;
}
@Override
public void setAge(int age) {
this.age = age;
}
@Override
public void incrementAge() {
this.age += 1;
}
@Override
public Color getViewColor() {
return this.viewColor;
}
@Override
public int getPriority() {
return this.priority;
}
@Override
public ViewElement getViewElement() {
return new ViewElement(cloudImage);
}
}
package model.rockpapercisor;
import java.util.ArrayList;
import java.util.List;
import javafx.scene.paint.Color;
import model.Board;
import model.Entity;
import model.Square;
import model.firefighterscenario.Cloud;
import util.Position;
import util.PositionUtil;
import view.ViewElement;
public class Rock implements Entity {
private final int priority = 0;
Position position;
private int age;
private final Color viewColor = Color.CHOCOLATE;
private static javafx.scene.image.Image cloudImage;
static {
try {
cloudImage = new javafx.scene.image.Image(Cloud.class.getResource("/view/icons/pfc/rock.png").toExternalForm());
} catch (Exception e) {
e.printStackTrace();
}
}
public Rock(Position p) {
this.position = p;
}
public Rock(Position p, int age) {
this.position = p;
this.age = age;
}
@Override
public List<Position> nextTurn(Board<Square> board) {
Position target = null;
target = board.getNearestEntity(position, Cisor.class, null);
Position ennemy = null;
ennemy = board.getNearestEntity(position, Paper.class, null);
if(ennemy == null && target == null){
return List.of();
}
Position nextPos = null;
// Vérifier la proximité d'un ennemi avant de choisir la direction.
if (ennemy != null && PositionUtil.getManhattanDistance(position, ennemy) < 5) {
nextPos = PositionUtil.getNextPositionAwayFrom(position, ennemy, board);
} else if(target != null){
nextPos = PositionUtil.getNextPositionTowards(position, target, board);
}
if (nextPos != null && board.doesPositionExist(nextPos)) {
board.addEntityAtSquare(this, nextPos);
board.clearCaseFrom(this, position);
Position oldPosition = new Position(position.x(), position.y());
this.position = nextPos;
if (board.doesSquareContainEntity(nextPos, Cisor.class)) {
List<Entity> entities = board.getStates(nextPos).getEntities();
entities.removeIf(p -> p instanceof Cisor);
}
List<Position> result = new ArrayList<>();
if (target != null)
result.add(target);
if (oldPosition != null)
result.add(oldPosition);
if (position != null)
result.add(position);
if (ennemy != null)
result.add(ennemy);
return result;
}
return List.of();
}
@Override
public Position getPosition() {
return this.position;
}
@Override
public void setPosition(Position p) {
this.position = p;
}
@Override
public int getAge() {
return this.age;
}
@Override
public void setAge(int age) {
this.age = age;
}
@Override
public void incrementAge() {
this.age += 1;
}
@Override
public Color getViewColor() {
return this.viewColor;
}
@Override
public int getPriority() {
return this.priority;
}
@Override
public ViewElement getViewElement(){
return new ViewElement(cloudImage);
}
}
package model.rockpapercisor;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import model.Board;
import model.Entity;
import model.EntityFactory;
import model.Model;
import model.Scenario;
import model.Square;
import util.Position;
public class RockPaperCisorScenario extends Scenario implements Model{
public RockPaperCisorScenario(int columns, int rows, Map<EntityFactory, Integer> initialMap) {
super(columns, rows, initialMap);
}
public List<Position> updateToNextGeneration() {
ArrayList<Position> changedPositions = new ArrayList<>();
Iterator<Square> iterator = getMatrix().iterator();
while (iterator.hasNext()) {
Square s = iterator.next();
if (s.isEmpty())
continue;
if (s.getMaxAge() == 0) {
s.incrementAllAges();
continue;
}
if(s.getMaxAge()>stepNumber()+1){
continue;
}
List<Entity> entities = new ArrayList<>(s.getEntities());
for (Entity e : entities) {
e.incrementAge();
changedPositions.addAll(e.nextTurn(this));
}
}
// Increment the step counter
this.step = this.step + 1;
return changedPositions;
}
@Override
public Board<Square> getBoard() {
return this;
}
}
......@@ -6,6 +6,7 @@ import java.util.Iterator;
import java.util.NoSuchElementException;
import model.Square;
import model.doctorviruspatient.Patient;
import model.firefighterscenario.Fire;
import model.firefighterscenario.FireFighter;
......@@ -83,8 +84,11 @@ public class Matrix<E> implements Iterable<E> {
else if(s.getEntities().stream().anyMatch(p -> p instanceof FireFighter)){
System.out.print(" ff | ");
}
else if(s.getEntities().stream().anyMatch(p -> p instanceof FireFighter)){
System.out.print(" A | ");
else if(s.getEntities().stream().anyMatch(p -> p instanceof Patient)){
System.out.print(" P | ");
}
else if(s.getEntities().stream().anyMatch(p -> p instanceof model.doctorviruspatient.Virus)){
System.out.print(" V | ");
}else{
System.out.print(" | ");
}
......
......@@ -10,7 +10,7 @@ import java.util.Set;
import model.Board;
public class PathGenerator {
private final Board<?> board;
private Board<?> board;
private final Random random = new Random();
private final int maxStepsInDirection;
private final int minimumRoadLength;
......@@ -59,7 +59,9 @@ public class PathGenerator {
}
return roadLength >= minimumRoadLength ? path : regeneratePath();
}
public void setBoard(Board<?> board){
this.board = board;
}
/** Initialise le chemin avec l'ancre et choisit la première direction. */
private void initializePath() {
path.clear();
......
......@@ -2,11 +2,14 @@ package util;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import model.Board;
import model.Square;
import model.firefighterscenario.FireFighter;
import model.firefighterscenario.Mountain;
public class PositionUtil {
/**
......@@ -153,4 +156,169 @@ public class PositionUtil {
return positions;
}
public static Position getNextPositionTowards(Position currentPos, Position targetPos, Board<Square> b) {
// Generate adjacent positions
List<Position> possibleMoves = PositionUtil.generateAllAdjacentPositions(currentPos, b);
// Filter out positions that are not empty or contain obstacles
possibleMoves.removeIf(p -> b.doesSquareContainEntity(p, Mountain.class));
// If no possible moves, return null
if (possibleMoves.isEmpty()) {
return null;
}
// Calculate the current distance to the target
int currentDistance = PositionUtil.getManhattanDistance(currentPos, targetPos);
// Initialize variables to find the best moves
int minDistance = Integer.MAX_VALUE;
List<Position> bestMoves = new ArrayList<>();
for (Position move : possibleMoves) {
int distance = PositionUtil.getManhattanDistance(move, targetPos);
// Skip positions occupied by other firefighters
if (b.doesSquareContainEntity(move, FireFighter.class)) {
continue;
}
// Find positions that minimize the distance
if (distance < minDistance) {
minDistance = distance;
bestMoves.clear();
bestMoves.add(move);
} else if (distance == minDistance) {
bestMoves.add(move);
}
}
// If no better move is found, consider moves that maintain the same distance
if (bestMoves.isEmpty()) {
minDistance = currentDistance;
for (Position move : possibleMoves) {
int distance = PositionUtil.getManhattanDistance(move, targetPos);
if (distance == minDistance) {
bestMoves.add(move);
}
}
}
// If still no move is found, stay in the current position
if (bestMoves.isEmpty()) {
return currentPos;
}
// Select a move from the best moves (e.g., randomly or based on additional criteria)
Random r = new Random();
Position nextMove = bestMoves.get(r.nextInt(bestMoves.size()));
return nextMove;
}
public static Position getNextPositionAwayFrom(Position currentPos, Position targetPos, Board<Square> b) {
// Générer les positions adjacentes
List<Position> possibleMoves = PositionUtil.generateAllAdjacentPositions(currentPos, b);
// Filtrer les positions qui ne sont pas vides ou contiennent des obstacles
possibleMoves.removeIf(p -> b.doesSquareContainEntity(p, Mountain.class));
// Si aucune possibilité de déplacement, retourner null
if (possibleMoves.isEmpty()) {
return null;
}
// Calculer la distance actuelle par rapport à la cible
int currentDistance = PositionUtil.getManhattanDistance(currentPos, targetPos);
// Initialiser les variables pour trouver les meilleurs déplacements
int maxDistance = Integer.MIN_VALUE;
List<Position> bestMoves = new ArrayList<>();
for (Position move : possibleMoves) {
int distance = PositionUtil.getManhattanDistance(move, targetPos);
// Ignorer les positions occupées par d'autres entités, comme les pompiers
if (b.doesSquareContainEntity(move, FireFighter.class)) {
continue;
}
// Trouver les positions qui maximisent la distance
if (distance > maxDistance) {
maxDistance = distance;
bestMoves.clear();
bestMoves.add(move);
} else if (distance == maxDistance) {
bestMoves.add(move);
}
}
// Si aucun meilleur déplacement n'est trouvé, considérer les mouvements qui maintiennent la même distance
if (bestMoves.isEmpty()) {
maxDistance = currentDistance;
for (Position move : possibleMoves) {
int distance = PositionUtil.getManhattanDistance(move, targetPos);
if (distance == maxDistance) {
bestMoves.add(move);
}
}
}
// Si toujours aucun mouvement n'est trouvé, rester à la position actuelle
if (bestMoves.isEmpty()) {
return currentPos;
}
// Sélectionner un mouvement parmi les meilleurs mouvements (par exemple aléatoirement ou selon des critères supplémentaires)
Random r = new Random();
Position nextMove = bestMoves.get(r.nextInt(bestMoves.size()));
return nextMove;
}
public static Direction getOppositeDirection(Direction direction) {
switch (direction) {
case NORTH: return Direction.SOUTH;
case SOUTH: return Direction.NORTH;
case EAST: return Direction.WEST;
case WEST: return Direction.EAST;
default: throw new IllegalArgumentException("Direction non supportée : " + direction);
}
}
/**
* Détermine la direction principale (NORTH, SOUTH, EAST, WEST) de toPos par rapport à fromPos.
*
* @param fromPos la position de départ.
* @param toPos la position de destination.
* @return la direction principale de toPos par rapport à fromPos.
*/
public static Direction getDirectionFromTwoPoints(Position fromPos, Position toPos) {
int deltaX = toPos.x() - fromPos.x();
int deltaY = toPos.y() - fromPos.y();
if (deltaX == 0 && deltaY == 0) {
return null; // Les positions sont identiques
}
if (Math.abs(deltaX) > Math.abs(deltaY)) {
// Mouvement principalement vers l'Est ou l'Ouest
if (deltaX > 0) {
return Direction.EAST;
} else {
return Direction.WEST;
}
} else {
// Mouvement principalement vers le Nord ou le Sud
if (deltaY > 0) {
return Direction.SOUTH;
} else {
return Direction.NORTH;
}
}
}
}
\ No newline at end of file
package view;
import java.util.List;
import javafx.scene.canvas.Canvas;
import javafx.scene.image.Image;
import javafx.scene.paint.Color;
import javafx.util.Pair;
import util.Position;
public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
//private void paintElementAtPosition(ViewElement element, Position position) {
// paintBox(position.x(), position.y(), element.getColor());
//}
private void paintElementAtPosition(ViewElement element, Position position) {
// Efface la case pour éviter les superpositions
clearBox(position.x(), position.y());
// Vérifie si une image est définie dans l'élément
if (element.getImage() != null) {
Image image = element.getImage();
getGraphicsContext2D().drawImage(image, position.y() * boxWidth, position.x() * boxHeight, boxWidth, boxHeight);
} else {
paintBox(position.x(), position.y(), element.getColor());
}
}
private int boxWidth;
private int boxHeight;
private int columnCount;
......
package view;
import javafx.scene.image.Image;
import javafx.scene.paint.Color;
public class ViewElement {
private final Color color;
private final Image image;
// Constructeur avec couleur uniquement
public ViewElement(Color color) {
this.color = color;
this.image = null;
}
// Constructeur avec image
public ViewElement(Image image) {
this.color = null;
this.image = image;
}
public Color getColor() {
return color;
}
public Image getImage() {
return image;
}
}
src/main/resources/view/icons/fire/avion.png

26.4 KiB

src/main/resources/view/icons/fire/camion.png

24.6 KiB

src/main/resources/view/icons/fire/flamme.png

19.2 KiB

src/main/resources/view/icons/fire/img.png

356 B

src/main/resources/view/icons/fire/montagne.png

37.8 KiB

src/main/resources/view/icons/fire/nuage.png

66.7 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment