From 8d6dd7f2def943c533fdacbd21d41d3742d556d2 Mon Sep 17 00:00:00 2001 From: Mathieu GROUSSEAU Date: Mon, 16 Jun 2025 13:27:02 +0200 Subject: [PATCH] Average American school board --- App/App.xcodeproj/project.pbxproj | 4 ++++ App/App/SpriteKit/BoardNode.swift | 34 +++++++++++++++++++++++++++++ App/App/SpriteKit/GameScene.swift | 17 ++++++++------- App/App/SpriteKit/PieceNode.swift | 36 ++++++++++++++++--------------- 4 files changed, 66 insertions(+), 25 deletions(-) create mode 100644 App/App/SpriteKit/BoardNode.swift diff --git a/App/App.xcodeproj/project.pbxproj b/App/App.xcodeproj/project.pbxproj index 5975b6d..0920904 100644 --- a/App/App.xcodeproj/project.pbxproj +++ b/App/App.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ F0143C312DF9813C0086CAAA /* PieceNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0143C302DF9813C0086CAAA /* PieceNode.swift */; }; F0143C342DF987490086CAAA /* PlayerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0143C332DF987490086CAAA /* PlayerType.swift */; }; F0143C362DFA9A000086CAAA /* RulesType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0143C352DFA9A000086CAAA /* RulesType.swift */; }; + F05DA2112E002AA00094A4A8 /* BoardNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = F05DA2102E002AA00094A4A8 /* BoardNode.swift */; }; F0F59E492DD4958800BE32D6 /* C4.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0F59E432DD492B400BE32D6 /* C4.xcframework */; }; F0F59E4A2DD4958800BE32D6 /* C4Persistance.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0F59E412DD492B400BE32D6 /* C4Persistance.xcframework */; }; F0F59E4B2DD4958800BE32D6 /* C4Players.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0F59E422DD492B400BE32D6 /* C4Players.xcframework */; }; @@ -68,6 +69,7 @@ F0143C302DF9813C0086CAAA /* PieceNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PieceNode.swift; sourceTree = ""; }; F0143C332DF987490086CAAA /* PlayerType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerType.swift; sourceTree = ""; }; F0143C352DFA9A000086CAAA /* RulesType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulesType.swift; sourceTree = ""; }; + F05DA2102E002AA00094A4A8 /* BoardNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoardNode.swift; sourceTree = ""; }; F0F59E412DD492B400BE32D6 /* C4Persistance.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = C4Persistance.xcframework; path = ../precompiled/xcframeworks/C4Persistance.xcframework; sourceTree = ""; }; F0F59E422DD492B400BE32D6 /* C4Players.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = C4Players.xcframework; path = ../precompiled/xcframeworks/C4Players.xcframework; sourceTree = ""; }; F0F59E432DD492B400BE32D6 /* C4.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = C4.xcframework; path = ../precompiled/xcframeworks/C4.xcframework; sourceTree = ""; }; @@ -198,6 +200,7 @@ children = ( F0143C2A2DF018F20086CAAA /* GameScene.swift */, F0143C302DF9813C0086CAAA /* PieceNode.swift */, + F05DA2102E002AA00094A4A8 /* BoardNode.swift */, ); path = SpriteKit; sourceTree = ""; @@ -357,6 +360,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + F05DA2112E002AA00094A4A8 /* BoardNode.swift in Sources */, F0143C312DF9813C0086CAAA /* PieceNode.swift in Sources */, F0F59E592DE6EB2A00BE32D6 /* PlayerVSPage.swift in Sources */, F001A04E2DD48FAB00809561 /* MainMenuView.swift in Sources */, diff --git a/App/App/SpriteKit/BoardNode.swift b/App/App/SpriteKit/BoardNode.swift new file mode 100644 index 0000000..7d91a5b --- /dev/null +++ b/App/App/SpriteKit/BoardNode.swift @@ -0,0 +1,34 @@ +import Foundation +import SpriteKit + +class BoardNode: SKShapeNode { + init(cells: (w: Int, h: Int), size: CGSize) { + super.init() + + let path = CGMutablePath() + path.addRect(CGRect(x: 0, y: 0, width: size.width, height: size.height)) + + for y in 0.. ())? = nil + var piece: Piece = .init(withOwner: .noOne) { didSet { switch (piece.owner) { @@ -41,13 +40,15 @@ class PieceNode : SKNode { } } } + var draggable: Bool { self.onDragHandler != nil } - var draggable: Bool = false - - private var gameScene: GameScene { self.scene as! GameScene } - + override var isUserInteractionEnabled: Bool { + get { true } + set { /* fatalError("Unsupported operation: set") */ } + } + override init() { - circle = SKShapeNode(circleOfRadius: Self.pieceSize / 2 * 0.90) + circle = SKShapeNode(circleOfRadius: Self.pieceSize / 2 * Self.borderFactor) super.init() @@ -55,13 +56,14 @@ class PieceNode : SKNode { zPosition = 100 } - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") + convenience init(onReleaseFn: @escaping (PieceNode) -> ()) { + self.init() + + self.onDragHandler = onReleaseFn } - public func resetDragPosition() { - let sc = self.scene!.size - self.position = CGPoint(x: sc.width / 2, y: sc.height - Self.pieceSize / 2) + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") } private func dragTo(position pos: CGPoint) { @@ -69,8 +71,8 @@ class PieceNode : SKNode { } private func releaseAt(position pos: CGPoint) { - resetDragPosition() - // TODO + self.dragTo(position: pos) + onDragHandler?(self) } #if os(macOS)