now, no invalid move

dev_views_Game
Rémi REGNAULT 10 months ago
parent 67b86d0085
commit e5b2109b23

@ -6,15 +6,18 @@
// //
import SwiftUI import SwiftUI
import DouShouQiModel
struct TopGameBoard: View { struct TopGameBoard: View {
@ObservedObject var gameVM: PlayingGameVM
var body: some View { var body: some View {
VStack { VStack {
HStack { HStack {
Circle() Circle()
.fill(Color.white) .fill(Color.white)
.frame(width: 40, height: 40) .frame(width: 40, height: 40)
Text("Player 1 Turn") Text("\(gameVM.currentPlayerName)'s Turn")
.font(.title) .font(.title)
.foregroundColor(.white) .foregroundColor(.white)
} }
@ -37,14 +40,14 @@ struct TopGameBoard: View {
Spacer() Spacer()
HStack { HStack {
Text("Last moove :") Text("Last move :")
.font(.title2) .font(.title2)
.foregroundColor(.black) .foregroundColor(.black)
/*Image(systemName: "cheetah") /*Image(systemName: "cheetah")
.resizable() .resizable()
.frame(width: 30, height: 30)*/ .frame(width: 30, height: 30)*/
Text("🦁") Text(gameVM.lastPieceMoved)
Text("2.3") Text(gameVM.lastMove)
.font(.title2) .font(.title2)
.foregroundColor(.black) .foregroundColor(.black)
} }
@ -60,8 +63,8 @@ struct TopGameBoard: View {
} }
} }
struct TopGameBoard_Previews: PreviewProvider { //struct TopGameBoard_Previews: PreviewProvider {
static var previews: some View { // static var previews: some View {
TopGameBoard() // TopGameBoard(gameVM: vm)
} // }
} //}

@ -6,15 +6,16 @@
// //
import Foundation import Foundation
import SwiftUI
import SpriteKit import SpriteKit
import DouShouQiModel import DouShouQiModel
class GameScene : SKScene { class GameScene : SKScene {
var player1: HumanPlayer = HumanPlayer(withName: "Rémi", andId: .player1)! var player1: DouShouQiModel.Player?
var player2: HumanPlayer = HumanPlayer(withName: "Rayhan", andId: .player2)! var player2: DouShouQiModel.Player?
var game: Game var game: Game?
let pieces: [Owner : [Animal:SpriteMeeple]] = [ let pieces: [Owner : [Animal:SpriteMeeple]] = [
.player1: [ .player1: [
@ -42,7 +43,6 @@ class GameScene : SKScene {
let imageBoard: SKSpriteNode = SKSpriteNode(imageNamed: AppImages.boardGame) let imageBoard: SKSpriteNode = SKSpriteNode(imageNamed: AppImages.boardGame)
override init(size: CGSize) { override init(size: CGSize) {
game = try! Game(withRules: ClassicRules(), andPlayer1: player1, andPlayer2: player2)
super.init(size: size) super.init(size: size)
imageBoard.size = size imageBoard.size = size
//self.scaleMode = .aspectFit //self.scaleMode = .aspectFit
@ -50,15 +50,22 @@ class GameScene : SKScene {
self.backgroundColor = .white self.backgroundColor = .white
self.addChild(imageBoard) 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}) { for piece in pieces.flatMap({owner, pieces in pieces.values}) {
self.addChild(piece) self.addChild(piece)
piece.setOnMove(onMove: onMeepleMove) piece.setOnMove(onMove: onMeepleMove)
} }
initializeBoard(game.board) initializeBoard(game!.board)
game.addInvalidMoveCallbacksListener { _, move, player, result in game?.addInvalidMoveCallbacksListener { _, move, player, result in
if result { if result {
return return
} }
@ -69,33 +76,34 @@ class GameScene : SKScene {
} }
Task { Task {
try await game.start() try await game?.start()
} }
} }
func initializeBoard(_ board: Board) { 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() { for (cellIndex, currentCell) in currentLine.enumerated() {
if let piece = currentCell.piece { 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) 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) { 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); super.init(coder: aDecoder);
} }
func onMeepleMove(_ start: CGPoint, _ end: CGPoint) { func onMeepleMove(_ start: CGPoint, _ end: CGPoint) {
if let game: Game = self.game {
let owner = game.rules.getNextPlayer() let owner = game.rules.getNextPlayer()
let player = game.players[owner] let player: DouShouQiModel.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)) 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) print("Meeple moved = ", start, " -> ", end)
@ -103,8 +111,9 @@ class GameScene : SKScene {
try! await (player as! HumanPlayer).chooseMove(move) try! await (player as! HumanPlayer).chooseMove(move)
} }
} }
}
public func start() async throws { public func start() async throws {
try await game.start() try await game?.start()
} }
} }

@ -10,8 +10,8 @@ import SpriteKit
class SpriteMeeple : SKNode { class SpriteMeeple : SKNode {
static let offset = CGPoint(x: 0, y: 0) static let offset = CGPoint(x: -300, y: 400)
static let direction = CGVector(dx: 100, dy: 100) static let direction = CGVector(dx: 100, dy: -100)
let imageNode : SKSpriteNode let imageNode : SKSpriteNode
var ellipseNode : SKShapeNode var ellipseNode : SKShapeNode
@ -24,7 +24,7 @@ class SpriteMeeple : SKNode {
var cellPosition: CGPoint{ var cellPosition: CGPoint{
didSet(cellPosition){ didSet(cellPosition){
self.position.x = SpriteMeeple.offset.x + SpriteMeeple.direction.dx*cellPosition.x 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
} }
} }

@ -14,7 +14,18 @@ class PlayingGameVM: ObservableObject {
@Published var game: Game @Published var game: Game
// Computed properties // 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 // Inits
init(withGame game: Game) { init(withGame game: Game) {
@ -26,6 +37,7 @@ class PlayingGameVM: ObservableObject {
self.game = try Game(withRules: rules, andPlayer1: p1, andPlayer2: p2) self.game = try Game(withRules: rules, andPlayer1: p1, andPlayer2: p2)
} catch { } catch {
print("Error") print("Error")
return nil
} }
} }

@ -7,14 +7,15 @@
import SwiftUI import SwiftUI
import SpriteKit import SpriteKit
import DouShouQiModel
struct GameView: View { 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 { var body: some View {
VStack { VStack {
TopGameBoard().frame(maxHeight: 200) TopGameBoard(gameVM: gameVM).frame(maxHeight: 200)
SpriteView(scene: gameScene) SpriteView(scene: GameScene(size: CGSize(width: 700, height: 900), gameVM: gameVM))
} }
.onAppear { .onAppear {
MusicPlayer.shared.playBackgroundMusic(music: "GameMusic") MusicPlayer.shared.playBackgroundMusic(music: "GameMusic")

Loading…
Cancel
Save