diff --git a/TestV1/src/Controller/MenuController.java b/TestV1/src/Controller/MenuController.java new file mode 100644 index 0000000..eeb1df2 --- /dev/null +++ b/TestV1/src/Controller/MenuController.java @@ -0,0 +1,36 @@ +package Controller; // Spécifie que cette classe fait partie du package Controller + +import Model.MenuModel; // Importer la classe MenuModel +import View.MenuView; + +import javax.swing.*; + +public class MenuController { + private MenuModel model; + private MenuView view; + + public MenuController(MenuModel model, MenuView view) { + this.model = model; + this.view = view; + } + + public void run() { + view.setVisible(true); + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + // Initialiser le modèle avec le chemin de l'image + MenuModel model = new MenuModel("../res/fond-ecran.jpg"); + + // Créer la vue en lui passant l'image de fond + MenuView view = new MenuView(model); + + // Démarrer le contrôleur + new MenuController(model, view).run(); + } + }); + } +} diff --git a/TestV1/src/Makefile b/TestV1/src/Makefile new file mode 100644 index 0000000..2528e43 --- /dev/null +++ b/TestV1/src/Makefile @@ -0,0 +1,62 @@ +### VARIABLES ### + +JC = javac +JCFLAGS = -encoding UTF-8 -implicit:none + +JVM = java +JVMFLAGS = + +# Chemins des dossiers +SRC_CONTROLLER = Controller +SRC_MODEL = Model +SRC_VIEW = View + +# Cibles pour chaque fichier .class avec leurs chemins respectifs +CONTROLLER_CLASS = $(SRC_CONTROLLER)/MenuController.class +MODEL_CLASS = $(SRC_MODEL)/MenuModel.class +VIEW_CLASS = $(SRC_VIEW)/MenuView.class +PANEL_CLASS = $(SRC_VIEW)/PanneauImage.class +TITRE_CLASS = $(SRC_VIEW)/TitreView.class +BOUTON_CLASS = $(SRC_VIEW)/BoutonView.class +### REGLES ESSENTIELLES ### + +# Règle pour compiler MenuController +$(CONTROLLER_CLASS): $(SRC_CONTROLLER)/MenuController.java $(MODEL_CLASS) $(VIEW_CLASS) $(PANEL_CLASS) $(TITRE_CLASS) $(BOUTON_CLASS) + ${JC} ${JCFLAGS} -d . $(SRC_CONTROLLER)/MenuController.java + +# Règle pour compiler MenuModel +$(MODEL_CLASS): $(SRC_MODEL)/MenuModel.java + ${JC} ${JCFLAGS} -d . $(SRC_MODEL)/MenuModel.java + +# Règle pour compiler MenuView +$(VIEW_CLASS): $(SRC_VIEW)/MenuView.java $(PANEL_CLASS) $(TITRE_CLASS) $(BOUTON_CLASS) + ${JC} ${JCFLAGS} -d . $(SRC_VIEW)/MenuView.java + +# Règle pour compiler PanneauImage +$(PANEL_CLASS): $(SRC_VIEW)/PanneauImage.java + ${JC} ${JCFLAGS} -d . $(SRC_VIEW)/PanneauImage.java + +# Règle pour compiler TitreView +$(TITRE_CLASS): $(SRC_VIEW)/TitreView.java # Règle pour compiler TitreView + ${JC} ${JCFLAGS} -d . $(SRC_VIEW)/TitreView.java + +# Règle pour compiler BoutonView +$(TITRE_CLASS): $(SRC_VIEW)/BoutonView.java # Règle pour compiler TitreView + ${JC} ${JCFLAGS} -d . $(SRC_VIEW)/BoutonView.java + +### REGLES OPTIONNELLES ### + +# Règle pour exécuter l'application +run: $(CONTROLLER_CLASS) + ${JVM} ${JVMFLAGS} Controller.MenuController + +# Règle pour nettoyer les fichiers .class +clean: + -rm -f $(SRC_CONTROLLER)/*.class $(SRC_MODEL)/*.class $(SRC_VIEW)/*.class + +# Règle pour tout nettoyer et recompiler +mrproper: clean $(CONTROLLER_CLASS) + +### BUTS FACTICES ### + +.PHONY: run clean mrproper diff --git a/TestV1/src/Model/MenuModel.java b/TestV1/src/Model/MenuModel.java new file mode 100644 index 0000000..b2ab41d --- /dev/null +++ b/TestV1/src/Model/MenuModel.java @@ -0,0 +1,23 @@ +package Model; + +import java.awt.Image; +import java.io.File; +import java.io.IOException; +import javax.imageio.ImageIO; + +public class MenuModel { + private Image imageDeFond; + + public MenuModel(String imagePath) { + // Charger l'image de fond + try { + imageDeFond = ImageIO.read(new File("../res/fond-ecran.jpg!d")); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public Image getImageDeFond() { + return imageDeFond; + } +} diff --git a/TestV1/src/View/BoutonView.java b/TestV1/src/View/BoutonView.java new file mode 100644 index 0000000..8645a09 --- /dev/null +++ b/TestV1/src/View/BoutonView.java @@ -0,0 +1,19 @@ +package View; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionListener; + +public class BoutonView extends JButton { + public BoutonView(String texte) { + super(texte); + + setFont(new Font("Arial", Font.BOLD, 40)); + setForeground(Color.WHITE); // Couleur du texte blanc + setFocusPainted(false); // Enlever le focus sur le bouton + setBorderPainted(false); // Enlever la bordure par défaut + setContentAreaFilled(false); // Fond transparent + setOpaque(false); // Ne dessine pas le fond par défaut + + } +} diff --git a/TestV1/src/View/MenuView.java b/TestV1/src/View/MenuView.java new file mode 100644 index 0000000..34a2d46 --- /dev/null +++ b/TestV1/src/View/MenuView.java @@ -0,0 +1,51 @@ +package View; + +import javax.swing.*; +import java.awt.*; +import Model.MenuModel; + +public class MenuView extends JFrame { + private PanneauImage panneauImage; + private TitreView titreView; + private BoutonView boutonJouer; + private BoutonView boutonCommentJouer; + private BoutonView boutonQuitter; + + public MenuView(MenuModel model) { + + setTitle("Dorfromantik"); + setSize(800, 600); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setLocationRelativeTo(null); + + panneauImage = new PanneauImage(model.getImageDeFond()); + setContentPane(panneauImage); + titreView = new TitreView(); + + JPanel panelTitre = new JPanel(new FlowLayout(FlowLayout.CENTER)); + panelTitre.setOpaque(false); + panelTitre.add(titreView.getTitre()); + + setLayout(new BorderLayout()); + add(panelTitre, BorderLayout.NORTH); + + JPanel panelBouton = new JPanel(); + panelBouton.setOpaque(false); // Panneau transparent pour ne pas couvrir l'image de fond + panelBouton.setLayout(new BoxLayout(panelBouton, BoxLayout.Y_AXIS)); // Disposition verticale + + // Initialisation des boutons + boutonJouer = new BoutonView("Jouer"); + boutonCommentJouer = new BoutonView("Comment Jouer ?"); + boutonQuitter = new BoutonView("Quitter"); + + panelBouton.add(boutonJouer); + panelBouton.add(Box.createVerticalStrut(10)); // Espace entre les boutons + panelBouton.add(boutonCommentJouer); + panelBouton.add(Box.createVerticalStrut(10)); // Espace entre les boutons + panelBouton.add(boutonQuitter); + + add(panelBouton, BorderLayout.SOUTH); + + setVisible(true); + } +} diff --git a/TestV1/src/View/PanneauImage.java b/TestV1/src/View/PanneauImage.java new file mode 100644 index 0000000..610c7d2 --- /dev/null +++ b/TestV1/src/View/PanneauImage.java @@ -0,0 +1,20 @@ +package View; + +import javax.swing.*; +import java.awt.*; + +public class PanneauImage extends JPanel { + private Image imageDeFond; + + public PanneauImage(Image image) { + this.imageDeFond = image; + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + if (imageDeFond != null) { + g.drawImage(imageDeFond, 0, 0, getWidth(), getHeight(), this); + } + } +} diff --git a/TestV1/src/View/TitreView.java b/TestV1/src/View/TitreView.java new file mode 100644 index 0000000..134a749 --- /dev/null +++ b/TestV1/src/View/TitreView.java @@ -0,0 +1,68 @@ +package View; + +import javax.swing.*; +import java.awt.*; + +public class TitreView { + private ContourLabel titre; + + public TitreView() { + // Créer une instance de ContourLabel avec le texte souhaité + titre = new ContourLabel("Dorfromantik"); + + // Définir la police et les couleurs + titre.setFont(new Font("Algerian", Font.BOLD, 70)); + titre.setForeground(Color.WHITE); // Couleur du texte principal + titre.setContourColor(Color.BLACK); // Couleur du contour + titre.setContourThickness(4); // Épaisseur du contour + } + + public JLabel getTitre() { + return titre; + } + + // Classe interne pour gérer le contour autour du texte + private static class ContourLabel extends JLabel { + private Color contourColor = Color.BLACK; + private int contourThickness = 2; + + public ContourLabel(String text) { + super(text); + } + + public void setContourColor(Color contourColor) { + this.contourColor = contourColor; + } + + public void setContourThickness(int contourThickness) { + this.contourThickness = contourThickness; + } + + @Override + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g.create(); + + // Activer l'anti-aliasing + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + // Dessiner le contour + g2d.setFont(getFont()); + g2d.setColor(contourColor); + g2d.setStroke(new BasicStroke(contourThickness, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); + FontMetrics fm = g2d.getFontMetrics(); + int x = 0; + int y = fm.getAscent(); + g2d.draw(getTextShape(g2d, getText(), x, y)); + + // Dessiner le texte principal + g2d.setColor(getForeground()); + g2d.fill(getTextShape(g2d, getText(), x, y)); + + g2d.dispose(); + } + + private Shape getTextShape(Graphics2D g2d, String text, int x, int y) { + return getFont().createGlyphVector(g2d.getFontRenderContext(), text).getOutline(x, y); + } + } +}