2DAnimations #25

Merged
johan.lachenal merged 6 commits from 2DAnimations into dev 10 months ago

BIN
.DS_Store vendored

Binary file not shown.

@ -10,9 +10,6 @@
16038A272C197B800074346E /* FlagManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16038A262C197B800074346E /* FlagManager.swift */; };
161A8E932C2055EA00D1ADFE /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 161A8E922C2055EA00D1ADFE /* Placeholder.swift */; };
165725EA2C1984CC0052D7EF /* FontManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 165725E92C1984CC0052D7EF /* FontManager.swift */; };
165725F22C1985920052D7EF /* nuku1.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 165725F02C1985920052D7EF /* nuku1.ttf */; };
16FA058C2C1C14F50042D688 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 16FA058A2C1C14F50042D688 /* Localizable.strings */; };
16FA05902C1C14FD0042D688 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 16FA058E2C1C14FD0042D688 /* Localizable.strings */; };
16FA05922C1C154A0042D688 /* LanguagePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16FA05912C1C154A0042D688 /* LanguagePickerView.swift */; };
16FA05942C1C1A380042D688 /* Rules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16FA05932C1C1A380042D688 /* Rules.swift */; };
16FA05962C1C1A5F0042D688 /* GameType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16FA05952C1C1A5F0042D688 /* GameType.swift */; };
@ -28,6 +25,14 @@
C24659E52BF5FE09004E80D5 /* MainMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = C24659E42BF5FE09004E80D5 /* MainMenu.swift */; };
C25220EE2C00AC7E0026B71F /* GameParametersMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C25220ED2C00AC7E0026B71F /* GameParametersMenuView.swift */; };
C2A535D92C0F56A800503472 /* DSQ.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2A535D82C0F56A700503472 /* DSQ.xcframework */; };
C2DF075B2C206EEF00BEE0E1 /* Stub.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2DF075A2C206EEF00BEE0E1 /* Stub.swift */; };
C2DF07622C20719800BEE0E1 /* Magic.sks in Resources */ = {isa = PBXBuildFile; fileRef = C2DF075D2C20719800BEE0E1 /* Magic.sks */; };
C2DF07632C20719800BEE0E1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C2DF075E2C20719800BEE0E1 /* Assets.xcassets */; };
C2DF07642C20719800BEE0E1 /* Spark.sks in Resources */ = {isa = PBXBuildFile; fileRef = C2DF075F2C20719800BEE0E1 /* Spark.sks */; };
C2DF07652C20719800BEE0E1 /* FireworkLaunch.sks in Resources */ = {isa = PBXBuildFile; fileRef = C2DF07602C20719800BEE0E1 /* FireworkLaunch.sks */; };
C2DF07662C20719800BEE0E1 /* Fireworks.sks in Resources */ = {isa = PBXBuildFile; fileRef = C2DF07612C20719800BEE0E1 /* Fireworks.sks */; };
C2DF076A2C2071B300BEE0E1 /* actionEndGame.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2DF07682C2071B300BEE0E1 /* actionEndGame.swift */; };
C2DF076B2C2071B300BEE0E1 /* ActionRemove.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2DF07692C2071B300BEE0E1 /* ActionRemove.swift */; };
C2F015092C09D366000F7221 /* LanguageSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2F015082C09D366000F7221 /* LanguageSettings.swift */; };
C2F0150C2C09D3A4000F7221 /* KeyboardReadable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2F0150B2C09D3A4000F7221 /* KeyboardReadable.swift */; };
C2F015102C09D3C3000F7221 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2F0150E2C09D3C3000F7221 /* Language.swift */; };
@ -41,7 +46,6 @@
C2F015242C09D3E7000F7221 /* ProfileComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2F0151B2C09D3E7000F7221 /* ProfileComponent.swift */; };
C2F015252C09D3E7000F7221 /* ItemCollectionParty.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2F0151C2C09D3E7000F7221 /* ItemCollectionParty.swift */; };
C2F015262C09D3E7000F7221 /* ProfileEdit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2F0151D2C09D3E7000F7221 /* ProfileEdit.swift */; };
C2F0152A2C09D420000F7221 /* Stub.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2F015282C09D420000F7221 /* Stub.swift */; };
C2F0152B2C09D420000F7221 /* PartyEnregistery.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2F015292C09D420000F7221 /* PartyEnregistery.swift */; };
/* End PBXBuildFile section */
@ -88,6 +92,14 @@
C24659E42BF5FE09004E80D5 /* MainMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenu.swift; sourceTree = "<group>"; usesTabs = 0; };
C25220ED2C00AC7E0026B71F /* GameParametersMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameParametersMenuView.swift; sourceTree = "<group>"; };
C2A535D82C0F56A700503472 /* DSQ.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = DSQ.xcframework; path = ../NEPASTOUCHER/DSQ.xcframework; sourceTree = "<group>"; };
C2DF075A2C206EEF00BEE0E1 /* Stub.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stub.swift; sourceTree = "<group>"; };
C2DF075D2C20719800BEE0E1 /* Magic.sks */ = {isa = PBXFileReference; lastKnownFileType = file.sks; path = Magic.sks; sourceTree = "<group>"; };
C2DF075E2C20719800BEE0E1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
C2DF075F2C20719800BEE0E1 /* Spark.sks */ = {isa = PBXFileReference; lastKnownFileType = file.sks; path = Spark.sks; sourceTree = "<group>"; };
C2DF07602C20719800BEE0E1 /* FireworkLaunch.sks */ = {isa = PBXFileReference; lastKnownFileType = file.sks; path = FireworkLaunch.sks; sourceTree = "<group>"; };
C2DF07612C20719800BEE0E1 /* Fireworks.sks */ = {isa = PBXFileReference; lastKnownFileType = file.sks; path = Fireworks.sks; sourceTree = "<group>"; };
C2DF07682C2071B300BEE0E1 /* actionEndGame.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = actionEndGame.swift; sourceTree = "<group>"; };
C2DF07692C2071B300BEE0E1 /* ActionRemove.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionRemove.swift; sourceTree = "<group>"; };
C2F015082C09D366000F7221 /* LanguageSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageSettings.swift; sourceTree = "<group>"; };
C2F0150B2C09D3A4000F7221 /* KeyboardReadable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardReadable.swift; sourceTree = "<group>"; };
C2F0150E2C09D3C3000F7221 /* Language.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Language.swift; sourceTree = "<group>"; };
@ -101,7 +113,6 @@
C2F0151B2C09D3E7000F7221 /* ProfileComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileComponent.swift; sourceTree = "<group>"; };
C2F0151C2C09D3E7000F7221 /* ItemCollectionParty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemCollectionParty.swift; sourceTree = "<group>"; };
C2F0151D2C09D3E7000F7221 /* ProfileEdit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileEdit.swift; sourceTree = "<group>"; };
C2F015282C09D420000F7221 /* Stub.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stub.swift; sourceTree = "<group>"; };
C2F015292C09D420000F7221 /* PartyEnregistery.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PartyEnregistery.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
@ -184,6 +195,8 @@
82CE59E52C045C7500ADEE24 /* Game */ = {
isa = PBXGroup;
children = (
C2DF07672C2071B300BEE0E1 /* SKActions */,
C2DF075C2C20719800BEE0E1 /* SKAnimations */,
82CE59EC2C0460AA00ADEE24 /* SKNodes */,
82CE59E82C045D1100ADEE24 /* GameScene.swift */,
82CE59EA2C045E3800ADEE24 /* GameView.swift */,
@ -224,6 +237,7 @@
C205A2B52BF373360097BD93 /* ArkitDoushiQi */ = {
isa = PBXGroup;
children = (
C2DF07592C206EEF00BEE0E1 /* Data */,
16038A2A2C197DEC0074346E /* Info.plist */,
C2F015072C09D366000F7221 /* Utils */,
82CE59E52C045C7500ADEE24 /* Game */,
@ -244,7 +258,7 @@
C2F015122C09D3E7000F7221 /* Components */,
C2F0150D2C09D3C3000F7221 /* Enum */,
C2F0150A2C09D3A4000F7221 /* EventTriggers */,
C25220EC2C00AC530026B71F /* Data */,
C25220EC2C00AC530026B71F /* GameParametersMenu */,
C205A2BD2BF373380097BD93 /* Preview Assets.xcassets */,
);
path = Views;
@ -267,12 +281,41 @@
path = ArkitDoushiQiUITests;
sourceTree = "<group>";
};
C25220EC2C00AC530026B71F /* Data */ = {
C25220EC2C00AC530026B71F /* GameParametersMenu */ = {
isa = PBXGroup;
children = (
C2F015282C09D420000F7221 /* Stub.swift */,
);
path = Data;
path = GameParametersMenu;
sourceTree = "<group>";
};
C2DF07592C206EEF00BEE0E1 /* Data */ = {
isa = PBXGroup;
children = (
C2DF075A2C206EEF00BEE0E1 /* Stub.swift */,
);
name = Data;
path = Views/Data;
sourceTree = "<group>";
};
C2DF075C2C20719800BEE0E1 /* SKAnimations */ = {
isa = PBXGroup;
children = (
C2DF075D2C20719800BEE0E1 /* Magic.sks */,
C2DF075E2C20719800BEE0E1 /* Assets.xcassets */,
C2DF075F2C20719800BEE0E1 /* Spark.sks */,
C2DF07602C20719800BEE0E1 /* FireworkLaunch.sks */,
C2DF07612C20719800BEE0E1 /* Fireworks.sks */,
);
path = SKAnimations;
sourceTree = "<group>";
};
C2DF07672C2071B300BEE0E1 /* SKActions */ = {
isa = PBXGroup;
children = (
C2DF07682C2071B300BEE0E1 /* actionEndGame.swift */,
C2DF07692C2071B300BEE0E1 /* ActionRemove.swift */,
);
path = SKActions;
sourceTree = "<group>";
};
C2F015072C09D366000F7221 /* Utils */ = {
@ -442,10 +485,12 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
16FA05902C1C14FD0042D688 /* Localizable.strings in Resources */,
C205A2BE2BF373380097BD93 /* Preview Assets.xcassets in Resources */,
16FA058C2C1C14F50042D688 /* Localizable.strings in Resources */,
165725F22C1985920052D7EF /* nuku1.ttf in Resources */,
C2DF07652C20719800BEE0E1 /* FireworkLaunch.sks in Resources */,
C2DF07642C20719800BEE0E1 /* Spark.sks in Resources */,
C2DF07662C20719800BEE0E1 /* Fireworks.sks in Resources */,
C2DF07622C20719800BEE0E1 /* Magic.sks in Resources */,
C2DF07632C20719800BEE0E1 /* Assets.xcassets in Resources */,
C205A2BB2BF373380097BD93 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -472,7 +517,8 @@
buildActionMask = 2147483647;
files = (
C2F015112C09D3C3000F7221 /* AI.swift in Sources */,
C2F0152A2C09D420000F7221 /* Stub.swift in Sources */,
C2DF075B2C206EEF00BEE0E1 /* Stub.swift in Sources */,
C2DF076B2C2071B300BEE0E1 /* ActionRemove.swift in Sources */,
C2F015252C09D3E7000F7221 /* ItemCollectionParty.swift in Sources */,
82CE59EF2C0460E500ADEE24 /* SpriteMoople.swift in Sources */,
C2F0150C2C09D3A4000F7221 /* KeyboardReadable.swift in Sources */,
@ -492,6 +538,7 @@
C2F015222C09D3E7000F7221 /* PhotoButtonComponent.swift in Sources */,
C2F015092C09D366000F7221 /* LanguageSettings.swift in Sources */,
16FA05922C1C154A0042D688 /* LanguagePickerView.swift in Sources */,
C2DF076A2C2071B300BEE0E1 /* actionEndGame.swift in Sources */,
82CE59EB2C045E3800ADEE24 /* GameView.swift in Sources */,
C2F0152B2C09D420000F7221 /* PartyEnregistery.swift in Sources */,
C2F015102C09D3C3000F7221 /* Language.swift in Sources */,

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bokeh.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "spark.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "board.png",
"filename" : "Group 1-2.png",
"idiom" : "universal",
"scale" : "1x"
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

@ -10,6 +10,7 @@ import SpriteKit
import DouShouQiModel
class GameScene: SKScene {
var isGameOver = false
let imageBoard: SKSpriteNode = SKSpriteNode(imageNamed: "board")
var game: Game = try! Game(withRules: ClassicRules(), andPlayer1: HumanPlayer(withName: "Bot1", andId: .player1)!, andPlayer2: RandomPlayer(withName: "Bot2", andId: .player2)!)
@ -39,6 +40,38 @@ class GameScene: SKScene {
var deplacementPossible: [SKShapeNode] = []
required init?(coder aDecoder: NSCoder) {
self.player1Name = ""
self.player1Image = UIImage()
self.player2Name = ""
self.player2Image = UIImage()
super.init(coder: aDecoder)
}
override init(size: CGSize) {
self.player1Name = ""
self.player1Image = UIImage()
self.player2Name = ""
self.player2Image = UIImage()
super.init(size: size)
// -- -- //
scaleMode = .aspectFit
anchorPoint = CGPoint(x: 0.5, y: 0.5)
imageBoard.zPosition = 0
self.addChild(imageBoard)
// -- -- //
for c in pieces.flatMap({ _,values in return values })
{
c.self.value.refGameScene = self
c.self.value.zPosition = 2
self.addChild(c.self.value)
}
displayBoard(board: game.board)
}
init(size: CGSize, player1Name: String, player1Image: UIImage, player2Name: String, player2Image: UIImage) {
self.player1Name = player1Name
self.player1Image = player1Image
@ -60,14 +93,6 @@ class GameScene: SKScene {
displayBoard(board: game.board)
}
required init?(coder aDecoder: NSCoder) {
self.player1Name = ""
self.player1Image = UIImage()
self.player2Name = ""
self.player2Image = UIImage()
super.init(coder: aDecoder)
}
func displayBoard(board: Board) {
for ligne in 0..<board.grid.count {
for col in 0..<board.grid[ligne].count {

@ -24,15 +24,16 @@ struct GameView: View {
return scene
}
@State var msg: String = "Msg"
@State var msg: String = ""
var body: some View {
ZStack {
Text(msg)
SpriteView(scene: gameScene)
.edgesIgnoringSafeArea(.all)
.task {
gameScene.game.addGameStartedListener { board in startGame() }
gameScene.game.addGameOverListener { board, result, player in gameOver() }
gameScene.game.addGameOverListener { board, result, player in gameOver(result : result) }
gameScene.game.addGameChangedListener { game in gameChange() }
gameScene.game.addBoardChangedListener { board in boardChange() }
@ -98,9 +99,25 @@ struct GameView: View {
msg = "Start !!"
}
func gameOver() {
print("Game over !")
msg = "Game over !!"
func gameOver(result : Result) { print("Game over !")
msg = "Game over ! "
switch result
{
case .winner(let winner, _):
switch winner {
case .player1:
msg = msg + "player 1 wins !"
case .player2:
msg = msg + "player 2 wins !"
default:
msg = msg + "equality !"
}
default:
msg="Game over !"
}
gameScene.isGameOver = true
actionEndGame(scene: gameScene,message: msg)
}
func gameChange() {
@ -127,11 +144,11 @@ struct GameView: View {
print("------------")
}
func removePiece(piece: Piece) {
func removePiece(piece:Piece){
print("Remove piece")
if let node = gameScene.pieces[piece.owner]?[piece.animal] {
if let node = gameScene.pieces[piece.owner]![piece.animal] {
actionRemove(size: gameScene.size, node: node, scene: gameScene)
print("Remove piece from parent")
node.removeFromParent()
}
}

@ -0,0 +1,38 @@
//
// Actions.swift
// ArkitDoushiQi
//
// Created by Johan LACHENAL on 12/06/2024.
//
import Foundation
import SpriteKit
func actionRemove(size : CGSize, node : SpriteMoople, scene : SKScene) {
// Action d'étincelle
let spark = SKAction.run {
createSpark(at: node.position,on: scene)
}
// Séquence des actions
let sequence = SKAction.sequence([spark, SKAction.removeFromParent()])
node.run(sequence)
}
func createSpark(at position: CGPoint,on scene: SKScene) {
// Créer un effet de particule pour l'étincelle
if let sparkEmitter = SKEmitterNode(fileNamed: "Spark.sks") {
sparkEmitter.position = position
scene.addChild(sparkEmitter)
// Retirer l'étincelle après une courte durée
let wait = SKAction.wait(forDuration: 1.0)
let remove = SKAction.removeFromParent()
let sequence = SKAction.sequence([wait, remove])
sparkEmitter.run(sequence)
}
}

@ -0,0 +1,102 @@
//
// actionEndGame.swift
// ArkitDoushiQi
//
// Created by Johan LACHENAL on 12/06/2024.
//
import Foundation
import SpriteKit
func actionEndGame(scene: SKScene, message: String) {
let size = scene.size
var delay: TimeInterval = 0.0
for _ in 0..<5 {
// Créer un effet de particule pour le lancement
if let launchEmitter = SKEmitterNode(fileNamed: "FireworkLaunch.sks") {
// Position de départ en bas de la scène
let startX: CGFloat = 0.0
let startY: CGFloat = (-size.height/2)
launchEmitter.position = CGPoint(x: startX, y: startY)
scene.addChild(launchEmitter)
// Action de montée
let moveUp = SKAction.moveBy(x: CGFloat.random(in: -(size.width/3)...(size.width/3)), y: CGFloat.random(in: (size.height/2)...(size.height/1.25)), duration: 2.0)
// Action de grossissement et de rapetissement
let scaleUp = SKAction.scale(to: 1.5, duration: 1.0)
let scaleDown = SKAction.scale(to: 1.0, duration: 1.0)
let scaleSequence = SKAction.sequence([scaleUp, scaleDown])
let moveAndScale = SKAction.group([moveUp, scaleSequence])
// Action pour déclencher l'explosion
let explode = SKAction.run {
createExplosion(at: launchEmitter.position, scene: scene)
launchEmitter.removeFromParent()
}
let wait = SKAction.wait(forDuration: delay)
// Séquence de montée puis explosion
let sequence = SKAction.sequence([wait,moveAndScale, explode])
launchEmitter.run(sequence)
delay += CGFloat.random(in: 0.3...0.6)
}
}
showWinningMessage(scene: scene, message: message)
}
func createExplosion(at position: CGPoint, scene: SKScene) {
// Créer un effet de particule pour l'explosion
if let explosionEmitter = SKEmitterNode(fileNamed: "Fireworks.sks") {
explosionEmitter.position = position
// Changer la couleur des particules
explosionEmitter.particleColor = randomColor()
explosionEmitter.particleColorBlendFactor = 1.0
scene.addChild(explosionEmitter)
// Retirer l'explosion après une courte durée
let wait = SKAction.wait(forDuration: 2.0)
let remove = SKAction.removeFromParent()
let sequence = SKAction.sequence([wait, remove])
explosionEmitter.run(sequence)
}
}
func showWinningMessage(scene: SKScene, message: String) {
let size = scene.size
let letters = Array(message)
let letterSpacing: CGFloat = 40.0
let totalWidth = CGFloat(letters.count) * letterSpacing
let startX = (0.0 - totalWidth) / 2
let startY = 0.0
for (index, letter) in letters.enumerated() {
let letterNode = SKLabelNode(text: String(letter))
letterNode.fontName = "Helvetica-Bold"
letterNode.fontSize = 50
letterNode.fontColor = .white
letterNode.position = CGPoint(x: startX + CGFloat(index) * letterSpacing, y: startY)
letterNode.alpha = 0
scene.addChild(letterNode)
let delay = SKAction.wait(forDuration: Double(index) * 0.1)
let fadeIn = SKAction.fadeIn(withDuration: 0.5)
let scaleUp = SKAction.scale(to: 1.5, duration: 0.25)
let scaleDown = SKAction.scale(to: 1.0, duration: 0.25)
let scaleSequence = SKAction.sequence([scaleUp, scaleDown])
let group = SKAction.group([fadeIn, scaleSequence])
let sequence = SKAction.sequence([delay, group])
letterNode.run(sequence)
}
}
func randomColor() -> UIColor {
let red = CGFloat.random(in: 0...1)
let green = CGFloat.random(in: 0...1)
let blue = CGFloat.random(in: 0...1)
return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
}

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bokeh.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "spark.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -38,12 +38,12 @@ class SpriteMoople : SKNode {
override var isUserInteractionEnabled: Bool {
get { return true }
set {}
}
get { return refGameScene?.isGameOver == false }
set { }
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if isUserInteractionEnabled == false { return }
let movePoss: [ Move ] = refGameScene!.game.rules.getMoves(in: refGameScene!.game.board,of:refGameScene!.game.rules.getNextPlayer(),fromRow: Int(self.cellPosition.x),andColumn: Int(self.cellPosition.y))
for pos in movePoss {
let rect = SKShapeNode(rectOf: CGSize(width: 90, height: 90))
@ -56,10 +56,12 @@ class SpriteMoople : SKNode {
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if isUserInteractionEnabled == false { return }
self.position = touches.first?.location(in: parent!) ?? CGPoint(x: 0, y: 0)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if isUserInteractionEnabled == false { return }
let localisation = touches.first?.location(in: parent!)
// Clean rect

Loading…
Cancel
Save