pull/26/head
Your Name 10 months ago
parent f935f39523
commit 2f98c1007a

@ -7,9 +7,10 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
8268B4A42C1C640000D195CC /* VMArkit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8268B4A32C1C640000D195CC /* VMArkit.swift */; };
82740EBE2C19762C009711A5 /* ArKitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82740EBD2C19762C009711A5 /* ArKitView.swift */; }; 82740EBE2C19762C009711A5 /* ArKitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82740EBD2C19762C009711A5 /* ArKitView.swift */; };
82740EC02C197A48009711A5 /* ArKitViewRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82740EBF2C197A48009711A5 /* ArKitViewRepresentable.swift */; }; 82740EC02C197A48009711A5 /* ArKitViewRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82740EBF2C197A48009711A5 /* ArKitViewRepresentable.swift */; };
82740EC22C197C1A009711A5 /* UIViewArKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82740EC12C197C1A009711A5 /* UIViewArKit.swift */; }; 82740EC22C197C1A009711A5 /* ContentArkit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82740EC12C197C1A009711A5 /* ContentArkit.swift */; };
82CCA5442C1C2B6400AFF485 /* board.usdz in Resources */ = {isa = PBXBuildFile; fileRef = 82CCA5432C1C2B6400AFF485 /* board.usdz */; }; 82CCA5442C1C2B6400AFF485 /* board.usdz in Resources */ = {isa = PBXBuildFile; fileRef = 82CCA5432C1C2B6400AFF485 /* board.usdz */; };
82CCA5462C1C2B8E00AFF485 /* CatPiece.usdz in Resources */ = {isa = PBXBuildFile; fileRef = 82CCA5452C1C2B8E00AFF485 /* CatPiece.usdz */; }; 82CCA5462C1C2B8E00AFF485 /* CatPiece.usdz in Resources */ = {isa = PBXBuildFile; fileRef = 82CCA5452C1C2B8E00AFF485 /* CatPiece.usdz */; };
82CE59E92C045D1100ADEE24 /* GameScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82CE59E82C045D1100ADEE24 /* GameScene.swift */; }; 82CE59E92C045D1100ADEE24 /* GameScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82CE59E82C045D1100ADEE24 /* GameScene.swift */; };
@ -63,9 +64,10 @@
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
8268B4A32C1C640000D195CC /* VMArkit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VMArkit.swift; sourceTree = "<group>"; };
82740EBD2C19762C009711A5 /* ArKitView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArKitView.swift; sourceTree = "<group>"; }; 82740EBD2C19762C009711A5 /* ArKitView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArKitView.swift; sourceTree = "<group>"; };
82740EBF2C197A48009711A5 /* ArKitViewRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArKitViewRepresentable.swift; sourceTree = "<group>"; }; 82740EBF2C197A48009711A5 /* ArKitViewRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArKitViewRepresentable.swift; sourceTree = "<group>"; };
82740EC12C197C1A009711A5 /* UIViewArKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewArKit.swift; sourceTree = "<group>"; }; 82740EC12C197C1A009711A5 /* ContentArkit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentArkit.swift; sourceTree = "<group>"; };
82CCA53C2C1C255E00AFF485 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; }; 82CCA53C2C1C255E00AFF485 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
82CCA5432C1C2B6400AFF485 /* board.usdz */ = {isa = PBXFileReference; lastKnownFileType = file.usdz; path = board.usdz; sourceTree = "<group>"; }; 82CCA5432C1C2B6400AFF485 /* board.usdz */ = {isa = PBXFileReference; lastKnownFileType = file.usdz; path = board.usdz; sourceTree = "<group>"; };
82CCA5452C1C2B8E00AFF485 /* CatPiece.usdz */ = {isa = PBXFileReference; lastKnownFileType = file.usdz; name = CatPiece.usdz; path = Object/CatPiece.usdz; sourceTree = SOURCE_ROOT; }; 82CCA5452C1C2B8E00AFF485 /* CatPiece.usdz */ = {isa = PBXFileReference; lastKnownFileType = file.usdz; name = CatPiece.usdz; path = Object/CatPiece.usdz; sourceTree = SOURCE_ROOT; };
@ -144,7 +146,8 @@
children = ( children = (
82740EBD2C19762C009711A5 /* ArKitView.swift */, 82740EBD2C19762C009711A5 /* ArKitView.swift */,
82740EBF2C197A48009711A5 /* ArKitViewRepresentable.swift */, 82740EBF2C197A48009711A5 /* ArKitViewRepresentable.swift */,
82740EC12C197C1A009711A5 /* UIViewArKit.swift */, 82740EC12C197C1A009711A5 /* ContentArkit.swift */,
8268B4A32C1C640000D195CC /* VMArkit.swift */,
); );
path = ArKit; path = ArKit;
sourceTree = "<group>"; sourceTree = "<group>";
@ -488,7 +491,7 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
82740EC22C197C1A009711A5 /* UIViewArKit.swift in Sources */, 82740EC22C197C1A009711A5 /* ContentArkit.swift in Sources */,
C2F015112C09D3C3000F7221 /* AI.swift in Sources */, C2F015112C09D3C3000F7221 /* AI.swift in Sources */,
C2F0152A2C09D420000F7221 /* Stub.swift in Sources */, C2F0152A2C09D420000F7221 /* Stub.swift in Sources */,
C2F015252C09D3E7000F7221 /* ItemCollectionParty.swift in Sources */, C2F015252C09D3E7000F7221 /* ItemCollectionParty.swift in Sources */,
@ -507,6 +510,7 @@
C2F015262C09D3E7000F7221 /* ProfileEdit.swift in Sources */, C2F015262C09D3E7000F7221 /* ProfileEdit.swift in Sources */,
C205A2B72BF373360097BD93 /* ArkitDoushiQiApp.swift in Sources */, C205A2B72BF373360097BD93 /* ArkitDoushiQiApp.swift in Sources */,
82740EBE2C19762C009711A5 /* ArKitView.swift in Sources */, 82740EBE2C19762C009711A5 /* ArKitView.swift in Sources */,
8268B4A42C1C640000D195CC /* VMArkit.swift in Sources */,
C2F015232C09D3E7000F7221 /* EditTextComponent.swift in Sources */, C2F015232C09D3E7000F7221 /* EditTextComponent.swift in Sources */,
C2F015222C09D3E7000F7221 /* PhotoButtonComponent.swift in Sources */, C2F015222C09D3E7000F7221 /* PhotoButtonComponent.swift in Sources */,
C2F015092C09D366000F7221 /* LanguageSettings.swift in Sources */, C2F015092C09D366000F7221 /* LanguageSettings.swift in Sources */,
@ -688,12 +692,17 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"ArkitDoushiQi/Views\""; DEVELOPMENT_ASSET_PATHS = "\"ArkitDoushiQi/Views\"";
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = DRCMU7YM68;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ArkitDoushiQi/Info.plist; INFOPLIST_FILE = ArkitDoushiQi/Info.plist;
INFOPLIST_KEY_NSCameraUsageDescription = "Donne la cam ";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES;
@ -704,8 +713,10 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = UCA.WtaTennis; PRODUCT_BUNDLE_IDENTIFIER = fr.uca.iut.enzo;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = tpiOS_2023;
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
@ -717,12 +728,17 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"ArkitDoushiQi/Views\""; DEVELOPMENT_ASSET_PATHS = "\"ArkitDoushiQi/Views\"";
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = DRCMU7YM68;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ArkitDoushiQi/Info.plist; INFOPLIST_FILE = ArkitDoushiQi/Info.plist;
INFOPLIST_KEY_NSCameraUsageDescription = "Donne la cam ";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES;
@ -733,8 +749,10 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = UCA.WtaTennis; PRODUCT_BUNDLE_IDENTIFIER = fr.uca.iut.enzo;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = tpiOS_2023;
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";

@ -13,16 +13,7 @@ import UIKit
class ArKitView : ARView { class ArKitView : ARView {
static let offset = CGPoint(x: -400, y: -300 )
static let direction = CGVector(dx: 100, dy: 100)
var game:Game
var pieces: [Owner : [ Animal : Entity?]]
required init(frame frameRect: CGRect) { required init(frame frameRect: CGRect) {
pieces = [.noOne:[.cat:nil]]
game = try! Game(withRules: ClassicRules(), andPlayer1: HumanPlayer(withName: "Bot1", andId: .player1)!, andPlayer2: RandomPlayer(withName: "Bot2", andId: .player2)!)
super.init(frame: frameRect) super.init(frame: frameRect)
} }
@ -30,47 +21,11 @@ class ArKitView : ARView {
fatalError("init(coder:) not implemented") fatalError("init(coder:) not implemented")
} }
convenience init(_ game:Game) { convenience init() {
self.init(frame: UIScreen.main.bounds) self.init(frame: UIScreen.main.bounds)
self.game = game applyConfiguration()
let anchor = defineAnchors()
addBoard(anchor: anchor)
generatePieces(anchor:anchor)
self.game.addBoardChangedListener { board in self.boardChange() }
self.game.addPieceRemovedListener { _,_,piece in self.removePiece(piece: piece) }
self.game.addInvalidMoveCallbacksListener { board,move,player,bool in self.invalidMove(board: board, move: move, player:player, bool:bool)}
}
// ------ Listener -------- //
func boardChange() {
print("Board change !")
displayBoard(board: game.board)
} }
func removePiece(piece:Piece){
print("Remove piece")
if let entity = pieces[piece.owner]![piece.animal] {
if let x = entity {
x.removeFromParent()
}
}
}
func invalidMove(board:Board,move:Move,player:Player,bool:Bool) {
if (bool){ // Valid
print("Move valid de \(player.id)")
print("Move : \(move.description)")
}
else { // Invalid
print("Move invalid de \(player.id)")
print("Move : \(move.description)")
displayBoard(board: game.board)
}
print("------------")
}
// ------------------------ //
func applyConfiguration() { func applyConfiguration() {
let configuration = ARWorldTrackingConfiguration() let configuration = ARWorldTrackingConfiguration()
@ -83,81 +38,6 @@ class ArKitView : ARView {
return anchor return anchor
} }
func addBoard(anchor:AnchorEntity){
let board = try? Entity.load(named: "board")
if let board {
anchor.addChild(board)
}
}
// -- Crée les pieces
func generatePieces(anchor:AnchorEntity) {
// Position - X,Y,Z
for c in pieces.flatMap({ animal,values in return values })
{
var entity:Entity?
switch c.self.key {
case .cat :
entity = try? Entity.load(named: "CatPiece")
case .elephant :
entity = try? Entity.load(named: "CatPiece")
case .dog :
entity = try? Entity.load(named: "CatPiece")
case .leopard :
entity = try? Entity.load(named: "CatPiece")
case .lion :
entity = try? Entity.load(named: "CatPiece")
case .rat :
entity = try? Entity.load(named: "CatPiece")
case .tiger :
entity = try? Entity.load(named: "CatPiece")
case .wolf :
entity = try? Entity.load(named: "CatPiece")
default:
fatalError("Animal non compris")
}
if let entityNotNull = entity {
anchor.addChild(entityNotNull)
entityNotNull.position = SIMD3<Float>(0,0,10)
entityNotNull.generateCollisionShapes(recursive:true)
/*
self.installGestures([.all], for: entityNotNull as! Entity & HasCollision).forEach { gestureRecognizer in
gestureRecognizer.addTarget(self, action: #selector(handleGesture(_:)))}*/
print("Piece \(c.self.key) a été crée !")
}
else {
print("La pièce \(c.self.key) n'a pas été crée !")
}
}
}
// -- Affiche les pieces à la bonne positions
func displayBoard(board:Board) {
for ligne in 0..<board.grid.count {
for col in 0..<board.grid[ligne].count {
if let piece = board.grid[ligne][col].piece {
if let element = pieces[piece.owner]![piece.animal]{
element!.position = convertPosModeleIntoWorldPos(pos:CGPoint(x: ligne, y: col))
}
}
}
}
}
func convertPosModeleIntoWorldPos(pos:CGPoint) -> SIMD3<Float> {
return SIMD3<Float>(Float(ArKitView.offset.x + ArKitView.direction.dx * pos.x),Float(ArKitView.offset.y + ArKitView.direction.dy * pos.y),10)
}
func converWorldPosIntoPosModele(pos:SIMD3<Float>) -> CGPoint {
let posX = Int(round((pos.x - (-400)) / 100))
let posY = Int(round((pos.y - (-300)) / 100))
return CGPoint(x: posX, y: posY)
}
// -- Pour les mouvement -- // // -- Pour les mouvement -- //
var initialTransform: Transform = Transform() var initialTransform: Transform = Transform()

@ -11,14 +11,10 @@ import DouShouQiModel
struct ArKitViewRepresentable : UIViewRepresentable { struct ArKitViewRepresentable : UIViewRepresentable {
private let game:Game init(){}
init(_ game: Game){
self.game = game
}
func makeUIView(context: Context) -> ArKitView { func makeUIView(context: Context) -> ArKitView {
return ArKitView(self.game) return ArKitView()
} }
func updateUIView(_ uiView: UIViewType, context: Context) { } func updateUIView(_ uiView: UIViewType, context: Context) { }

@ -0,0 +1,36 @@
//
// UIViewArKit.swift
// ArkitDoushiQi
//
// Created by Enzo JOLYS on 12/06/2024.
//
import SwiftUI
import DouShouQiModel
struct ContentArkit: View {
var vm:VMArkit = VMArkit(try! Game(withRules: ClassicRules(), andPlayer1: RandomPlayer(withName: "Bot1", andId: .player1)!, andPlayer2: RandomPlayer(withName: "Bot2", andId: .player2)!))
var body: some View {
VStack {
Text("toto")
/*
vm.view
.ignoresSafeArea()
.navigationBarBackButtonHidden(true)
.task {
try! await vm.game.start()
}*/
ArKitViewRepresentable()
}
}
}
struct UIViewArKit_Previews: PreviewProvider {
static var previews: some View {
ContentArkit()
}
}

@ -1,73 +0,0 @@
//
// UIViewArKit.swift
// ArkitDoushiQi
//
// Created by Enzo JOLYS on 12/06/2024.
//
import SwiftUI
import DouShouQiModel
struct UIViewArKit: View {
var game:Game = try! Game(withRules: ClassicRules(), andPlayer1: HumanPlayer(withName: "Bot1", andId: .player1)!, andPlayer2: RandomPlayer(withName: "Bot2", andId: .player2)!)
@State var msg:String = "Msg"
var body: some View {
VStack {
Text(msg)
ArKitViewRepresentable(game)
.ignoresSafeArea()
.navigationBarBackButtonHidden(true)
.task {
game.addGameStartedListener { board in startGame()}
game.addGameOverListener { board, result, player in gameOver() }
game.addGameChangedListener { game in gameChange() }
game.addMoveChosenCallbacksListener { board, move, player in moveChose(board: board, move: move, player: player) }
game.addPieceRemovedListener { _,_,piece in removePiece(piece: piece) }
game.addPlayerNotifiedListener { board, player in
print("Player notif : \(player.id) à toi de jouer ")
msg = "Player notif : \(player.id) à toi de jouer !"
if (player is IAPlayer ){
try! await player.chooseMove(in: board, with: game.rules)
}
}
//try! await game.start()
}
}
}
// ------ Listener -------- //
func startGame() { print("Start game !")
msg = "Start !!"
}
func gameOver() { print("Game over !")
msg = "Game over !!"
}
func gameChange() { print("Game change !") }
func moveChose(board:Board,move:Move,player:Player) {
}
func removePiece(piece:Piece){
msg = "Piece manger !!"
}
// ------------------------- //
}
struct UIViewArKit_Previews: PreviewProvider {
static var previews: some View {
UIViewArKit()
}
}

@ -0,0 +1,185 @@
//
// VMArkit.swift
// ArkitDoushiQi
//
// Created by Enzo JOLYS on 14/06/2024.
//
import Foundation
import DouShouQiModel
import ARKit
import RealityKit
import UIKit
struct VMArkit {
static let offset = CGPoint(x: -400, y: -300 )
static let direction = CGVector(dx: 100, dy: 100)
var msg:String = ""
var game:Game
var view:ArKitViewRepresentable = ArKitViewRepresentable()
var pieces: [Owner : [ Animal : Entity?]] = [.player1: [.cat:nil,
.elephant:nil,
.dog:nil,
.leopard:nil,
.lion:nil,
.rat:nil,
.tiger:nil,
.wolf:nil],
.player2: [.cat:nil,
.elephant:nil,
.dog:nil,
.leopard:nil,
.lion:nil,
.rat:nil,
.tiger:nil,
.wolf:nil]]
init(_ game:Game){
self.game = game
defineListeners()
}
func addBoard(anchor:AnchorEntity){
let board = try? Entity.load(named: "board")
if let board {
anchor.addChild(board)
}
}
// -- Crée les pieces
func generatePieces(anchor:AnchorEntity) {
// Position - X,Y,Z
for c in pieces.flatMap({ animal,values in return values })
{
var entity:Entity?
switch c.self.key {
case .cat :
entity = try? Entity.load(named: "CatPiece")
case .elephant :
entity = try? Entity.load(named: "CatPiece")
case .dog :
entity = try? Entity.load(named: "CatPiece")
case .leopard :
entity = try? Entity.load(named: "CatPiece")
case .lion :
entity = try? Entity.load(named: "CatPiece")
case .rat :
entity = try? Entity.load(named: "CatPiece")
case .tiger :
entity = try? Entity.load(named: "CatPiece")
case .wolf :
entity = try? Entity.load(named: "CatPiece")
default:
fatalError("Animal non compris")
}
if let entityNotNull = entity {
anchor.addChild(entityNotNull)
entityNotNull.position = SIMD3<Float>(0,0,10)
entityNotNull.generateCollisionShapes(recursive:true)
/*
self.installGestures([.all], for: entityNotNull as! Entity & HasCollision).forEach { gestureRecognizer in
gestureRecognizer.addTarget(self, action: #selector(handleGesture(_:)))}*/
print("Piece \(c.self.key) a été crée !")
}
else {
print("La pièce \(c.self.key) n'a pas été crée !")
}
}
}
// -- Affiche les pieces à la bonne positions
func displayBoard(board:Board) {
for ligne in 0..<board.grid.count {
for col in 0..<board.grid[ligne].count {
if let piece = board.grid[ligne][col].piece {
if let element = pieces[piece.owner]![piece.animal]{
if (element != nil ){
element!.position = convertPosModeleIntoWorldPos(pos:CGPoint(x: ligne, y: col))
}
else {
//print("WARNING !!! -> Element vide ")
}
}
}
}
}
}
func convertPosModeleIntoWorldPos(pos:CGPoint) -> SIMD3<Float> {
return SIMD3<Float>(Float(VMArkit.offset.x + VMArkit.direction.dx * pos.x),Float(VMArkit.offset.y + VMArkit.direction.dy * pos.y),10)
}
func converWorldPosIntoPosModele(pos:SIMD3<Float>) -> CGPoint {
let posX = Int(round((CGFloat(pos.x) - (VMArkit.offset.x)) / VMArkit.direction.dx))
let posY = Int(round((CGFloat(pos.y) - (VMArkit.offset.y)) / VMArkit.direction.dy))
return CGPoint(x: posX, y: posY)
}
// ------ Listener -------- //
func defineListeners(){
self.game.addGameStartedListener { board in startGame()}
self.game.addGameOverListener { board, result, player in gameOver()}
self.game.addGameChangedListener { game in gameChange() }
self.game.addBoardChangedListener { board in boardChange() }
self.game.addMoveChosenCallbacksListener { board, move, player in moveChose(board: board, move: move, player: player) }
self.game.addInvalidMoveCallbacksListener { board,move,player,bool in invalidMove(board: board, move: move, player:player, bool:bool)}
self.game.addPieceRemovedListener { _,_,piece in removePiece(piece: piece) }
self.game.addPlayerNotifiedListener { board, player in
print("Player notif : \(player.id) à toi de jouer ")
//msg = "Player notif : \(player.id) à toi de jouer !"
if (player is IAPlayer ){
try! await player.chooseMove(in: board, with: game.rules)
}}
}
func startGame() { print("Start game !")
//self.msg = "Start !!"
}
func gameOver() { print("Game over !")
//msg = "Game over !!"
}
func gameChange() { print("Game change !") }
func boardChange() {
print("Board change !")
self.displayBoard(board: self.game.board)
}
func moveChose(board:Board,move:Move,player:Player) {
}
func invalidMove(board:Board,move:Move,player:Player,bool:Bool) {
if (bool){ // Valid
print("Move valid de \(player.id)")
print("Move : \(move.description)")
}
else { // Invalid
print("Move invalid de \(player.id)")
print("Move : \(move.description)")
self.displayBoard(board: self.game.board)
}
print("------------")
}
func removePiece(piece:Piece){
print("Remove piece")
if let entity = pieces[piece.owner]![piece.animal] {
if let x = entity {
x.removeFromParent()
}
}
}
// ------------------------- //
}

@ -29,7 +29,7 @@ struct ArkitDoushiQiApp: App {
) )
.environmentObject(languageSettings) .environmentObject(languageSettings)
.preferredColorScheme(isDarkMode ? .dark : .light)*/ .preferredColorScheme(isDarkMode ? .dark : .light)*/
UIViewArKit() ContentArkit()
} }
} }
} }

@ -1,5 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict/> <dict>
<key>NSCameraPortraitEffectEnabled</key>
<true/>
</dict>
</plist> </plist>

Loading…
Cancel
Save