From 29c9f65c9d2b67f7f7286863225bbdb36b84313b Mon Sep 17 00:00:00 2001 From: "louis.dufour" Date: Fri, 14 Jun 2024 15:26:44 +0200 Subject: [PATCH] Update(NewDesign): quasi finit --- .DS_Store | Bin 8196 -> 8196 bytes ArkitDoushiQi/ArkitDoushiQi/AvatarView.swift | 20 ------ .../ArkitDoushiQi/Game/GameScene.swift | 61 +++++++++--------- .../ArkitDoushiQi/Game/GameView.swift | 45 +++++++++++-- .../ArkitDoushiQi/InfoDetailView.swift | 42 ------------ .../ArkitDoushiQi/PlayerDetailView.swift | 1 - .../ArkitDoushiQi/PlayerListView.swift | 29 --------- .../ArkitDoushiQi/PlayerProfileView.swift | 43 ------------ ArkitDoushiQi/ArkitDoushiQi/RankingView.swift | 40 ------------ .../Controls/EditImageComponent.swift | 57 ++++++---------- .../Components/Visuals}/InfoTextView.swift | 0 .../Components/Visuals/ProfileEdit.swift | 39 ++++++++--- .../Views/Extension/Placeholder.swift | 0 .../Views/GameParametersMenuView.swift | 9 +-- ArkitDoushiQi/Picker.swift | 20 ------ 15 files changed, 126 insertions(+), 280 deletions(-) delete mode 100644 ArkitDoushiQi/ArkitDoushiQi/AvatarView.swift delete mode 100644 ArkitDoushiQi/ArkitDoushiQi/InfoDetailView.swift delete mode 100644 ArkitDoushiQi/ArkitDoushiQi/PlayerDetailView.swift delete mode 100644 ArkitDoushiQi/ArkitDoushiQi/PlayerListView.swift delete mode 100644 ArkitDoushiQi/ArkitDoushiQi/PlayerProfileView.swift delete mode 100644 ArkitDoushiQi/ArkitDoushiQi/RankingView.swift rename ArkitDoushiQi/ArkitDoushiQi/{ => Views/Components/Visuals}/InfoTextView.swift (100%) create mode 100644 ArkitDoushiQi/ArkitDoushiQi/Views/Extension/Placeholder.swift delete mode 100644 ArkitDoushiQi/Picker.swift diff --git a/.DS_Store b/.DS_Store index 6492ea0e8f3894c4afdf4342921158f71a78be2e..e5e731803fa983718975400a6b889d83dcfb97b2 100644 GIT binary patch delta 70 zcmZp1XmQx!A;`FMvZr97hGccMk)ffEf{BS~t&T#qp|P2Tj)IxFQEe?Jhp4i?bx?eE aPHtX)_vD9y@{B#38HK8uHrI-@a{~a?=oGU6 delta 38 ucmZp1XmQx!Avk%HP$`F{iHVMap@H#aePR2_N`lgx6@+4$HrI%Ba03A2hYI!p diff --git a/ArkitDoushiQi/ArkitDoushiQi/AvatarView.swift b/ArkitDoushiQi/ArkitDoushiQi/AvatarView.swift deleted file mode 100644 index 6db41eb..0000000 --- a/ArkitDoushiQi/ArkitDoushiQi/AvatarView.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// AvatarView.swift -// WtaTennis -// -// Created by Johan LACHENAL on 14/05/2024. -// - -import SwiftUI - -struct AvatarView: View { - var body: some View { - Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) - } -} - -struct AvatarView_Previews: PreviewProvider { - static var previews: some View { - AvatarView() - } -} diff --git a/ArkitDoushiQi/ArkitDoushiQi/Game/GameScene.swift b/ArkitDoushiQi/ArkitDoushiQi/Game/GameScene.swift index 9647e4e..6c15bfb 100644 --- a/ArkitDoushiQi/ArkitDoushiQi/Game/GameScene.swift +++ b/ArkitDoushiQi/ArkitDoushiQi/Game/GameScene.swift @@ -9,46 +9,45 @@ import Foundation import SpriteKit import DouShouQiModel -class GameScene : SKScene { - - let imageBoard:SKSpriteNode = SKSpriteNode(imageNamed: "board") - - - var pieces: [Owner : [SpriteMoople]] = [ .player1 : [ SpriteMoople(nameImage: "catMeeple", couleur: .red), - SpriteMoople(nameImage: "dogMeeple", couleur: .red), - SpriteMoople(nameImage: "leopardMeeple", couleur: .red), - SpriteMoople(nameImage: "lionMeeple", couleur: .red), - SpriteMoople(nameImage: "ratMeeple", couleur: .red), - SpriteMoople(nameImage: "wolfMeeple", couleur: .red)], - .player2 : [ SpriteMoople(nameImage: "catMeeple", couleur: .blue), - SpriteMoople(nameImage: "dogMeeple", couleur: .blue), - SpriteMoople(nameImage: "leopardMeeple", couleur: .blue), - SpriteMoople(nameImage: "lionMeeple", couleur: .blue), - SpriteMoople(nameImage: "ratMeeple", couleur: .blue), - SpriteMoople(nameImage: "wolfMeeple", couleur: .blue)]] - - override init(size: CGSize) { +class GameScene: SKScene { + let imageBoard: SKSpriteNode = SKSpriteNode(imageNamed: "board") + var player1Name: String + var player1Image: UIImage + var player2Name: String + var player2Image: UIImage + + var pieces: [Owner: [SpriteMoople]] = [ + .player1: [SpriteMoople(nameImage: "catMeeple", couleur: .red), + SpriteMoople(nameImage: "dogMeeple", couleur: .red), + SpriteMoople(nameImage: "leopardMeeple", couleur: .red), + SpriteMoople(nameImage: "lionMeeple", couleur: .red), + SpriteMoople(nameImage: "ratMeeple", couleur: .red), + SpriteMoople(nameImage: "wolfMeeple", couleur: .red)], + .player2: [SpriteMoople(nameImage: "catMeeple", couleur: .blue), + SpriteMoople(nameImage: "dogMeeple", couleur: .blue), + SpriteMoople(nameImage: "leopardMeeple", couleur: .blue), + SpriteMoople(nameImage: "lionMeeple", couleur: .blue), + SpriteMoople(nameImage: "ratMeeple", couleur: .blue), + SpriteMoople(nameImage: "wolfMeeple", couleur: .blue)] + ] + + init(size: CGSize, player1Name: String, player1Image: UIImage, player2Name: String, player2Image: UIImage) { + self.player1Name = player1Name + self.player1Image = player1Image + self.player2Name = player2Name + self.player2Image = player2Image super.init(size: size) - // -- -- // scaleMode = .aspectFit anchorPoint = CGPoint(x: 0.5, y: 0.5) self.addChild(imageBoard) - // -- -- // - for c in pieces.flatMap({ _,values in return values }) - { - self.addChild(c) + for piece in pieces.flatMap({ $0.value }) { + self.addChild(piece) } - - } - - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) + fatalError("init(coder:) has not been implemented") } } - diff --git a/ArkitDoushiQi/ArkitDoushiQi/Game/GameView.swift b/ArkitDoushiQi/ArkitDoushiQi/Game/GameView.swift index 427396b..0a277fe 100644 --- a/ArkitDoushiQi/ArkitDoushiQi/Game/GameView.swift +++ b/ArkitDoushiQi/ArkitDoushiQi/Game/GameView.swift @@ -9,16 +9,53 @@ import SwiftUI import SpriteKit struct GameView: View { - - var game:GameScene = GameScene(size: CGSize(width: 940, height: 740)) + var player1Name: String + var player1Image: UIImage + var player2Name: String + var player2Image: UIImage var body: some View { - SpriteView(scene: game) + ZStack { + SpriteView(scene: GameScene(size: CGSize(width: 940, height: 740), player1Name: player1Name, player1Image: player1Image, player2Name: player2Name, player2Image: player2Image)) + .edgesIgnoringSafeArea(.all) + + VStack { + HStack { + VStack { + Image(uiImage: player1Image) + .resizable() + .aspectRatio(contentMode: .fill) // Assure que l'image remplit le cercle + .frame(width: 125, height: 125) + .clipShape(Circle()) + .overlay(Circle().stroke(Color.red, lineWidth: 2)) + + Text(player1Name) + .font(.headline) + .foregroundColor(.white) + } + Spacer() + VStack { + Image(uiImage: player2Image) + .resizable() + .aspectRatio(contentMode: .fill) // Assure que l'image remplit le cercle + .frame(width: 125, height: 125) + .clipShape(Circle()) + .overlay(Circle().stroke(Color.blue, lineWidth: 2)) + + Text(player2Name) + .font(.headline) + .foregroundColor(.white) + } + } + .padding() + Spacer() + } + } } } struct GameView_Previews: PreviewProvider { static var previews: some View { - GameView() + GameView(player1Name: "Player 1", player1Image: UIImage(named: "profil")!, player2Name: "Player 2", player2Image: UIImage(named: "profil")!) } } diff --git a/ArkitDoushiQi/ArkitDoushiQi/InfoDetailView.swift b/ArkitDoushiQi/ArkitDoushiQi/InfoDetailView.swift deleted file mode 100644 index 899aa57..0000000 --- a/ArkitDoushiQi/ArkitDoushiQi/InfoDetailView.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// InfoDetailView.swift -// WtaTennis -// -// Created by Johan LACHENAL on 14/05/2024. -// - -import SwiftUI - -struct InfoDetailView: View { - var body: some View { - ZStack { - Color.purple.edgesIgnoringSafeArea(.all) - VStack(alignment: .leading, spacing: 20) { - Text("Iga Swiatek") - .font(.largeTitle) - .fontWeight(.bold) - .foregroundColor(.white) - - HStack { - Image(systemName: "flag.fill") - .foregroundColor(.white) - Text("POLAND") - .foregroundColor(.white) - } - - InfoTextView(title: "Height", value: "5' 9\"") - InfoTextView(title: "Age", value: "22") - InfoTextView(title: "Plays", value: "Right-Handed") - InfoTextView(title: "Birthplace", value: "Warsaw, Poland") - } - .padding() - } - } -} - -struct InfoDetailView_Previews: PreviewProvider { - static var previews: some View { - InfoDetailView() - } -} - diff --git a/ArkitDoushiQi/ArkitDoushiQi/PlayerDetailView.swift b/ArkitDoushiQi/ArkitDoushiQi/PlayerDetailView.swift deleted file mode 100644 index 8b13789..0000000 --- a/ArkitDoushiQi/ArkitDoushiQi/PlayerDetailView.swift +++ /dev/null @@ -1 +0,0 @@ - diff --git a/ArkitDoushiQi/ArkitDoushiQi/PlayerListView.swift b/ArkitDoushiQi/ArkitDoushiQi/PlayerListView.swift deleted file mode 100644 index ef31643..0000000 --- a/ArkitDoushiQi/ArkitDoushiQi/PlayerListView.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// PlayerListView.swift -// WtaTennis -// -// Created by Johan LACHENAL on 14/05/2024. -// - -import SwiftUI - -struct PlayerListView: View { - @ObservedObject var viewModel: PlayerViewModel - - var body: some View { - NavigationStack { - List(viewModel.players, id: \.id) { player in - PlayerProfileView(player: player) - .padding(.vertical, 5) - } - .navigationTitle("Top Players") - } - } -} - - -struct PlayerListView_Previews: PreviewProvider { - static var previews: some View { - PlayerListView(viewModel: PlayerViewModel()) - } -} diff --git a/ArkitDoushiQi/ArkitDoushiQi/PlayerProfileView.swift b/ArkitDoushiQi/ArkitDoushiQi/PlayerProfileView.swift deleted file mode 100644 index 98cd410..0000000 --- a/ArkitDoushiQi/ArkitDoushiQi/PlayerProfileView.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// ItemCollectionPlayer.swift -// WtaTennis -// -// Created by Johan LACHENAL on 14/05/2024. -// - -import SwiftUI - -struct PlayerProfileView: View { - - var body: some View { - HStack(spacing: 15) { - Text("1") // \(player.rank) - .font(.largeTitle) - .fontWeight(.bold) - .foregroundColor(.purple) - - Image("Image") - .resizable() - .aspectRatio(contentMode: .fill) - .frame(width: 50, height: 50) - .clipShape(Circle()) - - Text("Iga Swiatek") - .font(.title2) - .fontWeight(.semibold) - - Spacer() - - Label(" France ", systemImage: "flag.fill") - .labelStyle(.titleAndIcon) - .foregroundColor(.red) - } - .padding(.horizontal) - } -} - -struct PlayerProfileView_Previews: PreviewProvider { - static var previews: some View { - PlayerProfileView() - } -} diff --git a/ArkitDoushiQi/ArkitDoushiQi/RankingView.swift b/ArkitDoushiQi/ArkitDoushiQi/RankingView.swift deleted file mode 100644 index 40cd95a..0000000 --- a/ArkitDoushiQi/ArkitDoushiQi/RankingView.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// RankingView.swift -// WtaTennis -// -// Created by Johan LACHENAL on 14/05/2024. -// - -import SwiftUI - -struct RankingView: View { - - var body : some View { - ZStack() - { - Rectangle() - .fill(Color.purple) // Rectangle violet - .frame(height: 200) // Ajustez la hauteur du rectangle comme nécessaire - - VStack(alignment: .leading, spacing: 20) { - Text("RANKING") // TODO : penser à créer un style pour les textes - .font(.title) - .foregroundColor(.white) - Text("1") - .font(.largeTitle) - .fontWeight(.bold) - .foregroundColor(.white) - Text("Singles") - .font(.title2) - .foregroundColor(.white) - } - .padding() // Ajoutez un padding pour éloigner le texte des bords du rectangle - } - } -} - -struct RankingView_Previews: PreviewProvider { - static var previews: some View { - RankingView() - } -} diff --git a/ArkitDoushiQi/ArkitDoushiQi/Views/Components/Controls/EditImageComponent.swift b/ArkitDoushiQi/ArkitDoushiQi/Views/Components/Controls/EditImageComponent.swift index 8d49488..e9253c4 100644 --- a/ArkitDoushiQi/ArkitDoushiQi/Views/Components/Controls/EditImageComponent.swift +++ b/ArkitDoushiQi/ArkitDoushiQi/Views/Components/Controls/EditImageComponent.swift @@ -9,47 +9,33 @@ import SwiftUI import PhotosUI struct EditImageComponent: View { - @State private var avatarItem: PhotosPickerItem? - @State private var avatarImage: Image? let color: Color let profileWidth: CGFloat let profileHeight: CGFloat let defaultImage: Image let imageTextChange: LocalizedStringKey + @Binding var playerImage: UIImage + @State private var selectedImageItem: PhotosPickerItem? = nil var body: some View { HStack { - VStack { - HStack { - GeometryReader { geometry in - ZStack { - // Background color - color - - // Profile Image - ProfileComponent(color: color, profileWidth: profileWidth, profileHeight: profileHeight, image: avatarImage ?? defaultImage) - } - // Ensure the ZStack takes the size of the GeometryReader - .frame(width: geometry.size.width, height: geometry.size.height) - .clipShape(Circle()) - } - .aspectRatio(1, contentMode: .fit) - .frame(width: profileWidth, height: profileHeight) // Optional fixed size - - PhotosPicker(selection: $avatarItem, matching: .images) { - Text(imageTextChange) - } - .onChange(of: avatarItem) { newValue in - if let newItem = newValue { - Task { - if let data = try? await newItem.loadTransferable(type: Data.self), - let uiImage = UIImage(data: data) { - avatarImage = Image(uiImage: uiImage) - } else { - print("Failed to load image") - } - } - } + Image(uiImage: playerImage) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: profileWidth, height: profileHeight) + .clipShape(Circle()) + .overlay(Circle().stroke(color, lineWidth: 2)) + + PhotosPicker(selection: $selectedImageItem, matching: .images) { + Text(imageTextChange) + .foregroundColor(.blue) + .padding(.leading) + } + .onChange(of: selectedImageItem) { newItem in + Task { + if let data = try? await newItem?.loadTransferable(type: Data.self), + let uiImage = UIImage(data: data) { + playerImage = uiImage } } } @@ -64,9 +50,8 @@ struct EditImageComponent_Previews: PreviewProvider { profileWidth: 100, profileHeight: 100, defaultImage: Image("profil"), - imageTextChange: LocalizedStringKey("Changer d'avatar") + imageTextChange: "Changer l'avatar", + playerImage: .constant(UIImage(named: "profil")!) ) - .previewLayout(.sizeThatFits) - .padding() } } diff --git a/ArkitDoushiQi/ArkitDoushiQi/InfoTextView.swift b/ArkitDoushiQi/ArkitDoushiQi/Views/Components/Visuals/InfoTextView.swift similarity index 100% rename from ArkitDoushiQi/ArkitDoushiQi/InfoTextView.swift rename to ArkitDoushiQi/ArkitDoushiQi/Views/Components/Visuals/InfoTextView.swift diff --git a/ArkitDoushiQi/ArkitDoushiQi/Views/Components/Visuals/ProfileEdit.swift b/ArkitDoushiQi/ArkitDoushiQi/Views/Components/Visuals/ProfileEdit.swift index 1fe27f0..26f7fab 100644 --- a/ArkitDoushiQi/ArkitDoushiQi/Views/Components/Visuals/ProfileEdit.swift +++ b/ArkitDoushiQi/ArkitDoushiQi/Views/Components/Visuals/ProfileEdit.swift @@ -6,6 +6,7 @@ // import SwiftUI +import PhotosUI struct ProfileEdit: View, KeyboardReadable { let color: Color @@ -15,19 +16,37 @@ struct ProfileEdit: View, KeyboardReadable { let imageTextChange: LocalizedStringKey let playerNameKey: LocalizedStringKey @Binding var playerName: String + @Binding var playerImage: UIImage + @State private var selectedImageItem: PhotosPickerItem? = nil @State private var keyboardHeight: CGFloat = 0 @State private var isKeyboardVisible: Bool = false var body: some View { VStack(alignment: .leading) { - EditImageComponent( - color: color, - profileWidth: profileWidth, - profileHeight: profileHeight, - defaultImage: defaultImage, - imageTextChange: imageTextChange - ).padding(.horizontal) - + HStack { + Image(uiImage: playerImage) + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: profileWidth, height: profileHeight) + .clipShape(Circle()) + .overlay(Circle().stroke(color, lineWidth: 2)) + + PhotosPicker(selection: $selectedImageItem, matching: .images) { + Text(imageTextChange) + .foregroundColor(.blue) + .padding(.leading) + } + .onChange(of: selectedImageItem) { newItem in + Task { + if let data = try? await newItem?.loadTransferable(type: Data.self), + let uiImage = UIImage(data: data) { + playerImage = uiImage + } + } + } + } + .padding(.horizontal) + EditTextComponent(explanation: playerNameKey, name: $playerName) .padding(.horizontal) } @@ -50,8 +69,8 @@ struct ProfileEdit_Previews: PreviewProvider { defaultImage: Image("profil"), imageTextChange: "Changer l'avatar", playerNameKey: "Nom du Joueur 1", - playerName: .constant("Joueur 1") + playerName: .constant("Joueur 1"), + playerImage: .constant(UIImage(named: "profil")!) ) } } - diff --git a/ArkitDoushiQi/ArkitDoushiQi/Views/Extension/Placeholder.swift b/ArkitDoushiQi/ArkitDoushiQi/Views/Extension/Placeholder.swift new file mode 100644 index 0000000..e69de29 diff --git a/ArkitDoushiQi/ArkitDoushiQi/Views/GameParametersMenuView.swift b/ArkitDoushiQi/ArkitDoushiQi/Views/GameParametersMenuView.swift index c8ec5d8..e3020b7 100644 --- a/ArkitDoushiQi/ArkitDoushiQi/Views/GameParametersMenuView.swift +++ b/ArkitDoushiQi/ArkitDoushiQi/Views/GameParametersMenuView.swift @@ -6,7 +6,6 @@ // import SwiftUI -import PhotosUI struct GameParametersMenuView: View, KeyboardReadable { @State private var selectedAIOption: AI = .RandomAction @@ -15,6 +14,8 @@ struct GameParametersMenuView: View, KeyboardReadable { @State private var isKeyboardVisible = false @State private var playerName1 = NSLocalizedString("Nom du Joueur 1", comment: "") @State private var playerName2 = NSLocalizedString("Nom du Joueur 2", comment: "") + @State private var playerImage1: UIImage = UIImage(named: "profil")! + @State private var playerImage2: UIImage = UIImage(named: "profil")! @State private var keyboardHeight: CGFloat = 0 var body: some View { @@ -33,15 +34,15 @@ struct GameParametersMenuView: View, KeyboardReadable { PickerComponent(title: "Sélectionne une IA :", selectedOption: $selectedAIOption, options: AI.allCases) } - ProfileEdit(color: Color(.red), profileWidth: 100, profileHeight: 100, defaultImage: Image("profil"), imageTextChange: "Changer l'avatar du joueur 1", playerNameKey: "Nom du Joueur 1", playerName: $playerName1) + ProfileEdit(color: Color(.red), profileWidth: 100, profileHeight: 100, defaultImage: Image("profil"), imageTextChange: "Changer l'avatar du joueur 1", playerNameKey: "Nom du Joueur 1", playerName: $playerName1, playerImage: $playerImage1) if selectedGameType == .PvP { - ProfileEdit(color: Color(.blue), profileWidth: 100, profileHeight: 100, defaultImage: Image("profil"), imageTextChange: "Changer l'avatar du joueur 2", playerNameKey: "Nom du Joueur 2", playerName: $playerName2) + ProfileEdit(color: Color(.blue), profileWidth: 100, profileHeight: 100, defaultImage: Image("profil"), imageTextChange: "Changer l'avatar du joueur 2", playerNameKey: "Nom du Joueur 2", playerName: $playerName2, playerImage: $playerImage2) } if !isKeyboardVisible { ButtonComponent(title: "Lancer la partie") { - GameView() + GameView(player1Name: playerName1, player1Image: playerImage1, player2Name: playerName2, player2Image: playerImage2) } .padding(EdgeInsets(top: 10, leading: 32, bottom: 10, trailing: 32)) } diff --git a/ArkitDoushiQi/Picker.swift b/ArkitDoushiQi/Picker.swift deleted file mode 100644 index 57d1bd5..0000000 --- a/ArkitDoushiQi/Picker.swift +++ /dev/null @@ -1,20 +0,0 @@ -/ -// Picker.swift -// ArkitDoushiQi -// -// Created by Johan LACHENAL on 21/05/2024. -// - -import SwiftUI - -struct Picker: View { - var body: some View { - Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) - } -} - -struct Picker_Previews: PreviewProvider { - static var previews: some View { - Picker() - } -}