diff --git a/Jeu_2048/Case.qml b/Jeu_2048/Case.qml index 3344943b4ee56930ed0b1cdadfef7964148a8392..7c3f07c6693beab67f19ae66f71afbfc386b10e9 100644 --- a/Jeu_2048/Case.qml +++ b/Jeu_2048/Case.qml @@ -43,4 +43,11 @@ Rectangle { color: value <= 4 ? "#776e65" : "white" font.family: "Tahoma" } + Behavior on x { + NumberAnimation { duration: 120; easing.type: Easing.InOutQuad } + } + Behavior on y { + NumberAnimation { duration: 120; easing.type: Easing.InOutQuad } + + } } diff --git a/Jeu_2048/Main.qml b/Jeu_2048/Main.qml index c5f776bbb609dd7fb7d44a3f004aa7251aff0f34..b03ce543bbce10402560fb1499c972a9adfcc73d 100644 --- a/Jeu_2048/Main.qml +++ b/Jeu_2048/Main.qml @@ -6,6 +6,7 @@ Window { width: 600 height: 900 visible: true + property bool hasGameStarted: false StackView { id: stackView @@ -46,14 +47,17 @@ Window { Text { anchors.centerIn: parent - text: "Nouvelle Partie" + text: hasGameStarted ? "Reprendre la partie" : "Nouvelle Partie" font.pixelSize: 24 color: "white" } MouseArea { anchors.fill: parent - onClicked: stackView.push("Partie.qml") + onClicked: { + hasGameStarted = true + stackView.push("Partie.qml") + } } } diff --git a/Jeu_2048/Menu_de_Controle.qml b/Jeu_2048/Menu_de_Controle.qml index 5560aee72760e390f8f001f3163d06bc2ed5d055..2e3395789b2739c8fbb661967081b6e6bfe1eaf5 100644 --- a/Jeu_2048/Menu_de_Controle.qml +++ b/Jeu_2048/Menu_de_Controle.qml @@ -1,5 +1,159 @@ import QtQuick +import QtQuick.Controls +import QtQuick.Layouts Item { + id: controlMenu + width: 600 + height: 900 + property var themes: { + "Classique": { + bg: "#ffffff", + tiles: { + 2: "#eee4da", 4: "#ede0c8", 8: "#f2b179", + 16: "#f59563", 32: "#f67c5f", 64: "#f65e3b", + 128: "#edcf72", 256: "#edcc61", 512: "#edc850", + 1024: "#edc53f", 2048: "#edc22e" + }, + textColors: { + 2: "#776e65", 4: "#776e65", 8: "white", + 16: "white", 32: "white", 64: "white", + 128: "white", 256: "white", 512: "white", + 1024: "white", 2048: "white" + } + }, + "Sombre": { + bg: "#222222", + tiles: { + 2: "#444", 4: "#555", 8: "#666", + 16: "#777", 32: "#888", 64: "#999", + 128: "#aaa", 256: "#bbb", 512: "#ccc", + 1024: "#ddd", 2048: "#eee" + }, + textColors: { + 2: "white", 4: "white", 8: "white", + 16: "white", 32: "white", 64: "white", + 128: "black", 256: "black", 512: "black", + 1024: "black", 2048: "black" + } + }, + "Pastel": { + bg: "#fcefee", + tiles: { + 2: "#fae3e3", 4: "#f9dcdc", 8: "#f7d3d3", + 16: "#f5caca", 32: "#f3c2c2", 64: "#f1baba", + 128: "#efb2b2", 256: "#edadad", 512: "#eba6a6", + 1024: "#e9a0a0", 2048: "#e79a9a" + }, + textColors: { + 2: "#70475d", 4: "#70475d", 8: "#70475d", + 16: "#70475d", 32: "#70475d", 64: "#70475d", + 128: "#70475d", 256: "#70475d", 512: "#70475d", + 1024: "#70475d", 2048: "#70475d" + } + } + } + + property var selectedTheme: themes["Classique"] + + signal applyTheme(var theme) + + Rectangle { + anchors.fill: parent + color: "#f9f6f2" + + ColumnLayout { + anchors.centerIn: parent + spacing: 30 + + Text { + text: "Personnalisation" + font.pixelSize: 28 + font.bold: true + horizontalAlignment: Text.AlignHCenter + Layout.alignment: Qt.AlignHCenter + } + + ComboBox { + id: themeSelector + model: Object.keys(themes) + Layout.alignment: Qt.AlignHCenter + Layout.preferredWidth: 250 + onCurrentTextChanged: { + selectedTheme = themes[themeSelector.currentText] + } + } + + Rectangle { + width: 260 + height: 260 + radius: 15 + color: selectedTheme.bg + border.color: "#aaa" + Layout.alignment: Qt.AlignHCenter + + Grid { + anchors.centerIn: parent + columns: 4 + spacing: 8 + + Repeater { + model: [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] + Rectangle { + width: 50 + height: 50 + radius: 6 + color: selectedTheme.tiles[modelData] || "#ccc" + + Text { + anchors.centerIn: parent + text: modelData + color: selectedTheme.textColors[modelData] || "black" + font.pixelSize: 14 + font.bold: true + } + } + } + } + } + + Rectangle { + width: 300 + height: 60 + radius: 10 + color: "#8f7a66" + Layout.alignment: Qt.AlignHCenter + Text { + anchors.centerIn: parent + text: "Appliquer le thème" + color: "white" + font.pixelSize: 20 + } + MouseArea { + anchors.fill: parent + onClicked: applyTheme(selectedTheme) + } + } + + + Rectangle { + width: 300 + height: 60 + radius: 10 + color: "#8f7a66" + Layout.alignment: Qt.AlignHCenter + Text { + anchors.centerIn: parent + text: "Retour au menu principal" + color: "white" + font.pixelSize: 20 + } + MouseArea { + anchors.fill: parent + onClicked: stackView.pop() + } + } + } + } } diff --git a/Jeu_2048/Partie.qml b/Jeu_2048/Partie.qml index d9eb731c8db8b0885acffc2ef807be7e4983936b..7c5807cc672ce536a2fc4dd4eb7b275bf60b2622 100644 --- a/Jeu_2048/Partie.qml +++ b/Jeu_2048/Partie.qml @@ -1,14 +1,22 @@ -import QtQuick -import QtQuick.Controls - +import QtQuick 2.15 +import QtQuick.Controls 2.15 Item { id: _item width: 600 height: 900 - Component.onCompleted: _item.forceActiveFocus() + focus: true + Component.onCompleted: _item.forceActiveFocus() + Keys.onPressed: function(event) { + switch (event.key) { + case Qt.Key_Left: game.moveLeft(); break; + case Qt.Key_Right: game.moveRight(); break; + case Qt.Key_Up: game.moveUp(); break; + case Qt.Key_Down: game.moveDown(); break; + } + } Rectangle { id: background @@ -25,20 +33,69 @@ Item { anchors.horizontalCenter: parent.horizontalCenter Grid { + id: backgroundGrid + rows: 4 columns: 4 - spacing: 10 + rowSpacing: 10 + columnSpacing: 10 anchors.centerIn: parent Repeater { - model: game.board.length + model: 16 + Rectangle { + width: 100 + height: 100 + radius: 8 + color: "#cdc1b4" + } + } + } + + Item { + id: tileLayer + width: parent.width + height: parent.height + anchors.centerIn: parent + + Repeater { + id: tileRepeater + model: 16 + Case { - value: game.board[index] + id: tile + width: 100 + height: 100 + + property int row: Math.floor(index / 4) + property int col: index % 4 + property int valueFromBoard: game.board[index] + value: valueFromBoard + + x: col * (width + 10) + 35 + y: row * (height + 10) + 35 + + Behavior on x { + NumberAnimation { duration: 150; easing.type: Easing.InOutQuad } + } + Behavior on y { + NumberAnimation { duration: 150; easing.type: Easing.InOutQuad } + } + + // Apparition douce + opacity: value > 0 ? 1 : 0 + scale: value > 0 ? 1 : 0.8 + + Behavior on opacity { + NumberAnimation { duration: 150 } + } + Behavior on scale { + NumberAnimation { duration: 150; easing.type: Easing.OutBack } + } } } } } - Rectangle { id: icon_rectangle x: 50; y: 50; width: 200; height: 150 @@ -48,7 +105,9 @@ Item { id: icon_text anchors.centerIn: parent color: "#ffffff"; text: "2048" - font.pixelSize: 50; font.bold: true; font.family: "Tahoma" + font.pixelSize: 50 + font.bold: true + font.family: "Tahoma" } } @@ -58,44 +117,45 @@ Item { color: "#3c3a33"; radius: 15 Text { text: "Score"; y: 2; color: "#c1c1c1"; font.pixelSize: 20; anchors.horizontalCenter: parent.horizontalCenter } - Text { id: current_score; y: 28; color: "#ffffff"; text: game.score; font.pixelSize: 25; font.family: "Tahoma"; anchors.horizontalCenter: parent.horizontalCenter } } Rectangle { id: best_score_rectangle x: 420; y: 50; width: 130; height: 65 - color: "#8f7a66"; radius: 15 + color: "#bbada0"; radius: 15 Text { text: "Best"; y: 2; color: "#c1c1c1"; font.pixelSize: 20; anchors.horizontalCenter: parent.horizontalCenter } - Text { id: best_score; y: 28; color: "#ffffff"; text: game.bestScore; font.pixelSize: 25; font.family: "Tahoma"; anchors.horizontalCenter: parent.horizontalCenter } } Rectangle { id: new_rectangle - x: 270; y: 125; width: 130; height: 65 + x: 270; y: 135; width: 130; height: 65 color: "#f65e3d"; radius: 15 Text { text: "NEW"; color: "#ffffff"; font.pixelSize: 30; font.family: "Tahoma"; anchors.centerIn: parent } MouseArea { - anchors.fill: parent - onClicked: { - game.resetGame() - join_the_numbers_text.text = "Join the numbers and get the 2048 tile!" - } + anchors.fill: parent + onClicked: { + game.resetGame() + join_the_numbers_text.text = "Join the numbers and get the 2048 tile!" } + } } Rectangle { id: menu_rectangle - x: 420; y: 125; width: 130; height: 65 - color: "#6a9eda"; radius: 15 + x: 420; y: 135; width: 130; height: 65 + color: "#8f7a66"; radius: 15 Text { text: "MENU"; color: "#ffffff"; font.pixelSize: 30; font.family: "Tahoma"; anchors.centerIn: parent } - MouseArea { anchors.fill: parent; onClicked: console.log("Menu clicked") /* À implémenter */ } + MouseArea { + anchors.fill: parent + onClicked: stackView.pop() + } } Text { @@ -103,24 +163,14 @@ Item { x: 50; y: 225; width: 500; height: 50 text: "Join the numbers and get the 2048 tile!" font.pixelSize: 20; font.bold: true; horizontalAlignment: Text.AlignHCenter - Connections { - target: game - - function onGameOver() { - join_the_numbers_text.text = "Game Over !" - console.log("Signal GAME OVER reçu") - } - } } } - focus: true - Keys.onPressed: function(event) { - switch(event.key) { - case Qt.Key_Left: game.moveLeft(); break; - case Qt.Key_Right: game.moveRight(); break; - case Qt.Key_Up: game.moveUp(); break; - case Qt.Key_Down: game.moveDown(); break; + Connections { + target: game + function onGameOver() { + join_the_numbers_text.text = "Game Over !" + console.log("Signal GAME OVER reçu") } } }