ajout de événements (non fonctionnel) 🍱

gameBranch
Pierre FERREIRA 10 months ago
parent 8f78239046
commit d8736beacb

@ -12,7 +12,7 @@ import SwiftUI
class GameScene : SKScene{ class GameScene : SKScene{
@ObservedObject var gameVm : GameVM // @ObservedObject var gameVm : GameVM
let imgBoard : SKSpriteNode = SKSpriteNode(imageNamed: "BoardImg") let imgBoard : SKSpriteNode = SKSpriteNode(imageNamed: "BoardImg")
let defaultSize : CGSize = CGSize(width: 120, height: 120) let defaultSize : CGSize = CGSize(width: 120, height: 120)
@ -21,36 +21,37 @@ class GameScene : SKScene{
// andPlayer1: Player(withName: "Meruemu", andId: .player1)!, // andPlayer1: Player(withName: "Meruemu", andId: .player1)!,
// andPlayer2: Player(withName: "Kumogi", andId: .player2)!) // andPlayer2: Player(withName: "Kumogi", andId: .player2)!)
// let pieces : [ Owner : [Animal : SpriteMeeple]] = let pieces : [ Owner : [Animal : SpriteMeeple]] =
// [ [
// .player1 : [ .player1 : [
// .rat : SpriteMeeple(imageName: "RatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), .rat : SpriteMeeple(imageName: "RatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1),
// .cat : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), .cat : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1),
// .dog : SpriteMeeple(imageName: "DogoMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), .dog : SpriteMeeple(imageName: "DogoMeeple", size: CGSize(width: 120, height: 120), color: Color.player1),
// .wolf : SpriteMeeple(imageName: "WolfMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), .wolf : SpriteMeeple(imageName: "WolfMeeple", size: CGSize(width: 120, height: 120), color: Color.player1),
// .leopard : SpriteMeeple(imageName: "LeoMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), .leopard : SpriteMeeple(imageName: "LeoMeeple", size: CGSize(width: 120, height: 120), color: Color.player1),
// .tiger : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), .tiger : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1),
// .lion : SpriteMeeple(imageName: "LionMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), .lion : SpriteMeeple(imageName: "LionMeeple", size: CGSize(width: 120, height: 120), color: Color.player1),
// .elephant : SpriteMeeple(imageName: "ElphMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), .elephant : SpriteMeeple(imageName: "ElphMeeple", size: CGSize(width: 120, height: 120), color: Color.player1),
// ], ],
//
// .player2: [ .player2: [
// .rat : SpriteMeeple(imageName: "RatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), .rat : SpriteMeeple(imageName: "RatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
// .cat : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), .cat : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
// .dog : SpriteMeeple(imageName: "DogoMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), .dog : SpriteMeeple(imageName: "DogoMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
// .wolf : SpriteMeeple(imageName: "WolfMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), .wolf : SpriteMeeple(imageName: "WolfMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
// .leopard : SpriteMeeple(imageName: "LeoMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), .leopard : SpriteMeeple(imageName: "LeoMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
// .tiger : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), .tiger : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
// .lion : SpriteMeeple(imageName: "LionMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), .lion : SpriteMeeple(imageName: "LionMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
// .elephant : SpriteMeeple(imageName: "ElphMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), .elephant : SpriteMeeple(imageName: "ElphMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
// ] ]
// ] ]
init(size s: CGSize, andVM gameVM : GameVM){ init(size s: CGSize, andVM gameVM : GameVM){
self.gameVm = gameVM //self.gameVm = gameVM
super.init(size: s) super.init(size: s)
self.addChild(imgBoard) self.addChild(imgBoard)
self.displayBoard(gameVm.game.board) //self.displayBoard(gameVm.game.board)
self.scaleMode = .aspectFit self.scaleMode = .aspectFit
self.anchorPoint = CGPoint(x: 0.5, y:0.5) self.anchorPoint = CGPoint(x: 0.5, y:0.5)
@ -60,17 +61,15 @@ class GameScene : SKScene{
for row in 0..<board.nbRows{ for row in 0..<board.nbRows{
for col in 0..<board.nbColumns{ for col in 0..<board.nbColumns{
if let p = board.grid[row][col].piece{ if let p = board.grid[row][col].piece{
gameVm.pieces[p.owner]?[p.animal]?.cellPosition = CGPoint(x: row, y: col); pieces[p.owner]?[p.animal]?.cellPosition = CGPoint(x: row, y: col);
gameVm.pieces[p.owner]?[p.animal]?.imageNode.size = CGSize(width: 120, height: 120) pieces[p.owner]?[p.animal]?.imageNode.size = CGSize(width: 120, height: 120)
self.addChild(gameVm.pieces[p.owner]![p.animal]!); self.addChild(pieces[p.owner]![p.animal]!);
} }
} }
} }
} }
required init?(coder aDecoder: NSCoder) { required init?(coder aDecoder: NSCoder) {
self.gameVm = GameVM(andPlayer1: Player(withName: "Meruemu", andId: .player1)!,
andPlayer2: Player(withName: "Kumogi", andId: .player2)!)
super.init(coder: aDecoder) super.init(coder: aDecoder)
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")

@ -16,61 +16,87 @@ import SwiftUI
class GameVM : ObservableObject, Identifiable { class GameVM : ObservableObject, Identifiable {
@Published var game: Game?
///Players @Published var gameScene: GameScene
let player1 : Player @Published var isGameOver: Bool = false
let player2 : Player
var pieces : [ Owner : [Animal : SpriteMeeple]]
let actualRules : Rules
///Players (-game -> todelete)
// let player1 : Player
// let player2 : Player
// var pieces : [ Owner : [Animal : SpriteMeeple]]
// let actualRules : Rules
///Error ///Error
@Published var hasError : Bool = false @Published var hasError : Bool = false
//Message ///Message
@Published var displayMessage : String = "" @Published var displayMessage : String = ""
var game : Game //On donne directement la scene et la game à la vm
public init(withGame _game : Game?, andScene _gameScene : GameScene) {
self.game = _game
self.gameScene = _gameScene
///Abonnement aux événements
self.game?.addGameStartedListener(onGameStart)
self.game?.addPlayerNotifiedListener(onPlayerNotified)
self.game?.addMoveChosenCallbacksListener(onMoveChosen)
self.game?.addInvalidMoveCallbacksListener(onInvalidMove)
self.game?.addBoardChangedListener(onBoardChanged)
self.game?.addGameOverListener(onGameOver)
//self.game?.addGameChangedListener({}) - //? cas persistance
}
public init(withRules rules : Rules = ClassicRules(), andPlayer1 p1: Player, andPlayer2 p2 : Player?) {
self.player1 = p1
if let p2 { func onGameStart(board : Board){
self.player2 = p2 displayMessage = " ==>> 🎉 GAME STARTS! 🎉 <<== "
}
func onPlayerNotified(board : Board, player : Player) async{
if player is HumanPlayer {
displayMessage = "Player \(player.id == .player1 ? "🟡 1" : "🔴 2") - \(player.name), it's your turn!"
} }
else { else {
self.player2 = RandomPlayer(withName: "Bobot", andId: .player2)! do{
_ = try await player.chooseMove(in: board, with: self.game!.rules)
}
catch{
hasError = true
}
}
} }
self.actualRules = rules func onMoveChosen(board : Board, move : Move, player : Player){
///Récupération du Meeple :
let movedPiece = board.grid[move.rowOrigin][move.columnOrigin]
let meeples = gameScene.pieces[move.owner]
let meeple = meeples?.first(where: {
$0.key == movedPiece.piece?.animal
})
meeple?.value.cellPosition = CGPoint(x: move.rowDestination, y: move.columnDestination)
self.game = try! Game(withRules: actualRules, andPlayer1: player1, andPlayer2: player2) }
//TODO recup les pieces de la game ? ///Mouvement invalide
self.pieces = func onInvalidMove(board : Board, move : Move, player : Player, result : Bool){
[ .player1 : [ if result { ///* invalidité terminante
.rat : SpriteMeeple(imageName: "RatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), return
.cat : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), }
.dog : SpriteMeeple(imageName: "DogoMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), displayMessage = "⚠️⚠️⚠️⚠️ Invalid Move detected: \(move) by \(player.name) (\(player.id))"
.wolf : SpriteMeeple(imageName: "WolfMeeple", size: CGSize(width: 120, height: 120), color: Color.player1), }
.leopard : SpriteMeeple(imageName: "LeoMeeple", size: CGSize(width: 120, height: 120), color: Color.player1),
.tiger : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player1),
.lion : SpriteMeeple(imageName: "LionMeeple", size: CGSize(width: 120, height: 120), color: Color.player1),
.elephant : SpriteMeeple(imageName: "ElphMeeple", size: CGSize(width: 120, height: 120), color: Color.player1),
],
.player2: [ func onBoardChanged(board : Board){
.rat : SpriteMeeple(imageName: "RatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), /// Bruit d'un placement de pion ?
.cat : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2), }
.dog : SpriteMeeple(imageName: "DogoMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
.wolf : SpriteMeeple(imageName: "WolfMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
.leopard : SpriteMeeple(imageName: "LeoMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
.tiger : SpriteMeeple(imageName: "CatMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
.lion : SpriteMeeple(imageName: "LionMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
.elephant : SpriteMeeple(imageName: "ElphMeeple", size: CGSize(width: 120, height: 120), color: Color.player2),
]
]
func onGameOver(board : Board, result : Result, winner : Player?){
displayMessage = "Game Over!!!"
isGameOver = true ///Gestion par l'appelant
} }
@ -97,41 +123,4 @@ class GameVM : ObservableObject, Identifiable {
return Move(of: player.id, fromRow: originRow!, andFromColumn: originCol!, toRow: destRow!, andToColumn: destCol!) return Move(of: player.id, fromRow: originRow!, andFromColumn: originCol!, toRow: destRow!, andToColumn: destCol!)
} }
func startGame() async throws -> Int
{
// if (player1 == nil || player2 == nil){
// //Affichage de l'erreur
// return 1
// }
for player in game.players {
if player.value is HumanPlayer {
let hp = player.value as! HumanPlayer
hp.changeInput(input: readMove)
}
}
game.addGameStartedListener {_ in
self.displayMessage = "🎉 GAME STARTS! 🎉"
}
game.addPlayerNotifiedListener({ board, player in
self.displayMessage = "Player \(player.id == .player1 ? "🟡 1" : "🔴 2") - \(player.name), it's your turn!"
//try! await Persistance.saveGame(withName: "game", andGame: game2)
_ = readLine()
if player is HumanPlayer {
let move = self.readMove(from: player as! HumanPlayer)
try! await (player as! HumanPlayer).chooseMove(move)
} else {
_ = try! await player.chooseMove(in: board, with: self.game.rules)
}
})
return 0
}
} }

Loading…
Cancel
Save