From 413cad5d3c752a318e5f25758c1c213c449cb65b Mon Sep 17 00:00:00 2001 From: Yuriy Mayatnikov Date: Tue, 30 Jun 2020 15:20:47 +0300 Subject: [PATCH] initial --- snakegame.xcodeproj/project.pbxproj | 359 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 22208 bytes .../UserInterfaceState.xcuserstate | Bin 0 -> 42554 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 24 ++ .../xcschemes/xcschememanagement.plist | 14 + .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 + .../xcschemes/xcschememanagement.plist | 14 + snakegame/AppDelegate.swift | 41 ++ snakegame/Apple.swift | 25 ++ .../AppIcon.appiconset/Contents.json | 98 +++++ snakegame/Assets.xcassets/Contents.json | 6 + snakegame/Base.lproj/LaunchScreen.storyboard | 25 ++ snakegame/Base.lproj/Main.storyboard | 26 ++ snakegame/GameScene.swift | 128 +++++++ snakegame/GameViewController.swift | 50 +++ snakegame/Info.plist | 47 +++ snakegame/Snake.swift | 66 ++++ snakegame/SnakeBodyPart.swift | 32 ++ snakegame/SnakeHead.swift | 22 ++ 21 files changed, 998 insertions(+) create mode 100644 snakegame.xcodeproj/project.pbxproj create mode 100644 snakegame.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 snakegame.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 snakegame.xcodeproj/project.xcworkspace/xcuserdata/halofourteen.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 snakegame.xcodeproj/project.xcworkspace/xcuserdata/rodionov.nikolay.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 snakegame.xcodeproj/xcuserdata/halofourteen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 snakegame.xcodeproj/xcuserdata/halofourteen.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 snakegame.xcodeproj/xcuserdata/rodionov.nikolay.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 snakegame.xcodeproj/xcuserdata/rodionov.nikolay.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 snakegame/AppDelegate.swift create mode 100644 snakegame/Apple.swift create mode 100644 snakegame/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 snakegame/Assets.xcassets/Contents.json create mode 100644 snakegame/Base.lproj/LaunchScreen.storyboard create mode 100644 snakegame/Base.lproj/Main.storyboard create mode 100644 snakegame/GameScene.swift create mode 100644 snakegame/GameViewController.swift create mode 100644 snakegame/Info.plist create mode 100644 snakegame/Snake.swift create mode 100644 snakegame/SnakeBodyPart.swift create mode 100644 snakegame/SnakeHead.swift diff --git a/snakegame.xcodeproj/project.pbxproj b/snakegame.xcodeproj/project.pbxproj new file mode 100644 index 0000000..e88cc48 --- /dev/null +++ b/snakegame.xcodeproj/project.pbxproj @@ -0,0 +1,359 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + A4CCBE6E24A2700700E761C2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4CCBE6D24A2700700E761C2 /* AppDelegate.swift */; }; + A4CCBE7424A2700700E761C2 /* GameScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4CCBE7324A2700700E761C2 /* GameScene.swift */; }; + A4CCBE7624A2700700E761C2 /* GameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4CCBE7524A2700700E761C2 /* GameViewController.swift */; }; + A4CCBE7924A2700700E761C2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A4CCBE7724A2700700E761C2 /* Main.storyboard */; }; + A4CCBE7B24A2700700E761C2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A4CCBE7A24A2700700E761C2 /* Assets.xcassets */; }; + A4CCBE7E24A2700700E761C2 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A4CCBE7C24A2700700E761C2 /* LaunchScreen.storyboard */; }; + A4CCBE8624A27FC700E761C2 /* Apple.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4CCBE8524A27FC700E761C2 /* Apple.swift */; }; + A4CCBE8824A280E100E761C2 /* SnakeBodyPart.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4CCBE8724A280E100E761C2 /* SnakeBodyPart.swift */; }; + A4CCBE8A24A2814E00E761C2 /* SnakeHead.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4CCBE8924A2814E00E761C2 /* SnakeHead.swift */; }; + A4CCBE8C24A2817B00E761C2 /* Snake.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4CCBE8B24A2817B00E761C2 /* Snake.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + A4CCBE6A24A2700700E761C2 /* snakegame.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = snakegame.app; sourceTree = BUILT_PRODUCTS_DIR; }; + A4CCBE6D24A2700700E761C2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + A4CCBE7324A2700700E761C2 /* GameScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameScene.swift; sourceTree = ""; }; + A4CCBE7524A2700700E761C2 /* GameViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameViewController.swift; sourceTree = ""; }; + A4CCBE7824A2700700E761C2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + A4CCBE7A24A2700700E761C2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + A4CCBE7D24A2700700E761C2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + A4CCBE7F24A2700700E761C2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A4CCBE8524A27FC700E761C2 /* Apple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Apple.swift; sourceTree = ""; }; + A4CCBE8724A280E100E761C2 /* SnakeBodyPart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnakeBodyPart.swift; sourceTree = ""; }; + A4CCBE8924A2814E00E761C2 /* SnakeHead.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnakeHead.swift; sourceTree = ""; }; + A4CCBE8B24A2817B00E761C2 /* Snake.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Snake.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + A4CCBE6724A2700700E761C2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + A4CCBE6124A2700700E761C2 = { + isa = PBXGroup; + children = ( + A4CCBE6C24A2700700E761C2 /* snakegame */, + A4CCBE6B24A2700700E761C2 /* Products */, + ); + sourceTree = ""; + }; + A4CCBE6B24A2700700E761C2 /* Products */ = { + isa = PBXGroup; + children = ( + A4CCBE6A24A2700700E761C2 /* snakegame.app */, + ); + name = Products; + sourceTree = ""; + }; + A4CCBE6C24A2700700E761C2 /* snakegame */ = { + isa = PBXGroup; + children = ( + A4CCBE6D24A2700700E761C2 /* AppDelegate.swift */, + A4CCBE7324A2700700E761C2 /* GameScene.swift */, + A4CCBE7524A2700700E761C2 /* GameViewController.swift */, + A4CCBE7724A2700700E761C2 /* Main.storyboard */, + A4CCBE7A24A2700700E761C2 /* Assets.xcassets */, + A4CCBE7C24A2700700E761C2 /* LaunchScreen.storyboard */, + A4CCBE7F24A2700700E761C2 /* Info.plist */, + A4CCBE8524A27FC700E761C2 /* Apple.swift */, + A4CCBE8724A280E100E761C2 /* SnakeBodyPart.swift */, + A4CCBE8924A2814E00E761C2 /* SnakeHead.swift */, + A4CCBE8B24A2817B00E761C2 /* Snake.swift */, + ); + path = snakegame; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + A4CCBE6924A2700700E761C2 /* snakegame */ = { + isa = PBXNativeTarget; + buildConfigurationList = A4CCBE8224A2700700E761C2 /* Build configuration list for PBXNativeTarget "snakegame" */; + buildPhases = ( + A4CCBE6624A2700700E761C2 /* Sources */, + A4CCBE6724A2700700E761C2 /* Frameworks */, + A4CCBE6824A2700700E761C2 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = snakegame; + productName = snakegame; + productReference = A4CCBE6A24A2700700E761C2 /* snakegame.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + A4CCBE6224A2700700E761C2 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1150; + LastUpgradeCheck = 1150; + ORGANIZATIONNAME = nrodionov; + TargetAttributes = { + A4CCBE6924A2700700E761C2 = { + CreatedOnToolsVersion = 11.5; + }; + }; + }; + buildConfigurationList = A4CCBE6524A2700700E761C2 /* Build configuration list for PBXProject "snakegame" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = A4CCBE6124A2700700E761C2; + productRefGroup = A4CCBE6B24A2700700E761C2 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A4CCBE6924A2700700E761C2 /* snakegame */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + A4CCBE6824A2700700E761C2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A4CCBE7924A2700700E761C2 /* Main.storyboard in Resources */, + A4CCBE7B24A2700700E761C2 /* Assets.xcassets in Resources */, + A4CCBE7E24A2700700E761C2 /* LaunchScreen.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + A4CCBE6624A2700700E761C2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A4CCBE8A24A2814E00E761C2 /* SnakeHead.swift in Sources */, + A4CCBE8624A27FC700E761C2 /* Apple.swift in Sources */, + A4CCBE7424A2700700E761C2 /* GameScene.swift in Sources */, + A4CCBE7624A2700700E761C2 /* GameViewController.swift in Sources */, + A4CCBE8824A280E100E761C2 /* SnakeBodyPart.swift in Sources */, + A4CCBE8C24A2817B00E761C2 /* Snake.swift in Sources */, + A4CCBE6E24A2700700E761C2 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + A4CCBE7724A2700700E761C2 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + A4CCBE7824A2700700E761C2 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + A4CCBE7C24A2700700E761C2 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + A4CCBE7D24A2700700E761C2 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + A4CCBE8024A2700700E761C2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + A4CCBE8124A2700700E761C2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + A4CCBE8324A2700700E761C2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 5K5TF5N85C; + INFOPLIST_FILE = snakegame/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.nrodionov.snakegame; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + A4CCBE8424A2700700E761C2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 5K5TF5N85C; + INFOPLIST_FILE = snakegame/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.nrodionov.snakegame; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + A4CCBE6524A2700700E761C2 /* Build configuration list for PBXProject "snakegame" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A4CCBE8024A2700700E761C2 /* Debug */, + A4CCBE8124A2700700E761C2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A4CCBE8224A2700700E761C2 /* Build configuration list for PBXNativeTarget "snakegame" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A4CCBE8324A2700700E761C2 /* Debug */, + A4CCBE8424A2700700E761C2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = A4CCBE6224A2700700E761C2 /* Project object */; +} diff --git a/snakegame.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/snakegame.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..9d2342b --- /dev/null +++ b/snakegame.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/snakegame.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/snakegame.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/snakegame.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/snakegame.xcodeproj/project.xcworkspace/xcuserdata/halofourteen.xcuserdatad/UserInterfaceState.xcuserstate b/snakegame.xcodeproj/project.xcworkspace/xcuserdata/halofourteen.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..0174019cf7f84b20cad2f1c22f45fe0912c8c9ae GIT binary patch literal 22208 zcmeHvd0bOR*Z<7DH$WhS1S0N=;tq-IVJDCf3?Lwjf*S@15QPMjfZ{q)YwK29Tdh@F z1>CLL+PcBdt*zDHnR^LfwSAuVeSgn?Px1-Oo#o7#nKNh3 zocYczsi`vC9U&o~Ba9ftA`Xd=8*)dUg}v%bHoMtsDe7gkl~$VJDZiJ)T2t7|S~AvD z>ahDFJbP8K%qJ@^!&Gl7OK#5e8S+5lf;@-OVIp{|9M3>rNP^m<4yYpH!|_;$Q}HM~8W-a+*oaGT zDK5h%T#hU7IBdgq?7&m-R6Gq&#{@rx=ir6-8T>3>hu7l`cq86~U%{L47Q7X|ieJOq z@ay;uydCer`|&&Y06vI6!YA-adBw|qIx}6Eu1pW67t@>R$Mk2EOgN)vVwq$nmC-ZlOa_z9nDO1Lnm~y6qsbtK| zSf-kBGBcQ&%q->!W;XLA^At0OSy@bz|LG4_3^2vR}1x-&S0Nn z7qQQ=&$El!CF~1q1KY?pv76Z~>{j*@_6YkadzAf*J;okqKW9&{C)rc%7wnhpY4#j@ zp8cM^!QNzlX790oviI2s9O5|6gOhOnTzjq?*Nf}T_2-maC>O~^ae6L;%jWX9QQT;* zm>a_xxe~6N8_P}N2sfLX%RS94;-2GP;FfbMxHq`%+zxIhw~O1&?cv_!_Hu7=`?v$# zA?`Eo7JtY_4eWLzj;Ot?NwT3wA&kz9QhK4u#HH8+7XUyC&9%s zg+Z4(%xW8FuQ8UIbk@?^YLmrLEbFBYPmN3s2@6q1L~3=)2z7XjGFlrFqSS|JL$tc& zkWhV0l&j)Ss25UgK%G$+)D?9@-BAGQfqJ4qA|h_Yop=y2@g!bELcBMi-lz}ii~6Dd zXaEXA!AMD@#D_S@1o9-=NH&qpWDAJ`wo+^+rqS-uTB~cS zOh7P)sv^4sS}YVxG1@`n(CW;N`dm|u)dpSR>YAVrI1J9*+q=9?BVLbSQL*`4JeMt8c+g}(+*G;mRie9 zDj1y%vqSZ8Syhgy!f3Cx=UHoQr6w)pa}i2LdZb#7QjiwuP%7~y?MQplaWzUqgOCBG zlg>m<29wbQhHfxOOcu&UIcNx#nG$IF2>5R^RY6zPnFt~Z;#VxwmYb_gu>%JVEU-go z4XiX)S<9hXhsk6aSYxyDDtlm_#W>ECW~??1w9`-p4JFq=AFJ#W%;k<_C?6G|p=j7} zK@u&HUMK`j_JXWD=!-^3E-cK-%jOq>w%m>6Iq@%+4f=OD;pwLwLXCeul)w^o&zEfvRjr92NUXh8ExU(#QAUWgW~hEd?Z z(DTB#zYGa;iW^^NESR48_h`f{`a`L9|Q4?BCRAgWyT8q|^5E4p)N6g3?_6@{;Tr^)pZ%~@s(CZ|EM7E(>P!6qqlp3AzZ=$`$GQX_6!L<$}3~wv9O_0=v z-+ky1mFTz8e)JAHfDWQ}(R=89^a1*iM3Wd2OX5g8Ng#m>*w3XhaR))ba2Hb8qB4g!3)sm2 z3fO-{z;J&MFg$=1H47M4K32e7gByX>ye#1;kfjk+GyMwM?onBCXiOQ%Qx#Ovbu|rwW7zS7QtPk#VGo|Miyz%X+v3q83jS1ZV;X zkOc$+PXYn5KBA1|ZrOoJzX{8tti7wW6VDRFX(osh?6Ll?v@8EyJRkWt;CZCB0WTnR zBzP2<_*v9Ib=bgYC~C1H+UWFTQBW}X0Q5|vek~f3QB(um9WHvkn7dec!3X>yGmoeOIPpvXnP}{3m z<}XC+Om*f`lfgdB3_Agn9gG}VOa7roo7qTrhl;j&Gp(h~n=4--ns?baU=LJl1G>$T z0$sha+FVs%ENj=6z+kYMs;H&-2oqYXrPKx+H83O0HI-J2$!@N$h5d=u78s|bQjE_=&Kfy=vr(^+nnk;O>pW$QpIC+LVOBPXn`#e&^L+s_) z%vKw0hl^!F|C}+!SUN7xRAaQ!@hO(||L5F79Yc*(wWdIghcK&3Q9y471w1+j&fs&8 zwBkJe7JB`8vY7UIphlp8h6EI()S9cxT2Dl2{ z#&;hn^gI3o-y_S(3i1*ZN@_Nbn>jwlVC2Iv3`=*?Wk!cFTkc<6;&OpvhUG+V?*Dt& zr-wM-X0HJ zW+;OxZ!R~RV2ZSFNzJdXF}0@1kj(8^R(8&i$N5Vh-uLC?LSG9`6DW~iFuG;C#cv{; z@`vWSHk6QFSoAj=vcjBPNFFf~wEbT@zG>9x+{Z*ilpqDILj)AY7@K9IaZK)s(lS%I zw4%~Hb{w!UtkUc-0q;~7f@%e|$3KAh>Z)4GH~n;npTs^cF9ZIofd5%#MjZ`DLwH-MF*UC_ z{6n32XcmMu2r)ft94WaFPKR(w?YM$u2nR#>m2#WD0K$n7{-UyW5DiBl#QIOF%pV5f zZV*nllw@T?I2OW{rFQLb2={|rDuePu zIZDF{Kl()JUgqhRHrJXk`V*RtmgnfoBW2FO58Je9Pe!CWH%zUmTaoC2%2p zZ8peJkCc3TJRj$(wYBB6ZC6@q9S^*=ZGGGRa`oXm&|eOqTm>zp-d5T_cHrh7@I9`% zbZc+&H9pg+wqH%nlBb6lMz4k30v7=@Y{ll%PZ!?!hfx#8x9tck9~!spwsOHsO4%cF z0sSmGCORrQEBYJ-!2j<=Cq$Pa^p)rge7|hrCkOa<$ph_sDmiBOYlc{t1PGE<%E!>L zsDdvYmq+<*9W#N>UnpRfub0YfGEap{ST+3U$eQ>*O@sQ4Fdla3?OKo#DjQ0Wm{uVTXTe*3i&bQL`VaqT!k~l?d)6ZZgvm*F$#dEJ?uN| zZa(x1yBEH%wUm2U!i9PCu!K{2D{Yo&+D1pSOtqE$wh}=5%hg*nziXt%^1b%xNVJt0 zI%5AGM{VgmtPzCK;b)yRP#P+Amky9dN|U8n+5^5}QVoOxr9GvY()N%#NZMDblXhs_Emx$*m&(^Y;JGc`9)U8xhFClFxRDrwN0wpE@A8?Wa^;f}jJ=D`$3vB_N_mnp)9>I^{V`c)J4u^6E z&`jAVfJ=t+VNG+GYO8qoQe7ozZzY!msfnD9i>7+4Z3}?9&|g%eJ)ZlvGsEN->(2FQjp zzal_gl)`9MLyt{>BM&FwE#{$T0BNxd{Qs)~Ww8ZL6n3J$;P-zYeT0qz#^NhjPc8zY z;s*K^{edy~ZoRP|?g)5_-Z%({;b@!)=!s06i;Dm~Q2~yfT0l$8#PjeX@QO45LgF>p zo4&r`+{5n-%Sadn;2ioe1DR;RHe@jQ%qYMzjAteRg5hbvEHnaQVF!;- zIKiA_t}?e-1ULkLwg;dOq5*l3%?<~IfsLKU&IK$%BVY*jupa<&;2e96z00|Aep~?H z0phqpTme_gjpwFu^SNc*dN}KUmpjg#hx7dVB5zR_QIIHBWDpgKDnt`RvqeipYem~d z?}3KCDEigS&CMUiM-AgvSjajZC7Tqdp; zFBGp9?-740z9{~~Q|{T_xnmdcErP zq1Sn@yAof?0Et#IQc^2V{!Qv9RY?uf zGU;^ba_J7~G3j+5u}^QGWS`MKlYEx=yzcX<&o!A?)<>q58D-OC%VoP|r)0O~e)3Rx zw!B(CU%pX(NPgMZ-M5c#s&AR^EZ-*IgT5F1Sie9&tzW6%OuyBB@A+L+xGDN742rRe zd5X=7BZ?dCeA`8|8`^GSyXEcPYIn|`_3z_v@UQY;=)cYXr2p^jyS7hmZ)!iM{g(E} z+TZEWxr3&Isl(h3TRWWS@O#IAj;S5Tb$qtt&W>Mq;yMlJG^EpnPA_+QuhX^8iq3JJ zOFPf)ysh);E=-pJU2?lj?$Xrd<1V+mcI%qfwWjNfT@QA>*3G}0rrX$V&v)C`?MipQ z?up&a-JkFNcK06w+65#BR0S*zcsJlik1jn1^{DO9(BnvtKYI4ldy9KV_pa>yLhlcH-|5r0&#*pE_SxCza^DVp4Sgr| z-PHF?Kkt4?{l@oe?Du(pxBk)n$Mt`y|Iq==fXD%r1C|f?G>8d`3Ni=16!clJC^#nA z65JSkN-0q$E9;b-l;>6cs!Y`k)lSv*fxQL}ANcIR4+h>3i43WN)$OZL-_Z2X8KHYZ ze-0ZERvNZE?DKH%aDDjn@Ll0IBZ4AK5idu45$P8>IP%HJ1Cf75siSOBTcWP0d#T5$ zSEx@#E249v=SP1SBZ^6hnI5w@=5B0MtRr??>`!sZxN&hC<1WYdjW@-wj=zx5Gr^e9 zkZ>+BAaP9Ms>E|iJ(7$`jY;2X0ySltwVF%G{gcNgzmj}CB_zd`vOVRFHdZ@TyI;rZ z(sXlmM^b%L3sRS*p4Io%SLiqCZ=^-0O-|cCNHi#8(6fV18M+!u4I2zM($(ox)8EaI zWaMQm%lI~PK&CBo&tPV7`rzjVpULW-Wy#u^jj|2d&t-p|(>G^)&YMHrhU5%cKIHq{ z(A+7xALRMv73Xct`!zo$e_{St1^o(Y3l0qR89H+4hM{+c>4q&DcCK(>;nc#9iaHgU zi*^lnA3k*W+TpiHq>flT;^N52k+Vmh9MyN!#8HPvcN$$a`mJK0Vq@{^V?<+yjoCQn zo-y0lXuMrwC|OZ*qf}e^Lh02qP1*BhS4;_}MW##T3FV8*FIOZ~JXdk0GO2P&`#KJ{eWlPjO%o-#jmWKQ^;7w6ocTQ>LbypVZI=G~iLI{)y3&;?5u zJb1eN=_3oH7QXz9+cTDDPClFT?D|FWMUxg?cy91>JDv}Ce(v+XEG}MrXi3D9l`nX{ zQ2WBUrI|~2z1Zu;XI{Lwta90j9*r#zxlUq|=)Ay@~uKr+6^qLK8JFT6!_Rn>eb?4USu77ufdc%f|T{bS<#B8eF zbmf(iuN>X1+q`Rwa!bQj|E=?0MX%Pr`on8uUOTxhW7~n(qhH_hM(;OPZ1>wfcL&~4 zzvITv%AMzS747r}l z_D>=|*?uJI$c|6dpYA#ub9B#V@t^HGmUQf$O$#-tKZqb zyLWNc_uk(xxzzpAhRb1>_g>LoIr_thA1+?4x%$Vo*+0sETyeeM^*4Uf{PgjS!W$QF z+HOAhdH$`Ax7Pg<@ymhRIk(ULTK(%Ecjo@q@wfGNqwjw3`>@|H{W0O5`@N-q_WyIw z{fzr(9#lVg0KT5ux`#YCjT3SodWIbJlUy#s#(L^snlhDl^RzhC$^_?R<1}zEf&1sL z@!+wMBZ@8S&s!D-KywZOG-n-H5;M_!^c-4+8o`QK3mDCvfF3xEJ^?_$XXtalX?_71 z&GWF&`vq(W4$E-|z+(0S6lOm>07n4^vk(u*BLR0=fz5!qtj6O3by1h&IfupVyXJNPcXhwlS!l3@Y>8yU|eGFm2!83vfh3Z{ms1smci<{7|0ZUV&P z8_WlQay-l2WPWA-ST*bH_s*b;?+S}bM9vDK`V9k2LW@vY(~#m|Zd z?YMT5c0TPC?fSO^Zvg#(V_Eo2Z~ou>uU#^EnTLWfBF1f0i_=dBzUL;0az};Wh@(%< zK5a(K$dGC+{)F*jB=}QC%J{%>z$(%}7LrENv=)EH_%eQABl$AEa5S)*tRd^*?`nEL z(DR=?`P6s$FEarvkg4xKQ=*yj9QE`x>R;r{H`4<%$SK3em~P;E@6H5(tf?FjADDcg zU|ZqTPnMCjLJ#$10)@^nH8MR>;plv8893C8j)2g}*w82;Pamf5UtOn6ABw<{jpdJ8 zm;v~31HdQQmZKF$#e`7M9>g^;q2v_;lmLavM6_fSo}=;MRb;&oj-w~pS|$PHCkdc= zTghwWb<)2L9*xoQkg-?)BX~5%z!Ts0f54-)0rj=zI*TX##{Yrvqd+%i2vdYq>zG_7 z4~+E!W++UzLb8MGB)iCNvWL7$_O3&{nGx_C#T24CW(;`$--6#hvX=}XZ&S&o=V}5B zGv8Q}Vze3TLj|bW=#~V%4UQy)L$J0vhZ$X2hnXFfd2kj`Wda(-vVOFr3ok2_D9*~u z1&pcHMo~^Y#*9up0IIp9-PBS5NWhtW!6ucuUf{F!i)C`?KOsTrMUxG%%XGYKFj$byV26tUFo6pU1|1xB80>?MWTDSrgHEV6%~r$L0~{F2CW2BB z@@3UlmzZn>g9dQ(5EDiWBF_?VuQQ3VACov<$Ri*nl} zdT1tKxd9*^t&NG)$AsyWI-M?6saGfKm0`)c7^PaLj?twgCr3r5hK`&}8yFlA8Ws{V z^_V6(Mf(fF98PZ{ zj~Fjw(L_Yh^WgYc2X2p@V6L151LZd0(fq-=p~4~H+=#%DV4g(d7%)*1a1u_&T5xux zfxE*9rpiw#_! zxJ_(~opFHSQ%ClbcgO*9ki1LYBkz+B)`LE-hpHztQ<$j`o(>xMLnn53VoxXbc48kQ zb>ePRImzR4Xd}aajG&w{LlaI*9tHJVn7CQPl@(KBl+;L(z+PZ*;@cS)|Qo+=!ZAQj){+ld% zxMu*^;=f7d8wpy|b;)IzK&^v zky%4w;mmqw133X>bP|42@-_LEMA5~ud7Xrt3jp`&0ug!I!E|Y>wd>7Q4mg&yRHRzy zdIy}+DHXrK_o~9_|B}OQ{lrW8pNLwYCOU zUpNJ>GS8m z7eFSkT_cN{n0M(Hg7h0z2nV=jAOrRs7u6%o(G~_iBWFplE8%nIWJ`6Y$T#%b27lFu zInA7b1gKz91M@XG*P3vS`IeSAPtG^+HG(AmbwzQ}0Aks5YYpp*r*O6+~s#c;m znO~5qk@=aqMJ|%>8=2e8ujCT>m5O=C@wFyfeGY(rssX2EgJE-7H>2Q?8e(#c4)|+v zRr&`D2g<9Nd(5BAedYnVOs{)LLWG zR$8sRBy@pQ-jQmw*XLUe7MQNEYZyYg;8*_{nrxie#f$HM5+JA-|EkeW)%a#8%XE%Xg=KFvYSE3gsWtbqDx6@(J9UO zDa1tBOSovltuhPHOR2J!j%$YR0fEwS6x;%J(Tgg)_Gp%Rb`YBhIstb7>1+nMPaZfi zY63q%7OHb%?8GeWSAc8Yq@x$f9@1rSodvkn*4k{qW~Q+g~T51pxA+^#azIUFpOf>AdSCz?fStra;XT zgs0*nvYK80I3jQ#l-=Zn>lMI!SGw?0c3P}3YI_B0YBUc~dX?RWRGZn?*lq0V>>F?{ zzk}V$?&8np--MI+x16}U69+hP4=3*F#DPxS%ZYnCaUUn{>%{$>xW5wv$3dIfx7q!$ z>>OYZf=98AeILRfvWM8i2r>sdaU_AfQBJIep@#f1^fA_n)0_Y!mkMJ@rz)79EdvQs zFZ94*xS?u>+mCz-;Abi1SJ*rh%fbZPWUz6fxf-@pRAT_D+HSS*T85fB&9c-?3Utr# z)*w{jvVmGVo3Dny)&+}gB{f~CTng#Xqx8XL84CtvP~SnzBq9-ud_K3=LY_bmI93&IDp$mG*3fL%y|l? z-3iW{18*hg!^t=~=L^Tz;QECcT&B7U)IYjamrzdl9M#}|X^o~{EXrthxvOkzniK1s zINpi%P8>&87t02=>}iBG7WNNR`{}Hdq^d>dw(OC3t;lr%uPN7&>%?{Dx;Sxy6Kk9} z*@;uYbINt+0-zN=7+)@Mcx$}{JV#EPNLD*>Qc;UbMd++PTwh^N!(UXW6TEiRv}^7^ zv#pWqM{O0l@A=z2&2=;9Y2D;JUsH1&K8~h9+#;$ol3YB7(Ksj8@{z6EhSQuH&>t~e zEEfk2i3coOBA0|l0&*k;a1x6-ExcbM8~wngjwoxsunD)NVd1sI4GO`gsj98E2;M1> zER%&^J%!Cvn@D+SCD`Y1CEb=wFUW#4!7#$|$Itat3tU-+A`m5%&4fFm0=XjUO^14_ zYk;t;zSd-r(Z3M3mJ)xNo6N_FQwj2W(EJfPJ&hYgt*fE=)P8hHic89x05FqId;IS* zfWr=o{S+pX$@%*>)3nG{UPJM2O6Ax-pBwRjM2zmg} z9z(fdPHb@EbSKVe;)=N8+z2PmbmGBIoCSAoseosgEoES&J*3F}1pP7y-ai1g4X8@q zl=N|BFBXzztiV7iWuVN7v*9R#s{l!<bM?A%YoI{(Ir(6b%x+V?EyPD6Ln?N{Ydl1O!6yW2VOxVD;XGB<^4 zGBm}BVN7zH6;D5*3!P{|6E}mK$<1=&JSWa~;(`_p@^8=Lg~BWz`j=UJoKr&|C&0X2 zjIxQp6BiQUMmM*Vd-3tY+sG}Wg7`SOhS-|g64)FHH~*D({yh&a9sUxx9xfzuFLNuo zRa^tt$Te}Rxi#EcZk-c@ zZF6E17&!d90Gzl&xY_E2`*UEV{`YMFt?vw=7w2I;c=WvjU|anU-Uh(E4Yw1y{Z3ro zd_9pnNKXVGxjgL}>ciY8{MAJ6W1@26%71xT6_92p`P+!x2@>JNWBW8Xtf(ET6Sa5Z$<&0MLV{a5FicbOE8hdkgM~AVmY)tbbW5iOYNiX9>|7l86Ab{4MX(ifHlQicjdV{8yKlR- zs@ZExM+J^hI>JqkV0gDzEJ_0G$51p9jRq8E6A24nGxOQ+?U;r1)sQ`Z)#znyUnxetliU&KZfU|Maxh3%KrLVZ( z;O$EEtxDmdC{eU1PLv=@5?Mu4L{EsG6wMLM6D4blx$eb)+^ln- z=swAPiu*Ko;y%ND79csFa(~HvrF(;WllvO?b?zJ7H@RGLtoS+cVsV4`Rq<{>f$kN*E&fn^LVQ|$MtoL$0WhJL#8<>WiSK*5 zdv^8gz<9X4`-7Cmzu$SHI1+N`mC%n!Adh~+VMX&2#cf9U;{o(be*8>Tbuo4j00S} z>1OFx>1)#0r3a*+O23nSFTE`NL3&MkU3x?Mv-B6~uhQRqynTFpQudAPyzIK{mh86dj_jW7z8uLJxm?~&-a{TJ?<4Og zA0UsGrvP%cL|!H@msiTi%B$oSd5zpAcgUZV&ymlQFOV;kKP!JuzF7W({6+b4`5O7F zfUrFyzvb)U+toMHHw#dTfVn_@A%&J3-(L% z8{=p8bNJQyP4t`OH^pz7AMsn@_q^W{zomZ5{2Kh4{MPub^V{HeOo0@^ibzGgLa)eE z3|EX)j8=?MR4B}faf)h%RWVU9NkJ3~6wfP`D3&UgDH;?_iZzOLiVccwitUO6ibINz z6rU(QRh(3Op*XELqd2R$q`0oQqj(Th5>ysc9W*&;M$nv~B|%L=Yl7AVZ3x;Fv^i*N z(B7bZLHmOa1ic&de$a!{fs!CNRl|xmhny8wj znxdMfB7nG^rCO=lqB=E@0o<)-pmX4gfosAKg?|+OMfjEQtKmO}{}g^R{8sqw@H^pm zBRnG{5z+{Ggd(DSM5l-@5#1wtL_|cSMGTLqiI^JkO2pd{pG2IFxDatM;!?zwh^rC5 zMEn}@Tg2}Xe?~lr>=~(vERM8ClE{UT&qh8Mxj6EL$QL7*N4^yKO5~QvS0lGYz7e@2 za#!S@$i0ytMg9M3qE68?`#>wWv3uc0}!tdNb;+s86HLM12!=KI*%u@1rh9 z{T%f`?WXond#WXBKXp5Gdv!;3XF&e;R)?u0)oOLDI$oWq&QNEmbJTh20`)L;nYu!4 zR#&Ml>KgS_HBrw{KcRk7Jx9GVxX{)W_7P)L*K?eKZp-i|!iTC%Rwsfau_8RkS)fCOR%UAv!5KIeK_>ee@I2%c8eM?~FbgeLDKP z=^inj8}|zj89BJOms|gj6P;iOnOXaOhHU>j4`GpW?anFm{~CkVwS{g ziFrNdqnHaZmt$_m`o^}8jgF0p)yL+=7Q_yVEs7lxJ1Vv~wkp;VTN7&o4D*E8NwHI6 zSH$j!JsNv8&MnR_u2Wo>xNdPh;`+q}#i`;#;=I@uBe%@#^^4`1trS@#grk@m2Bl@zdg+@w4LR#LtUg5Wg^fUHqZ= zlks21pNan_{ydB$yH^6RZig z1V_Szg!+Uh6P{04m#`<{V8YRaQwgUNzD_uoa4F%3glh>uCEQGSkm!-vF0o5u_r#uw zy%U2I2PTFlMkGch8WM98ixVd$PE90|ni7pkQ=yrxnWdSdnXg%>c~7A&D)wonq!)8 zG~a8kXs&5~()_BqtNBB7KN%(aCU;H_Ne)X+O3q6zPc|pplBXrlOkSA0BKf7{my=f| zZ%_U(`Bd@`DQ+p^6iJFtif@V{MW2$LQkXI#Wps)$r7Wd9#hx-PWmd|QDRWZhrz}ZX znX)hCV9K{CKc(DExs~#(meq>1?pjZ6du=Ce7j1WKe{HUIw6<0|SNpQ|HSN3FBiakv zJKDS2KeT`9kdD!L=@dGZE>f4RGwCe47j-Y|4(X2RPUybSoz`8_UDw^z{i3_0yPt|v zxm5R5acaBNfYhkeL8e|!;so$smruWwm&`0U>^+WYV z`jPr#eTm)#$o8@N>G~P^C-hJ0=jj*dm*`*8uhKW^*Xq~nx9fN6ckB1+59vSBf1*FC z|5|@e|E>O_{wMuC{rxnY#->TqdZzVFOGwL08HWBdg)6$%2v(lbSo13;E?U}Ua z($=SKO52>aHSM*u*VA^S?MmB|wm0qVw0F|Zru{jn#~|&Xia~P*Z5?!c(9Z_Bp%Y;0 z0}MS4L52uJlp)#>Ylt@_8ZrzyhFn8|VYp$WVYFe4!D^Uda2jSBW*g=i78n*9o;9p8 z95sAtxM8@RE=g~fu1pV0Pfs6~J|?|1y*%BVUX@;(J~4eVp!7-ljP!ZwP3c?Gccs6V zekA>~^v}~zrJqi}kbW`!Qu>wjtLZ;xcxCj<$jB(m7@y(Dn2<3kV`|3qjHfadWIU7c zT*l&z#*7UauVie^*p{(7V{gX3jCV2)W_+A+BIDbPD;d`^e#-bc<8H>ijQg25lg;$b h^v?{;?339)GdNR~8N%DMfaewdi{OrP+fSzM{{hHkqb&dc literal 0 HcmV?d00001 diff --git a/snakegame.xcodeproj/project.xcworkspace/xcuserdata/rodionov.nikolay.xcuserdatad/UserInterfaceState.xcuserstate b/snakegame.xcodeproj/project.xcworkspace/xcuserdata/rodionov.nikolay.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..5a5abb57b0d014c4372acd47a871125e9e1a5957 GIT binary patch literal 42554 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

`4qgTG|i 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 literal 0 HcmV?d00001 diff --git a/snakegame.xcodeproj/xcuserdata/halofourteen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/snakegame.xcodeproj/xcuserdata/halofourteen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..ff4ecc1 --- /dev/null +++ b/snakegame.xcodeproj/xcuserdata/halofourteen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/snakegame.xcodeproj/xcuserdata/halofourteen.xcuserdatad/xcschemes/xcschememanagement.plist b/snakegame.xcodeproj/xcuserdata/halofourteen.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..cf4973b --- /dev/null +++ b/snakegame.xcodeproj/xcuserdata/halofourteen.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + snakegame.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/snakegame.xcodeproj/xcuserdata/rodionov.nikolay.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/snakegame.xcodeproj/xcuserdata/rodionov.nikolay.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..9761ea2 --- /dev/null +++ b/snakegame.xcodeproj/xcuserdata/rodionov.nikolay.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/snakegame.xcodeproj/xcuserdata/rodionov.nikolay.xcuserdatad/xcschemes/xcschememanagement.plist b/snakegame.xcodeproj/xcuserdata/rodionov.nikolay.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..cf4973b --- /dev/null +++ b/snakegame.xcodeproj/xcuserdata/rodionov.nikolay.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + snakegame.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/snakegame/AppDelegate.swift b/snakegame/AppDelegate.swift new file mode 100644 index 0000000..7817508 --- /dev/null +++ b/snakegame/AppDelegate.swift @@ -0,0 +1,41 @@ +// +// AppDelegate.swift +// snakegame +// +// Created by Nik Rodionov on 23.06.2020. +// Copyright © 2020 nrodionov. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> 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/snakegame/Apple.swift b/snakegame/Apple.swift new file mode 100644 index 0000000..f4467be --- /dev/null +++ b/snakegame/Apple.swift @@ -0,0 +1,25 @@ +// +// Apple.swift +// snakegame +// +// Created by Nik Rodionov on 23.06.2020. +// Copyright © 2020 nrodionov. All rights reserved. +// + +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 = .red + strokeColor = .red + lineWidth = 5 + self.position = position + + physicsBody = SKPhysicsBody(circleOfRadius: 10.0, center:CGPoint(x: 5, y: 5)) + physicsBody?.categoryBitMask = CollisionCategories.Apple + } +} diff --git a/snakegame/Assets.xcassets/AppIcon.appiconset/Contents.json b/snakegame/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/snakegame/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/snakegame/Assets.xcassets/Contents.json b/snakegame/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/snakegame/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/snakegame/Base.lproj/LaunchScreen.storyboard b/snakegame/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/snakegame/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/snakegame/Base.lproj/Main.storyboard b/snakegame/Base.lproj/Main.storyboard new file mode 100644 index 0000000..6ecf17a --- /dev/null +++ b/snakegame/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/snakegame/GameScene.swift b/snakegame/GameScene.swift new file mode 100644 index 0000000..2f10bec --- /dev/null +++ b/snakegame/GameScene.swift @@ -0,0 +1,128 @@ +// +// GameScene.swift +// snakegame +// +// Created by Nik Rodionov on 23.06.2020. +// Copyright © 2020 nrodionov. All rights reserved. +// + +import SpriteKit +import GameplayKit + +struct CollisionCategories { + static let Snake: UInt32 = 1 + static let SnakeHead: UInt32 = 1 << 1 + static let Apple: UInt32 = 1 << 2 + static let EdgeBody: UInt32 = 1 << 3 +} + +class GameScene: SKScene { + private let counterClockWiseButtonName = "counterClockwiseButton" + private let clockWiseButtonName = "clockwiseButton" + private var snake: Snake! + + override func didMove(to view: SKView) { + backgroundColor = .black + + physicsWorld.gravity = CGVector(dx: 0, dy: 0) + + physicsBody = SKPhysicsBody(edgeLoopFrom: frame) + physicsBody?.allowsRotation = false + + let counterClockwisePosition = CGPoint(x: frame.minX + 30, y: frame.minY + 30) + let clockwisePosition = CGPoint(x: frame.maxX - 80, y: frame.minY + 30) + + addRotationButton(name: counterClockWiseButtonName, position: counterClockwisePosition) + addRotationButton(name: clockWiseButtonName, position: clockwisePosition) + + snake = Snake(position: CGPoint(x: frame.midX, y: frame.midY)) + addChild(snake) + createApple() + + physicsWorld.contactDelegate = self + + physicsBody?.categoryBitMask = CollisionCategories.EdgeBody + physicsBody?.collisionBitMask = CollisionCategories.Snake | CollisionCategories.SnakeHead + } + + private func createApple() { + let randX = CGFloat.random(in: 0.., with event: UIEvent?) { + + for touch in touches { + let touchLocation = touch.location(in: self) + + guard let touchedNode = atPoint(touchLocation) as? SKShapeNode else { continue } + + if touchedNode.name == clockWiseButtonName { + touchedNode.fillColor = .green + snake.moveClockWise() + } + else if touchedNode.name == counterClockWiseButtonName { + touchedNode.fillColor = .green + snake.moveCounterClockWise() + } + } + } + + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + for touch in touches { + let touchLocation = touch.location(in: self) + + guard let touchedNode = atPoint(touchLocation) as? SKShapeNode else { continue } + + if touchedNode.name == clockWiseButtonName { + touchedNode.fillColor = .gray + } + else if touchedNode.name == counterClockWiseButtonName { + touchedNode.fillColor = .gray + } + } + + // * SKLabelNode - для отображения текста + } + + + override func update(_ currentTime: TimeInterval) { + // Called before each frame is rendered + snake.move() + } +} + +extension GameScene: SKPhysicsContactDelegate { + func didBegin(_ contact: SKPhysicsContact) { + let bytes = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask + + let collisioObject = bytes ^ CollisionCategories.SnakeHead + + switch collisioObject { + case CollisionCategories.Apple: + let apple = contact.bodyA.node is Apple ? contact.bodyA.node : contact.bodyB.node + snake.addBodyPart() + apple?.removeFromParent() + createApple() + default: + break + } + } +} diff --git a/snakegame/GameViewController.swift b/snakegame/GameViewController.swift new file mode 100644 index 0000000..6a423f4 --- /dev/null +++ b/snakegame/GameViewController.swift @@ -0,0 +1,50 @@ +// +// GameViewController.swift +// snakegame +// +// Created by Nik Rodionov on 23.06.2020. +// Copyright © 2020 nrodionov. All rights reserved. +// + +import UIKit +import SpriteKit +import GameplayKit + +class GameViewController: UIViewController { + override func viewDidLoad() { + super.viewDidLoad() + + // view UIView -> view SKView + + // self.view as? SKView -> SKView? + let v1 = self.view as? SKView + if let skView = v1 { + let scene = GameScene() + scene.scaleMode = .resizeFill + + skView.presentScene(scene) + + skView.showsPhysics = true + skView.ignoresSiblingOrder = true + skView.showsFPS = true + skView.showsNodeCount = true + } + } + + + 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/snakegame/Info.plist b/snakegame/Info.plist new file mode 100644 index 0000000..870f784 --- /dev/null +++ b/snakegame/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/snakegame/Snake.swift b/snakegame/Snake.swift new file mode 100644 index 0000000..aa18b97 --- /dev/null +++ b/snakegame/Snake.swift @@ -0,0 +1,66 @@ +// +// Snake.swift +// snakegame +// +// Created by Nik Rodionov on 23.06.2020. +// Copyright © 2020 nrodionov. All rights reserved. +// + +import SpriteKit + +class Snake: SKShapeNode { + private var body = [SnakeBodyPart]() + private let moveSpeed: CGFloat = 125.0 + private var angle: CGFloat = 0.0 + + convenience init(position: CGPoint) { + self.init() + + let head = SnakeHead(position: position) + body.append(head) + + addChild(head) + } + + func addBodyPart() { + let newBodyPart = SnakeBodyPart(position: body[0].position) + body.append(newBodyPart) + + addChild(newBodyPart) + } + + func moveClockWise() { + angle += CGFloat.pi / 2 + } + + func moveCounterClockWise() { + angle -= CGFloat.pi / 2 + } + + func move() { + moveHead(body[0]) + + for i in 1..