diff --git a/DouShouQi_App/DouShouQi_App/Components/Game/TopGameBoard.swift b/DouShouQi_App/DouShouQi_App/Components/Game/TopGameBoard.swift index 284b3cf..fa0147e 100644 --- a/DouShouQi_App/DouShouQi_App/Components/Game/TopGameBoard.swift +++ b/DouShouQi_App/DouShouQi_App/Components/Game/TopGameBoard.swift @@ -6,15 +6,18 @@ // import SwiftUI +import DouShouQiModel struct TopGameBoard: View { + @ObservedObject var gameVM: PlayingGameVM + var body: some View { VStack { HStack { Circle() .fill(Color.white) .frame(width: 40, height: 40) - Text("Player 1 Turn") + Text("\(gameVM.currentPlayerName)'s Turn") .font(.title) .foregroundColor(.white) } @@ -37,14 +40,14 @@ struct TopGameBoard: View { Spacer() HStack { - Text("Last moove :") + Text("Last move :") .font(.title2) .foregroundColor(.black) /*Image(systemName: "cheetah") .resizable() .frame(width: 30, height: 30)*/ - Text("🦁") - Text("2.3") + Text(gameVM.lastPieceMoved) + Text(gameVM.lastMove) .font(.title2) .foregroundColor(.black) } @@ -60,8 +63,8 @@ struct TopGameBoard: View { } } -struct TopGameBoard_Previews: PreviewProvider { - static var previews: some View { - TopGameBoard() - } -} +//struct TopGameBoard_Previews: PreviewProvider { +// static var previews: some View { +// TopGameBoard(gameVM: vm) +// } +//} diff --git a/DouShouQi_App/DouShouQi_App/Components/Scene/GameScene.swift b/DouShouQi_App/DouShouQi_App/Components/Scene/GameScene.swift index 0ad1191..0ea5b8a 100644 --- a/DouShouQi_App/DouShouQi_App/Components/Scene/GameScene.swift +++ b/DouShouQi_App/DouShouQi_App/Components/Scene/GameScene.swift @@ -6,15 +6,16 @@ // import Foundation +import SwiftUI import SpriteKit import DouShouQiModel class GameScene : SKScene { - var player1: HumanPlayer = HumanPlayer(withName: "Rémi", andId: .player1)! - var player2: HumanPlayer = HumanPlayer(withName: "Rayhan", andId: .player2)! + var player1: DouShouQiModel.Player? + var player2: DouShouQiModel.Player? - var game: Game + var game: Game? let pieces: [Owner : [Animal:SpriteMeeple]] = [ .player1: [ @@ -42,7 +43,6 @@ class GameScene : SKScene { let imageBoard: SKSpriteNode = SKSpriteNode(imageNamed: AppImages.boardGame) override init(size: CGSize) { - game = try! Game(withRules: ClassicRules(), andPlayer1: player1, andPlayer2: player2) super.init(size: size) imageBoard.size = size //self.scaleMode = .aspectFit @@ -50,15 +50,22 @@ class GameScene : SKScene { self.backgroundColor = .white self.addChild(imageBoard) + } + + convenience init(size: CGSize, gameVM: PlayingGameVM) { + self.init(size: size) + self.game = gameVM.game + self.player1 = self.game?.players[.player1] + self.player2 = self.game?.players[.player2] for piece in pieces.flatMap({owner, pieces in pieces.values}) { self.addChild(piece) piece.setOnMove(onMove: onMeepleMove) } - initializeBoard(game.board) + initializeBoard(game!.board) - game.addInvalidMoveCallbacksListener { _, move, player, result in + game?.addInvalidMoveCallbacksListener { _, move, player, result in if result { return } @@ -69,42 +76,44 @@ class GameScene : SKScene { } Task { - try await game.start() + try await game?.start() } } func initializeBoard(_ board: Board) { - for (lineIndex, currentLine) in game.board.grid.enumerated() { + for (lineIndex, currentLine) in game!.board.grid.enumerated() { for (cellIndex, currentCell) in currentLine.enumerated() { if let piece = currentCell.piece { - pieces[piece.owner]?[piece.animal]?.cellPosition = CGPoint(x: cellIndex-3, y: lineIndex-4) + pieces[piece.owner]?[piece.animal]?.cellPosition = CGPoint(x: cellIndex, y: lineIndex) pieces[piece.owner]?[piece.animal]?.cellPosition = CGPoint(x: 0, y: 0) - print("line :", lineIndex, " cologne: ", cellIndex) + print("line :", lineIndex, " column: ", cellIndex) } } } } required init?(coder aDecoder: NSCoder) { - game = try! Game(withRules: ClassicRules(), andPlayer1: player1, andPlayer2: player2) + game = try! Game(withRules: ClassicRules(), andPlayer1: DouShouQiModel.Player(withName: "P1", andId: .player1)!, andPlayer2: DouShouQiModel.Player(withName: "P2", andId: .player2)!) super.init(coder: aDecoder); } func onMeepleMove(_ start: CGPoint, _ end: CGPoint) { - let owner = game.rules.getNextPlayer() - let player = game.players[owner] - - let move = Move(of: owner, fromRow: Int(start.x), andFromColumn: Int(start.y), toRow: Int(end.x), andToColumn: Int(end.y)) - - print("Meeple moved = ", start, " -> ", end) - - Task { - try! await (player as! HumanPlayer).chooseMove(move) + if let game: Game = self.game { + let owner = game.rules.getNextPlayer() + let player: DouShouQiModel.Player = game.players[owner]! + + let move = Move(of: owner, fromRow: Int(start.y), andFromColumn: Int(start.x), toRow: Int(end.y), andToColumn: Int(end.x)) + + print("Meeple moved = ", start, " -> ", end) + + Task { + try! await (player as! HumanPlayer).chooseMove(move) + } } } public func start() async throws { - try await game.start() + try await game?.start() } } diff --git a/DouShouQi_App/DouShouQi_App/Components/Scene/SpriteMeeple.swift b/DouShouQi_App/DouShouQi_App/Components/Scene/SpriteMeeple.swift index 7a34e9a..1fa51e6 100644 --- a/DouShouQi_App/DouShouQi_App/Components/Scene/SpriteMeeple.swift +++ b/DouShouQi_App/DouShouQi_App/Components/Scene/SpriteMeeple.swift @@ -10,8 +10,8 @@ import SpriteKit class SpriteMeeple : SKNode { - static let offset = CGPoint(x: 0, y: 0) - static let direction = CGVector(dx: 100, dy: 100) + static let offset = CGPoint(x: -300, y: 400) + static let direction = CGVector(dx: 100, dy: -100) let imageNode : SKSpriteNode var ellipseNode : SKShapeNode @@ -24,7 +24,7 @@ class SpriteMeeple : SKNode { var cellPosition: CGPoint{ didSet(cellPosition){ self.position.x = SpriteMeeple.offset.x + SpriteMeeple.direction.dx*cellPosition.x - self.position.y = SpriteMeeple.offset.y + SpriteMeeple.direction.dx*cellPosition.y + self.position.y = SpriteMeeple.offset.y + SpriteMeeple.direction.dy*cellPosition.y } } diff --git a/DouShouQi_App/DouShouQi_App/ViewModel/Game/PlayingGameVM.swift b/DouShouQi_App/DouShouQi_App/ViewModel/Game/PlayingGameVM.swift index 07db904..1d24ad4 100644 --- a/DouShouQi_App/DouShouQi_App/ViewModel/Game/PlayingGameVM.swift +++ b/DouShouQi_App/DouShouQi_App/ViewModel/Game/PlayingGameVM.swift @@ -14,7 +14,18 @@ class PlayingGameVM: ObservableObject { @Published var game: Game // Computed properties - public var currentPlayerName: String { game.players[game.rules.getNextPlayer()]?.name ?? (game.rules.getNextPlayer() == .player1 : "p1" ?? "p2") } + public var currentPlayerName: String { game.players[game.rules.getNextPlayer()]?.name ?? (game.rules.getNextPlayer() == .player1 ? "P1" : "P2") } + + public var lastMove: String { + if let move: Move = game.rules.historic.last { + return "\(move.rowDestination).\(move.columnDestination)" + } + else { + return "" + } + } + + public var lastPieceMoved: String { "oui" } // Inits init(withGame game: Game) { @@ -26,6 +37,7 @@ class PlayingGameVM: ObservableObject { self.game = try Game(withRules: rules, andPlayer1: p1, andPlayer2: p2) } catch { print("Error") + return nil } } diff --git a/DouShouQi_App/DouShouQi_App/Views/Game/GameView.swift b/DouShouQi_App/DouShouQi_App/Views/Game/GameView.swift index c322d33..9ea517b 100644 --- a/DouShouQi_App/DouShouQi_App/Views/Game/GameView.swift +++ b/DouShouQi_App/DouShouQi_App/Views/Game/GameView.swift @@ -7,14 +7,15 @@ import SwiftUI import SpriteKit +import DouShouQiModel struct GameView: View { - var gameScene : GameScene = GameScene(size: CGSize(width: 700, height: 900)) + @StateObject var gameVM: PlayingGameVM = PlayingGameVM(withRules: ClassicRules(), andPlayer1: DouShouQiModel.HumanPlayer(withName: "Rémi", andId: .player1)!, andPlayer2: DouShouQiModel.HumanPlayer(withName: "Nathan", andId: .player2)!)! var body: some View { VStack { - TopGameBoard().frame(maxHeight: 200) - SpriteView(scene: gameScene) + TopGameBoard(gameVM: gameVM).frame(maxHeight: 200) + SpriteView(scene: GameScene(size: CGSize(width: 700, height: 900), gameVM: gameVM)) } .onAppear { MusicPlayer.shared.playBackgroundMusic(music: "GameMusic")