From 5de5e7db8fcc5df5ec30da3ae4637c1cb137649d Mon Sep 17 00:00:00 2001 From: Sergei Raskin Date: Fri, 13 Dec 2019 11:02:57 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D0=B9=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20=D0=B8=D0=B7=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../8L_RaskinSergey_snake/Messages.swift | 9 + .../8L_RaskinSergey_snake/SnakeHead.swift | 9 + lesson08/.DS_Store | Bin 0 -> 6148 bytes .../project.pbxproj | 367 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../IDEFindNavigatorScopes.plist | 5 + .../UserInterfaceState.xcuserstate | Bin 0 -> 66277 bytes .../xcdebugger/Expressions.xcexplist | 26 ++ .../xcdebugger/Breakpoints_v2.xcbkptlist | 217 +++++++++++ .../xcschemes/xcschememanagement.plist | 14 + lesson08/8L_RaskinSergey_snake/.DS_Store | Bin 0 -> 6148 bytes .../8L_RaskinSergey_snake/AppDelegate.swift | 41 ++ lesson08/8L_RaskinSergey_snake/Apple.swift | 30 ++ .../AppIcon.appiconset/Contents.json | 98 +++++ .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 ++ .../Base.lproj/Main.storyboard | 24 ++ lesson08/8L_RaskinSergey_snake/EdgeBody.swift | 37 ++ .../8L_RaskinSergey_snake/GameMessages.swift | 28 ++ .../8L_RaskinSergey_snake/GameScene.swift | 269 +++++++++++++ .../GameViewController.swift | 50 +++ lesson08/8L_RaskinSergey_snake/Info.plist | 47 +++ lesson08/8L_RaskinSergey_snake/Snake.swift | 81 ++++ .../8L_RaskinSergey_snake/SnakeBodyPart.swift | 35 ++ .../8L_RaskinSergey_snake/SnakeHead.swift | 24 ++ 26 files changed, 1457 insertions(+) create mode 100644 lesson07/lesson08/8L_RaskinSergey_snake/8L_RaskinSergey_snake/Messages.swift create mode 100644 lesson07/lesson08/8L_RaskinSergey_snake/8L_RaskinSergey_snake/SnakeHead.swift create mode 100644 lesson08/.DS_Store create mode 100644 lesson08/8L_RaskinSergey_snake.xcodeproj/project.pbxproj create mode 100644 lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/IDEFindNavigatorScopes.plist create mode 100644 lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/xcdebugger/Expressions.xcexplist create mode 100644 lesson08/8L_RaskinSergey_snake.xcodeproj/xcuserdata/raskin-sa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 lesson08/8L_RaskinSergey_snake.xcodeproj/xcuserdata/raskin-sa.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 lesson08/8L_RaskinSergey_snake/.DS_Store create mode 100644 lesson08/8L_RaskinSergey_snake/AppDelegate.swift create mode 100644 lesson08/8L_RaskinSergey_snake/Apple.swift create mode 100644 lesson08/8L_RaskinSergey_snake/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 lesson08/8L_RaskinSergey_snake/Assets.xcassets/Contents.json create mode 100644 lesson08/8L_RaskinSergey_snake/Base.lproj/LaunchScreen.storyboard create mode 100644 lesson08/8L_RaskinSergey_snake/Base.lproj/Main.storyboard create mode 100644 lesson08/8L_RaskinSergey_snake/EdgeBody.swift create mode 100644 lesson08/8L_RaskinSergey_snake/GameMessages.swift create mode 100644 lesson08/8L_RaskinSergey_snake/GameScene.swift create mode 100644 lesson08/8L_RaskinSergey_snake/GameViewController.swift create mode 100644 lesson08/8L_RaskinSergey_snake/Info.plist create mode 100644 lesson08/8L_RaskinSergey_snake/Snake.swift create mode 100644 lesson08/8L_RaskinSergey_snake/SnakeBodyPart.swift create mode 100644 lesson08/8L_RaskinSergey_snake/SnakeHead.swift diff --git a/lesson07/lesson08/8L_RaskinSergey_snake/8L_RaskinSergey_snake/Messages.swift b/lesson07/lesson08/8L_RaskinSergey_snake/8L_RaskinSergey_snake/Messages.swift new file mode 100644 index 0000000..e066b5a --- /dev/null +++ b/lesson07/lesson08/8L_RaskinSergey_snake/8L_RaskinSergey_snake/Messages.swift @@ -0,0 +1,9 @@ +// +// Messages.swift +// 8L_RaskinSergey_snake +// +// Created by raskin-sa on 12/12/2019. +// Copyright © 2019 raskin-sa. All rights reserved. +// + +import Foundation diff --git a/lesson07/lesson08/8L_RaskinSergey_snake/8L_RaskinSergey_snake/SnakeHead.swift b/lesson07/lesson08/8L_RaskinSergey_snake/8L_RaskinSergey_snake/SnakeHead.swift new file mode 100644 index 0000000..14f8e5a --- /dev/null +++ b/lesson07/lesson08/8L_RaskinSergey_snake/8L_RaskinSergey_snake/SnakeHead.swift @@ -0,0 +1,9 @@ +// +// SnakeHead.swift +// 8L_RaskinSergey_snake +// +// Created by raskin-sa on 11/12/2019. +// Copyright © 2019 raskin-sa. All rights reserved. +// + +import Foundation diff --git a/lesson08/.DS_Store b/lesson08/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9f990e42bfc9a68a1f99c840a8b225a3d76221db GIT binary patch literal 6148 zcmeHK&5G1O5U$=GHQ9hfP*_2*!Gj(KnPJ6Myo7OA5Ehip;vW1NJDX-F8q!0O*-?gp z-~;#odhy^7zJ~e`zKCb7>TY4zQE)CILl;zk)!kJU`s?%`0I=RD?E-`V;Gq(>RRf18pW!yl$^j!;Db7e}#)zD`8mJIW(sym&pY-zc5?Dz@KUkUu+WDq=z z2WlMGq8?Q}QTD@gahA$Nl)G744|Zg+nacxN+$pz2EzA4lyrWc(4#pPAy-be#;pv;I zs6|%DQs*-{9_(gCs>VGvD$+{(+vM85E9wE}@h(Kk8$C4N^ZViIWYX<)+q`>yZQACO z_4Q7hUs=04o%+6a_TsJWN23=nU%h_&?)`^PpLG;4+!(c-viK9epfLyW2XR^Cs@TUU z%6R_orwlH`GuQ(KDNg1PCso0dU#9URW;{HNSaq`a4A@`O3l@K*cde7!0h9L z*)KEuLSg#rn4fERV39#rItCmAM;TZ))sW8r%|E~Yj|RD#W56-6Pz + + + + diff --git a/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/IDEFindNavigatorScopes.plist b/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/IDEFindNavigatorScopes.plist new file mode 100644 index 0000000..5dd5da8 --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/IDEFindNavigatorScopes.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/UserInterfaceState.xcuserstate b/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..777b636e529517d1ed620e0e6c5a42c4eb2237ab GIT binary patch literal 66277 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 N8uD+#JkUM4{|EVlT{Zv! literal 0 HcmV?d00001 diff --git a/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/xcdebugger/Expressions.xcexplist b/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/xcdebugger/Expressions.xcexplist new file mode 100644 index 0000000..a0bfbf1 --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/xcdebugger/Expressions.xcexplist @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + diff --git a/lesson08/8L_RaskinSergey_snake.xcodeproj/xcuserdata/raskin-sa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/lesson08/8L_RaskinSergey_snake.xcodeproj/xcuserdata/raskin-sa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..ff93501 --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake.xcodeproj/xcuserdata/raskin-sa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lesson08/8L_RaskinSergey_snake.xcodeproj/xcuserdata/raskin-sa.xcuserdatad/xcschemes/xcschememanagement.plist b/lesson08/8L_RaskinSergey_snake.xcodeproj/xcuserdata/raskin-sa.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..fcf4a07 --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake.xcodeproj/xcuserdata/raskin-sa.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + 8L_RaskinSergey_snake.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/lesson08/8L_RaskinSergey_snake/.DS_Store b/lesson08/8L_RaskinSergey_snake/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..53e21e71ad338d04f3c3637c14e72748465ec904 GIT binary patch literal 6148 zcmeHKJx>Bb5Pho@1PV|KDX+95v9>u8qZB44B-ZkA81)1L7`3~`|KMNn_xS_#&F%)5 z!=p0Bm>Dwrmc4y5vya>^3&6AFHTHn2k09(~ z)?1EMBWuP_!rfv<-V+AgITj>P{=(64fV|p?BJy$_v!M>of3H3c<-D4^s^`}<mNOd{|8d9kNH{ zHmO0%n6s5%OLPx8RdmVe;dX81qFu<^30N)W8{!$~j51~I>(?JfsRdC^nZL(4g=|@^ zDF@oKB()z?fM>Q?S@r-mRX`O`1wsX6e~9RUvB%7z-8$IVD*&;?VQcKm9|Yk<9%GN0 zLq4GyMQ#@|qk&Cd9doemQ_)K(Qx1(p@qbYJUo z{vQ|L|CdSnO%+fD{*?lz)b6%hT#`RqR~9E{ZA8DMi^;sqp{20#$Fc3mQQV+g Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + +} + diff --git a/lesson08/8L_RaskinSergey_snake/Apple.swift b/lesson08/8L_RaskinSergey_snake/Apple.swift new file mode 100644 index 0000000..275210d --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/Apple.swift @@ -0,0 +1,30 @@ +// +// Apple.swift +// 8L_RaskinSergey_snake +// +// Created by raskin-sa on 11/12/2019. +// Copyright © 2019 raskin-sa. All rights reserved. +// + +import Foundation +import SpriteKit + +class Apple: SKShapeNode { + convenience init(position: CGPoint) { + self.init() + + path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 10, height:10 )).cgPath + + fillColor = UIColor.red + strokeColor = UIColor.red + lineWidth = 5 + + self.position = position + + // придаем яблоку параметры физического тела + self.physicsBody = SKPhysicsBody(circleOfRadius: 10.0, center: CGPoint(x:5, y:5)) + self.physicsBody?.categoryBitMask = CollisionCategory.Apple + } + +} + diff --git a/lesson08/8L_RaskinSergey_snake/Assets.xcassets/AppIcon.appiconset/Contents.json b/lesson08/8L_RaskinSergey_snake/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/lesson08/8L_RaskinSergey_snake/Assets.xcassets/Contents.json b/lesson08/8L_RaskinSergey_snake/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/lesson08/8L_RaskinSergey_snake/Base.lproj/LaunchScreen.storyboard b/lesson08/8L_RaskinSergey_snake/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lesson08/8L_RaskinSergey_snake/Base.lproj/Main.storyboard b/lesson08/8L_RaskinSergey_snake/Base.lproj/Main.storyboard new file mode 100644 index 0000000..2cc971a --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lesson08/8L_RaskinSergey_snake/EdgeBody.swift b/lesson08/8L_RaskinSergey_snake/EdgeBody.swift new file mode 100644 index 0000000..f3179d0 --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/EdgeBody.swift @@ -0,0 +1,37 @@ +// +// EdgeBody.swift +// 8L_RaskinSergey_snake +// +// Created by raskin-sa on 12/12/2019. +// Copyright © 2019 raskin-sa. All rights reserved. +// + +import Foundation +import SpriteKit + +class EdgeBody: SKShapeNode{ + + + init(atPoint point: CGPoint){ + super.init() + + // path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: diametr, height: diametr)).cgPath + path = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 100, height: 100)).cgPath + + fillColor = UIColor.green + strokeColor = UIColor.green + + lineWidth = 5 + self.position = point + +// self.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(diametr-4), center: CGPoint(x: 5, y: 5)) + self.physicsBody = SKPhysicsBody(edgeLoopFrom: (path!)) + self.physicsBody?.isDynamic = true + self.physicsBody?.categoryBitMask = CollisionCategory.EdgeBody + self.physicsBody?.contactTestBitMask = CollisionCategory.SnakeHead | CollisionCategory.Apple + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/lesson08/8L_RaskinSergey_snake/GameMessages.swift b/lesson08/8L_RaskinSergey_snake/GameMessages.swift new file mode 100644 index 0000000..bb6e2ef --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/GameMessages.swift @@ -0,0 +1,28 @@ +// +// Messages.swift +// 8L_RaskinSergey_snake +// +// Created by raskin-sa on 12/12/2019. +// Copyright © 2019 raskin-sa. All rights reserved. +// + +import UIKit +import Foundation + +class GameMessage :UIViewController { + + convenience init (titleText: String, messageText:String) { + + self.init() + + // Создаем контроллер + let alert = UIAlertController(title: titleText, message: messageText, preferredStyle: .alert) + // Создаем кнопку для UIAlertController + let action = UIAlertAction(title: "OK", style: .cancel, handler: nil) + // Добавляем кнопку на UIAlertController + alert.addAction(action) + // Показываем UIAlertController + present(alert, animated: true, completion: nil) + } //convenience init + +} diff --git a/lesson08/8L_RaskinSergey_snake/GameScene.swift b/lesson08/8L_RaskinSergey_snake/GameScene.swift new file mode 100644 index 0000000..cd4efc7 --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/GameScene.swift @@ -0,0 +1,269 @@ +// +// GameScene.swift +// 8L_RaskinSergey_snake +// +// Created by raskin-sa on 11/12/2019. +// Copyright © 2019 raskin-sa. All rights reserved. +// + +import SpriteKit +import GameplayKit + +struct CollisionCategory{ + static let Snake: UInt32 = 0x1 << 0 + static let SnakeHead:UInt32 = 0x1 << 1 + static let Apple:UInt32 = 0x1 << 2 + static let EdgeBody:UInt32 = 0x1 << 3 +} + +class GameScene: SKScene { + + var snake:Snake? + + //private var label : SKLabelNode? + private var spinnyNode : SKShapeNode? + private var isEndGame: Bool = false + + let shiftForButton:CGFloat = 45 + //края игры + private var xStartPosition:CGFloat = 0.0 + private var yStartPosition:CGFloat = 0.0 + private var gameRectWidth:CGFloat = 0.0 + private var gameRectHeight:CGFloat = 0.0 + private var gameRect:CGRect = CGRect(x: 0, y: 0, width: 0, height: 0) + //текстовое поле в центре экрана + var risedTextNode = SKLabelNode(fontNamed: "Chalkduster") + var risedScoreNode = SKLabelNode(fontNamed: "Chalkduster") + + + //счет игры + var score:Int = 0 + + var apple : SKShapeNode? + + override func didMove(to view: SKView) { + // первое появление сцены на экране + backgroundColor = SKColor.black + + self.physicsWorld.gravity = CGVector(dx: 0, dy: 0) + self.physicsWorld.contactDelegate = self + self.physicsBody = SKPhysicsBody(edgeLoopFrom: frame) + self.physicsBody?.allowsRotation = false + + view.showsPhysics = true +////////// +////////// кнопка поворачивает змейку против часовой стрелки +///////// + let leftCounterClockwiseButton = SKShapeNode() + //форма кнопки - круглая + leftCounterClockwiseButton.path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 45, height: 45)).cgPath + //координаты размещения нашей кнопки + leftCounterClockwiseButton.position = CGPoint(x: view.scene!.frame.minX+30, y: view.scene!.frame.minY+30) // 30 - отступ от нижнего левого угла экрана + //цвет кнопки + leftCounterClockwiseButton.fillColor = UIColor.gray + //цвет рамки + leftCounterClockwiseButton.strokeColor = UIColor.gray + //ширина + leftCounterClockwiseButton.lineWidth = 10 + //имя кнопки + leftCounterClockwiseButton.name = "leftCounterClockwiseButton" + //добавляем на экран + self.addChild(leftCounterClockwiseButton) + +////////// +//////////  кнопка поворачивает змейку по часовой стрелки +///////// + let clockWiseButton = SKShapeNode() + //форма кнопки - круглая + clockWiseButton.path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 45, height: 45)).cgPath + //координаты размещения нашей кнопки + clockWiseButton.position = CGPoint(x: view.scene!.frame.maxX-80, y: view.scene!.frame.minY+30) // 30 - отступ от нижнего левого угла экрана + //цвет кнопки + clockWiseButton.fillColor = UIColor.gray + //цвет рамки + clockWiseButton.strokeColor = UIColor.gray + //ширина + clockWiseButton.lineWidth = 10 + //имя кнопки + clockWiseButton.name = "clockWiseButton" + self.addChild(clockWiseButton) + + //края сцены c учетом кнопок + xStartPosition = view.scene!.frame.minX + yStartPosition = view.scene!.frame.minY+shiftForButton + gameRectWidth = view.scene!.frame.maxX - xStartPosition + gameRectHeight = view.scene!.frame.maxY - yStartPosition - 100 + + gameRect = CGRect(x: xStartPosition, y: yStartPosition, width: gameRectWidth, height: gameRectHeight) + +////////// +//////// физический объект прямоугольник с краями игры, касание которого приводит к окончанию игры +/////// + let quad = SKShapeNode(rect: gameRect) + quad.position = CGPoint(x:xStartPosition, y: yStartPosition) // задаем позицию. + quad.lineWidth = 4 // задаем размер линий. + quad.strokeColor = UIColor.green // задаем цвет контура. + quad.fillColor = UIColor.black // задаем цвет внутренности. + + quad.physicsBody = SKPhysicsBody(edgeLoopFrom: gameRect) + quad.physicsBody?.categoryBitMask = CollisionCategory.EdgeBody //края экрана + quad.physicsBody?.collisionBitMask = CollisionCategory.Snake|CollisionCategory.SnakeHead + quad.name = "Quad" // задаем имя. + self.addChild(quad) // добавляем наш объект на нашу сцену. + +/////////////// + ////////// // текст сообщения о конце игры +//////////// + risedTextNode.position = CGPoint(x: view.scene!.frame.midX, y: view.scene!.frame.midY) // задаем позицию. + risedTextNode.fontSize = 18; // задаем размер шрифта. + risedTextNode.fontColor = UIColor.white // задаем цвет шрифта. + risedTextNode.color = UIColor.blue // задаем цвет (Нужен для сочетание с colorBlendFactor). + risedTextNode.colorBlendFactor = 0.5 // задаем colorBlendFactor (0.0 - 1.0) + risedTextNode.numberOfLines = 3 + risedTextNode.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.center // задаем способ выравнивание текста. + risedTextNode.name = "First" // задаем имя спрайта + // !!! но на экран не выводим раньше времени, пока игра не закончилась + +/////////////// +////////// // //текст сообщения о счете игры +//////////// + risedScoreNode.position = CGPoint(x: view.scene!.frame.midX, y: view.scene!.frame.minY+30) // задаем позицию = между двумя кнопками + risedScoreNode.fontSize = 18; // задаем размер шрифта. + risedScoreNode.fontColor = UIColor.white // задаем цвет шрифта. + risedScoreNode.color = UIColor.blue // задаем цвет (Нужен для сочетание с colorBlendFactor). + risedScoreNode.colorBlendFactor = 0.5 // задаем colorBlendFactor (0.0 - 1.0) + risedScoreNode.text = "счет: \(score)" // задаем текст. + risedScoreNode.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.center // задаем способ выравнивание текста. + risedScoreNode.name = "Score" // задаем имя спрайта + self.addChild(risedScoreNode) // добавляем наш спрайт на нашу сцену. + //инициализация змейки и яблока + startGame() + + }//func didMove + + func createApple(){ + let randX = CGFloat(arc4random_uniform(UInt32(gameRect.maxX))) + + var randY:UInt32 + randY = arc4random_uniform(UInt32(gameRect.maxY)) + if randY <= 100{randY = 101} //чтобы яблоко не попадало за пределы прямоугольника + + + apple = Apple(position: CGPoint(x: randX, y: CGFloat(randY))) + self.addChild(apple!) + + //отладочный принт + // print("randX = \(randX),randY = \(randY) gameRect.minX = \(gameRect.minX), gameRect.maxX= \(gameRect.maxX), gameRect.minY = \(gameRect.minY),gameRect.maxY = \(gameRect.maxY), gameRect.width = \(gameRect.width), gameRect.height = \(gameRect.height),xStartPosition = \(xStartPosition), yStartPosition = \(yStartPosition), shiftForButton = \(shiftForButton)") + } + + + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + + for touch in touches{ + let touchLocation = touch.location(in: self) + guard let touchesNode = self.atPoint(touchLocation) as? SKShapeNode, touchesNode.name == "leftCounterClockwiseButton" || touchesNode.name == "clockWiseButton" else{ + return + } + + touchesNode.fillColor = UIColor.green + + //если конец игры наступил, то левая кнопка - начинает игру заново + if touchesNode.name == "leftCounterClockwiseButton"{ + if isEndGame{ + isEndGame = false + startGame() + }else{ + snake!.moveCounterClockwise() + } + }else if touchesNode.name == "clockWiseButton"{ + snake!.moveClockwise() + } + } + }//func touchesBegan + + + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + //если касаемся кнопки - красим кнопку в зеленый цвет + for touch in touches{ + let touchLocation = touch.location(in: self) + guard let touchesNode = self.atPoint(touchLocation) as? SKShapeNode, touchesNode.name == "leftCounterClockwiseButton" || touchesNode.name == "clockWiseButton" else{ + return + } + + touchesNode.fillColor = UIColor.gray + + } + + }//func touchesEnded + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + + } + + + override func update(_ currentTime: TimeInterval) { + // если не выставлен флаг конец игры, то змея двигается. Иначе - нет + if !isEndGame{ + snake!.move() + } + } + +//функция инициализирует элементы сцены и вначале и когда надо начать новую игру после поражения + func startGame(){ + risedTextNode.removeFromParent() + snake?.removeFromParent() + apple?.removeFromParent() + score = 0 + riseScoreMessage(iScore: score) + createApple() + // + snake = Snake(atPoint: CGPoint(x: (view?.scene!.frame.midX)!, y: (view?.scene!.frame.midY)!)) + + self.addChild(snake!) + }// func startGame + + func riseMessage(messageText:String) { + risedTextNode.text = messageText // задаем текст. + self.addChild(risedTextNode) // добавляем наш спрайт на нашу сцену. + }// func riseMessage + + func riseScoreMessage(iScore: Int) { + risedScoreNode.text = "счет: \(iScore)" // задаем текст. + }// func riseScoreMessage +}//class GameScene + + +extension GameScene: SKPhysicsContactDelegate { + func didBegin(_ contact: SKPhysicsContact) { + let bodyes = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask + let collisionObject = bodyes ^ CollisionCategory.SnakeHead + var appleNode: SKNode? + + appleNode = contact.bodyA.node is Apple ? contact.bodyA.node : contact.bodyB.node + + switch collisionObject { + case CollisionCategory.Apple: //голова столкнулась с яблоком + + snake?.addBodyPart() + + appleNode?.removeFromParent() + score += 1 + riseScoreMessage(iScore: score) + createApple() + + case CollisionCategory.EdgeBody: + isEndGame = true + appleNode?.removeFromParent() + //к сожалению, для многострочного текста надо вручную будет выставлять координаты каждой последующей строки + //решил код не перегружать, поэтому текст простой + riseMessage(messageText: "Конец игры! Нажмите левую кнопку") + + //передаем управление функции нажатия левой кнопки -> func touchesBegan + + default: break + + }//switch + }//func +}//extension diff --git a/lesson08/8L_RaskinSergey_snake/GameViewController.swift b/lesson08/8L_RaskinSergey_snake/GameViewController.swift new file mode 100644 index 0000000..af1d6cb --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/GameViewController.swift @@ -0,0 +1,50 @@ +// +// GameViewController.swift +// 8L_RaskinSergey_snake +// +// Created by raskin-sa on 11/12/2019. +// Copyright © 2019 raskin-sa. All rights reserved. +// + +import UIKit +import SpriteKit +import GameplayKit + +class GameViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + //создали сцену для игры + let scene = GameScene(size: view.bounds.size) + //создали экран + let skView = view as! SKView + + //показывать кол-во объектов + skView.showsNodeCount = true + skView.showsFPS = true + skView.ignoresSiblingOrder = true + //растянули на весь экран + scene.scaleMode = .resizeFill + //отправили сцену на экран + skView.presentScene(scene) + + + } + + override var shouldAutorotate: Bool { + return true + } + + override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + if UIDevice.current.userInterfaceIdiom == .phone { + return .allButUpsideDown + } else { + return .all + } + } + + override var prefersStatusBarHidden: Bool { + return true + } +} diff --git a/lesson08/8L_RaskinSergey_snake/Info.plist b/lesson08/8L_RaskinSergey_snake/Info.plist new file mode 100644 index 0000000..870f784 --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/lesson08/8L_RaskinSergey_snake/Snake.swift b/lesson08/8L_RaskinSergey_snake/Snake.swift new file mode 100644 index 0000000..dddea0d --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/Snake.swift @@ -0,0 +1,81 @@ +// +// Snake.swift +// 8L_RaskinSergey_snake +// +// Created by raskin-sa on 11/12/2019. +// Copyright © 2019 raskin-sa. All rights reserved. +// + +import Foundation +import SpriteKit + +class Snake: SKShapeNode { + + let moveSpeed = 125 + var angle: CGFloat = 0.0 + + + var body = [SnakeBodyPart]() + + convenience init(atPoint point: CGPoint){ + self.init() + + let head = SnakeHead(atPoint: point) + + body.append(head) + addChild(head) + } + + func addBodyPart() { + let newBodyPart = SnakeBodyPart(atPoint: CGPoint(x: body[0].position.x, y: body[0].position.y)) + + body.append(newBodyPart) + + addChild(newBodyPart) + } + +// func removeBodyPart(){ +// body = [SnakeBodyPart]() +// +// } + + + func move(){ + guard !body.isEmpty else {return} + let head = body[0] + + moveHead(head) + + for index in (0.. 0 { + let prevBodyPart = body[index-1] + let curBodyPart = body[index] + + moveBodyPart(prevBodyPart,c: curBodyPart) + } + + } + + func moveHead(_ head: SnakeBodyPart){ + let dx = CGFloat(moveSpeed) * sin(angle) + let dy = CGFloat(moveSpeed) * cos(angle) + + let nextPosition = CGPoint(x: head.position.x + dx, y: head.position.y + dy) + let moveAction = SKAction.move(to: nextPosition, duration: 1.0) + + head.run(moveAction) + } + + func moveBodyPart(_ p: SnakeBodyPart, c: SnakeBodyPart){ + let moveAction = SKAction.move(to: CGPoint(x: p.position.x, y: p.position.y), duration: 0.1) + + c.run(moveAction) + } + + func moveClockwise(){ + angle += CGFloat(Double.pi/2) + } + + func moveCounterClockwise(){ + angle -= CGFloat(Double.pi/2) + } +} diff --git a/lesson08/8L_RaskinSergey_snake/SnakeBodyPart.swift b/lesson08/8L_RaskinSergey_snake/SnakeBodyPart.swift new file mode 100644 index 0000000..e7d8186 --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/SnakeBodyPart.swift @@ -0,0 +1,35 @@ +// +// SnakeBodyPart.swift +// 8L_RaskinSergey_snake +// +// Created by raskin-sa on 11/12/2019. +// Copyright © 2019 raskin-sa. All rights reserved. +// + +import Foundation +import SpriteKit + +class SnakeBodyPart: SKShapeNode{ + let diametr = 10 + + init(atPoint point: CGPoint){ + super.init() + + path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: diametr, height: diametr)).cgPath + + fillColor = UIColor.green + strokeColor = UIColor.green + + lineWidth = 5 + self.position = point + + self.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(diametr-4), center: CGPoint(x: 5, y: 5)) + self.physicsBody?.isDynamic = true + self.physicsBody?.categoryBitMask = CollisionCategory.Snake + self.physicsBody?.contactTestBitMask = CollisionCategory.EdgeBody | CollisionCategory.Apple + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/lesson08/8L_RaskinSergey_snake/SnakeHead.swift b/lesson08/8L_RaskinSergey_snake/SnakeHead.swift new file mode 100644 index 0000000..2d37cee --- /dev/null +++ b/lesson08/8L_RaskinSergey_snake/SnakeHead.swift @@ -0,0 +1,24 @@ +// +// SnakeHead.swift +// 8L_RaskinSergey_snake +// +// Created by raskin-sa on 11/12/2019. +// Copyright © 2019 raskin-sa. All rights reserved. +// + +import Foundation +import SpriteKit + +class SnakeHead: SnakeBodyPart { + override init(atPoint point: CGPoint) { + super.init(atPoint: point) + + self.physicsBody?.categoryBitMask = CollisionCategory.SnakeHead + + self.physicsBody?.contactTestBitMask = CollisionCategory.EdgeBody | CollisionCategory.Apple | CollisionCategory.Snake + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} From 88006a52ce9a30777dbb39f2c26772041ac9601e Mon Sep 17 00:00:00 2001 From: Sergei Raskin Date: Fri, 13 Dec 2019 11:42:33 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B1=D0=B0=D0=B3=20=D0=BF=D0=BE=20=D0=B2=D1=8B=D0=BB?= =?UTF-8?q?=D0=B5=D1=82=D1=83=20=D0=BF=D0=BE=20=D0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 66277 -> 67082 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 37 +++++++++--------- .../8L_RaskinSergey_snake/GameScene.swift | 20 ++++------ 3 files changed, 26 insertions(+), 31 deletions(-) diff --git a/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/UserInterfaceState.xcuserstate b/lesson08/8L_RaskinSergey_snake.xcodeproj/project.xcworkspace/xcuserdata/raskin-sa.xcuserdatad/UserInterfaceState.xcuserstate index 777b636e529517d1ed620e0e6c5a42c4eb2237ab..e749e0d9ef3dd48108b770fee42cc292f7c00222 100644 GIT binary patch delta 29216 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 Z?&kg9aaF(G2L=CIiB11E|G(eO{~vxS4@v+4 delta 28676 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�eO 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 Sd(8O%o45o2-T$Ar2mBAeoS9Mp diff --git a/lesson08/8L_RaskinSergey_snake.xcodeproj/xcuserdata/raskin-sa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/lesson08/8L_RaskinSergey_snake.xcodeproj/xcuserdata/raskin-sa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index ff93501..5941be1 100644 --- a/lesson08/8L_RaskinSergey_snake.xcodeproj/xcuserdata/raskin-sa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/lesson08/8L_RaskinSergey_snake.xcodeproj/xcuserdata/raskin-sa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -14,8 +14,8 @@ filePath = "8L_RaskinSergey_snake/GameScene.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "201" - endingLineNumber = "201" + startingLineNumber = "196" + endingLineNumber = "196" landmarkName = "touchesCancelled(_:with:)" landmarkType = "7"> @@ -30,8 +30,8 @@ filePath = "8L_RaskinSergey_snake/GameScene.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "203" - endingLineNumber = "203" + startingLineNumber = "198" + endingLineNumber = "198" landmarkName = "GameScene" landmarkType = "3"> @@ -78,8 +78,8 @@ filePath = "8L_RaskinSergey_snake/GameScene.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "167" - endingLineNumber = "167" + startingLineNumber = "168" + endingLineNumber = "168" landmarkName = "touchesBegan(_:with:)" landmarkType = "7"> @@ -110,8 +110,8 @@ filePath = "8L_RaskinSergey_snake/GameScene.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "219" - endingLineNumber = "219" + startingLineNumber = "213" + endingLineNumber = "213" landmarkName = "startGame()" landmarkType = "7"> @@ -126,8 +126,8 @@ filePath = "8L_RaskinSergey_snake/GameScene.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "260" - endingLineNumber = "260" + startingLineNumber = "254" + endingLineNumber = "254" landmarkName = "didBegin(_:)" landmarkType = "7"> @@ -142,8 +142,8 @@ filePath = "8L_RaskinSergey_snake/GameScene.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "218" - endingLineNumber = "218" + startingLineNumber = "212" + endingLineNumber = "212" landmarkName = "startGame()" landmarkType = "7"> @@ -158,8 +158,8 @@ filePath = "8L_RaskinSergey_snake/GameScene.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "168" - endingLineNumber = "168" + startingLineNumber = "169" + endingLineNumber = "169" landmarkName = "touchesBegan(_:with:)" landmarkType = "7"> @@ -170,6 +170,7 @@ uuid = "B008B4D2-DDBD-48A8-9C10-1F98F34F11D1" shouldBeEnabled = "No" ignoreCount = "0" + condition = "CGFloat(randY) >= gameRect.maxY" continueAfterRunningActions = "No" filePath = "8L_RaskinSergey_snake/GameScene.swift" startingColumnNumber = "9223372036854775807" @@ -191,8 +192,8 @@ filePath = "8L_RaskinSergey_snake/GameScene.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "153" - endingLineNumber = "153" + startingLineNumber = "154" + endingLineNumber = "154" landmarkName = "createApple()" landmarkType = "7"> @@ -207,8 +208,8 @@ filePath = "8L_RaskinSergey_snake/GameScene.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "154" - endingLineNumber = "154" + startingLineNumber = "157" + endingLineNumber = "157" landmarkName = "createApple()" landmarkType = "7"> diff --git a/lesson08/8L_RaskinSergey_snake/GameScene.swift b/lesson08/8L_RaskinSergey_snake/GameScene.swift index cd4efc7..8ccfe55 100644 --- a/lesson08/8L_RaskinSergey_snake/GameScene.swift +++ b/lesson08/8L_RaskinSergey_snake/GameScene.swift @@ -142,23 +142,23 @@ class GameScene: SKScene { }//func didMove func createApple(){ - let randX = CGFloat(arc4random_uniform(UInt32(gameRect.maxX))) - + var randX:UInt32 + randX = arc4random_uniform(UInt32(gameRect.maxX)) + if randX >= 410{randX = 409} //чтобы яблоко не попадало за пределы прямоугольника var randY:UInt32 randY = arc4random_uniform(UInt32(gameRect.maxY)) if randY <= 100{randY = 101} //чтобы яблоко не попадало за пределы прямоугольника - apple = Apple(position: CGPoint(x: randX, y: CGFloat(randY))) + apple = Apple(position: CGPoint(x: CGFloat(randX), y: CGFloat(randY))) + //apple = Apple(position: CGPoint(x: CGFloat(410), y: CGFloat(796))) self.addChild(apple!) //отладочный принт - // print("randX = \(randX),randY = \(randY) gameRect.minX = \(gameRect.minX), gameRect.maxX= \(gameRect.maxX), gameRect.minY = \(gameRect.minY),gameRect.maxY = \(gameRect.maxY), gameRect.width = \(gameRect.width), gameRect.height = \(gameRect.height),xStartPosition = \(xStartPosition), yStartPosition = \(yStartPosition), shiftForButton = \(shiftForButton)") + // print("randX = \(randX),randY = \(randY) gameRect.minX = \(gameRect.minX), gameRect.maxX= \(gameRect.maxX), gameRect.minY = \(gameRect.minY),gameRect.maxY = \(gameRect.maxY), gameRect.width = \(gameRect.width), gameRect.height = \(gameRect.height),xStartPosition = \(xStartPosition), yStartPosition = \(yStartPosition), shiftForButton = \(shiftForButton)") } - - - override func touchesBegan(_ touches: Set, with event: UIEvent?) { +override func touchesBegan(_ touches: Set, with event: UIEvent?) { for touch in touches{ let touchLocation = touch.location(in: self) @@ -182,8 +182,6 @@ class GameScene: SKScene { } }//func touchesBegan - - override func touchesEnded(_ touches: Set, with event: UIEvent?) { //если касаемся кнопки - красим кнопку в зеленый цвет for touch in touches{ @@ -191,18 +189,14 @@ class GameScene: SKScene { guard let touchesNode = self.atPoint(touchLocation) as? SKShapeNode, touchesNode.name == "leftCounterClockwiseButton" || touchesNode.name == "clockWiseButton" else{ return } - touchesNode.fillColor = UIColor.gray - } }//func touchesEnded override func touchesCancelled(_ touches: Set, with event: UIEvent?) { - } - override func update(_ currentTime: TimeInterval) { // если не выставлен флаг конец игры, то змея двигается. Иначе - нет if !isEndGame{