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{
@ObservedObject var gameVm : GameVM
// @ObservedObject var gameVm : GameVM
let imgBoard : SKSpriteNode = SKSpriteNode(imageNamed: "BoardImg")
let defaultSize : CGSize = CGSize(width: 120, height: 120)
@ -21,36 +21,37 @@ class GameScene : SKScene{
// andPlayer1: Player(withName: "Meruemu", andId: .player1)!,
// andPlayer2: Player(withName: "Kumogi", andId: .player2)!)
// let pieces : [ Owner : [Animal : SpriteMeeple]] =
// [
// .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),
// .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),
// .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: [
// .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),
// .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),
// ]
// ]
let pieces : [ Owner : [Animal : SpriteMeeple]] =
[
.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),
.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),
.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: [
.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),
.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),
]
]
init(size s: CGSize, andVM gameVM : GameVM){
self.gameVm = gameVM
//self.gameVm = gameVM
super.init(size: s)
self.addChild(imgBoard)
self.displayBoard(gameVm.game.board)
//self.displayBoard(gameVm.game.board)
self.scaleMode = .aspectFit
self.anchorPoint = CGPoint(x: 0.5, y:0.5)
@ -60,17 +61,15 @@ class GameScene : SKScene{
for row in 0..<board.nbRows{
for col in 0..<board.nbColumns{
if let p = board.grid[row][col].piece{
gameVm.pieces[p.owner]?[p.animal]?.cellPosition = CGPoint(x: row, y: col);
gameVm.pieces[p.owner]?[p.animal]?.imageNode.size = CGSize(width: 120, height: 120)
self.addChild(gameVm.pieces[p.owner]![p.animal]!);
pieces[p.owner]?[p.animal]?.cellPosition = CGPoint(x: row, y: col);
pieces[p.owner]?[p.animal]?.imageNode.size = CGSize(width: 120, height: 120)
self.addChild(pieces[p.owner]![p.animal]!);
}
}
}
}
required init?(coder aDecoder: NSCoder) {
self.gameVm = GameVM(andPlayer1: Player(withName: "Meruemu", andId: .player1)!,
andPlayer2: Player(withName: "Kumogi", andId: .player2)!)
super.init(coder: aDecoder)
fatalError("init(coder:) has not been implemented")

@ -16,63 +16,89 @@ import SwiftUI
class GameVM : ObservableObject, Identifiable {
@Published var game: Game?
///Players
let player1 : Player
let player2 : Player
@Published var gameScene: GameScene
@Published var isGameOver: Bool = false
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
@Published var hasError : Bool = false
//Message
///Message
@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 {
self.player2 = p2
func onGameStart(board : Board){
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 {
self.player2 = RandomPlayer(withName: "Bobot", andId: .player2)!
do{
_ = try await player.chooseMove(in: board, with: self.game!.rules)
}
catch{
hasError = true
}
}
}
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]
self.actualRules = rules
self.game = try! Game(withRules: actualRules, andPlayer1: player1, andPlayer2: player2)
//TODO recup les pieces de la game ?
self.pieces =
[ .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),
.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),
.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: [
.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),
.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),
]
]
let meeple = meeples?.first(where: {
$0.key == movedPiece.piece?.animal
})
meeple?.value.cellPosition = CGPoint(x: move.rowDestination, y: move.columnDestination)
}
///Mouvement invalide
func onInvalidMove(board : Board, move : Move, player : Player, result : Bool){
if result { ///* invalidité terminante
return
}
displayMessage = "⚠️⚠️⚠️⚠️ Invalid Move detected: \(move) by \(player.name) (\(player.id))"
}
func onBoardChanged(board : Board){
/// Bruit d'un placement de pion ?
}
func onGameOver(board : Board, result : Result, winner : Player?){
displayMessage = "Game Over!!!"
isGameOver = true ///Gestion par l'appelant
}
func readInt(withMessage message: String) -> Int {
var temp: Int?
@ -96,42 +122,5 @@ class GameVM : ObservableObject, Identifiable {
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