From 37a9af3fca31e91d578e88ef9ec582fc7d545631 Mon Sep 17 00:00:00 2001 From: Nick Lockwood Date: Tue, 14 Apr 2020 00:13:07 +0100 Subject: [PATCH] Part 17 --- Source/Engine/Font.swift | 12 ++ Source/Engine/Game.swift | 78 +++++++++++ Source/Engine/HUD.swift | 33 +++++ Source/Engine/Text.swift | 44 ++++++ Source/Engine/Texture.swift | 3 +- Source/Rampage.xcodeproj/project.pbxproj | 49 +++++-- .../xcshareddata/xcschemes/Engine.xcscheme | 6 +- .../xcshareddata/xcschemes/Rampage.xcscheme | 2 +- .../Assets.xcassets/font.imageset/font.png | Bin 1043 -> 1219 bytes .../titleBackground.imageset/Contents.json | 21 +++ .../titleBackground.png | Bin 0 -> 94226 bytes .../titleLogo.imageset/Contents.json | 21 +++ .../titleLogo.imageset/titleLogo.png | Bin 0 -> 2492 bytes Source/Rampage/Font.json | 9 ++ Source/Rampage/Info.plist | 2 + Source/Rampage/ViewController.swift | 81 ++++++----- Source/Renderer/Renderer.swift | 126 ++++++++++++------ 17 files changed, 390 insertions(+), 97 deletions(-) create mode 100644 Source/Engine/Font.swift create mode 100644 Source/Engine/Game.swift create mode 100644 Source/Engine/HUD.swift create mode 100644 Source/Engine/Text.swift create mode 100644 Source/Rampage/Assets.xcassets/titleBackground.imageset/Contents.json create mode 100644 Source/Rampage/Assets.xcassets/titleBackground.imageset/titleBackground.png create mode 100644 Source/Rampage/Assets.xcassets/titleLogo.imageset/Contents.json create mode 100644 Source/Rampage/Assets.xcassets/titleLogo.imageset/titleLogo.png create mode 100644 Source/Rampage/Font.json diff --git a/Source/Engine/Font.swift b/Source/Engine/Font.swift new file mode 100644 index 0000000..3055737 --- /dev/null +++ b/Source/Engine/Font.swift @@ -0,0 +1,12 @@ +// +// Font.swift +// Engine +// +// Created by Nick Lockwood on 21/04/2020. +// Copyright © 2020 Nick Lockwood. All rights reserved. +// + +public struct Font: Decodable { + public let texture: Texture + public let characters: [String] +} diff --git a/Source/Engine/Game.swift b/Source/Engine/Game.swift new file mode 100644 index 0000000..3a12b7b --- /dev/null +++ b/Source/Engine/Game.swift @@ -0,0 +1,78 @@ +// +// Game.swift +// Engine +// +// Created by Nick Lockwood on 07/10/2019. +// Copyright © 2019 Nick Lockwood. All rights reserved. +// + +public protocol GameDelegate: AnyObject { + func playSound(_ sound: Sound) + func clearSounds() +} + +public enum GameState { + case title + case starting + case playing +} + +public struct Game { + public weak var delegate: GameDelegate? + public let levels: [Tilemap] + public private(set) var world: World + public private(set) var state: GameState + public private(set) var transition: Effect? + public let font: Font + public var titleText = "TAP TO START" + + public init(levels: [Tilemap], font: Font) { + self.state = .title + self.levels = levels + self.world = World(map: levels[0]) + self.font = font + } +} + +public extension Game { + var hud: HUD { + return HUD(player: world.player, font: font) + } + + mutating func update(timeStep: Double, input: Input) { + guard let delegate = delegate else { + return + } + + // Update transition + if var effect = transition { + effect.time += timeStep + transition = effect + } + + // Update state + switch state { + case .title: + if input.isFiring { + transition = Effect(type: .fadeOut, color: .black, duration: 0.5) + state = .starting + } + case .starting: + if transition?.isCompleted == true { + transition = Effect(type: .fadeIn, color: .black, duration: 0.5) + state = .playing + } + case .playing: + if let action = world.update(timeStep: timeStep, input: input) { + switch action { + case .loadLevel(let index): + let index = index % levels.count + world.setLevel(levels[index]) + delegate.clearSounds() + case .playSounds(let sounds): + sounds.forEach(delegate.playSound) + } + } + } + } +} diff --git a/Source/Engine/HUD.swift b/Source/Engine/HUD.swift new file mode 100644 index 0000000..dcb4171 --- /dev/null +++ b/Source/Engine/HUD.swift @@ -0,0 +1,33 @@ +// +// HUD.swift +// Engine +// +// Created by Nick Lockwood on 19/04/2020. +// Copyright © 2020 Nick Lockwood. All rights reserved. +// + +public struct HUD { + public let healthString: String + public let healthTint: Color + public let ammoString: String + public let playerWeapon: Texture + public let weaponIcon: Texture + public let font: Font + + public init(player: Player, font: Font) { + let health = Int(max(0, player.health)) + switch health { + case ...10: + self.healthTint = .red + case 10 ... 30: + self.healthTint = .yellow + default: + self.healthTint = .green + } + self.healthString = String(health) + self.ammoString = String(Int(max(0, min(99, player.ammo)))) + self.playerWeapon = player.animation.texture + self.weaponIcon = player.weapon.attributes.hudIcon + self.font = font + } +} diff --git a/Source/Engine/Text.swift b/Source/Engine/Text.swift new file mode 100644 index 0000000..b1bb69b --- /dev/null +++ b/Source/Engine/Text.swift @@ -0,0 +1,44 @@ +// +// Text.swift +// Engine +// +// Created by Nick Lockwood on 21/04/2020. +// Copyright © 2020 Nick Lockwood. All rights reserved. +// + +public struct TextStyle { + public let color: Color + public let shadowColor: Color + public let shadowOffset: Vector + + public init(color: Color, shadowColor: Color) { + self.color = color + self.shadowColor = shadowColor + self.shadowOffset = Vector(x: 0, y: 1) + } +} + +public extension TextStyle { + static let green = TextStyle( + color: .green, + shadowColor: Color(r: 55, g: 148, b: 110) + ) + static let yellow = TextStyle( + color: .yellow, + shadowColor: Color(r: 223, g: 113, b: 38) + ) + static let red = TextStyle( + color: .red, + shadowColor: Color(r: 172, g: 50, b: 50) + ) + static let white = TextStyle( + color: .white, + shadowColor: Color(r: 34, g: 32, b: 52) + ) +} + +public struct Text { + public let font: Font + public let style: TextStyle + public let text: String +} diff --git a/Source/Engine/Texture.swift b/Source/Engine/Texture.swift index f94dbb8..a04114f 100644 --- a/Source/Engine/Texture.swift +++ b/Source/Engine/Texture.swift @@ -6,7 +6,7 @@ // Copyright © 2019 Nick Lockwood. All rights reserved. // -public enum Texture: String, CaseIterable { +public enum Texture: String, CaseIterable, Decodable { case wall, wall2 case crackWall, crackWall2 case slimeWall, slimeWall2 @@ -32,4 +32,5 @@ public enum Texture: String, CaseIterable { case healthIcon case pistolIcon, shotgunIcon case font + case titleBackground, titleLogo } diff --git a/Source/Rampage.xcodeproj/project.pbxproj b/Source/Rampage.xcodeproj/project.pbxproj index 1a78709..e8e901b 100644 --- a/Source/Rampage.xcodeproj/project.pbxproj +++ b/Source/Rampage.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ 013D492523ED607D00763FCA /* medkit.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 013D492423ED607D00763FCA /* medkit.mp3 */; }; 013D492723EE17C000763FCA /* Weapon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 013D492623EE17C000763FCA /* Weapon.swift */; }; 01467C3E22E6F54600B5607D /* Easing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01467C3D22E6F54600B5607D /* Easing.swift */; }; + 01557AD0245109E600FF8FF0 /* HUD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01557ACF245109E600FF8FF0 /* HUD.swift */; }; 0159A3F523DEF636001EEB81 /* Pickup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0159A3F423DEF636001EEB81 /* Pickup.swift */; }; 015A23C9230586E3004CBB78 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 015A23C8230586E3004CBB78 /* Switch.swift */; }; 016E41B3228E9A5B00ACF137 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016E41B2228E9A5B00ACF137 /* AppDelegate.swift */; }; @@ -63,7 +64,11 @@ 01D09B0B22A7F7570052745A /* Texture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01D09B0A22A7F7570052745A /* Texture.swift */; }; 01D0F5D922F80E1600682CA1 /* RampageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01D0F5D822F80E1600682CA1 /* RampageTests.swift */; }; 01D0F5F122FF095E00682CA1 /* Door.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01D0F5F022FF095E00682CA1 /* Door.swift */; }; + 01DD25AA244FA74900D00FE5 /* Font.json in Resources */ = {isa = PBXBuildFile; fileRef = 01DD25A9244FA74900D00FE5 /* Font.json */; }; + 01DD25AC244FA85E00D00FE5 /* Font.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DD25AB244FA85E00D00FE5 /* Font.swift */; }; + 01DD25AE244FA98500D00FE5 /* Text.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DD25AD244FA98500D00FE5 /* Text.swift */; }; 01E3963A2342758D00D02236 /* Pushwall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01E396392342758D00D02236 /* Pushwall.swift */; }; + 01EDA5DB2444DC2C00FC1795 /* Game.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EDA5DA2444DC2B00FC1795 /* Game.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -129,6 +134,7 @@ 013D492423ED607D00763FCA /* medkit.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = medkit.mp3; sourceTree = ""; }; 013D492623EE17C000763FCA /* Weapon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Weapon.swift; sourceTree = ""; }; 01467C3D22E6F54600B5607D /* Easing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Easing.swift; sourceTree = ""; }; + 01557ACF245109E600FF8FF0 /* HUD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HUD.swift; sourceTree = ""; }; 0159A3F423DEF636001EEB81 /* Pickup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pickup.swift; sourceTree = ""; }; 015A23C8230586E3004CBB78 /* Switch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Switch.swift; sourceTree = ""; }; 016E41AF228E9A5B00ACF137 /* Rampage.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Rampage.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -173,7 +179,11 @@ 01D0F5D822F80E1600682CA1 /* RampageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RampageTests.swift; sourceTree = ""; }; 01D0F5DA22F80E1600682CA1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 01D0F5F022FF095E00682CA1 /* Door.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Door.swift; sourceTree = ""; }; + 01DD25A9244FA74900D00FE5 /* Font.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Font.json; sourceTree = ""; }; + 01DD25AB244FA85E00D00FE5 /* Font.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Font.swift; sourceTree = ""; }; + 01DD25AD244FA98500D00FE5 /* Text.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Text.swift; sourceTree = ""; }; 01E396392342758D00D02236 /* Pushwall.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pushwall.swift; sourceTree = ""; }; + 01EDA5DA2444DC2B00FC1795 /* Game.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Game.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -260,6 +270,7 @@ 0199F57323E242D4003E3F08 /* SoundManager.swift */, 016E41B6228E9A5B00ACF137 /* Main.storyboard */, 01D09B0022A493A70052745A /* Levels.json */, + 01DD25A9244FA74900D00FE5 /* Font.json */, 016E41B9228E9A5E00ACF137 /* Assets.xcassets */, 0199F55423E1A517003E3F08 /* Sounds */, 016E41BB228E9A5E00ACF137 /* LaunchScreen.storyboard */, @@ -278,6 +289,9 @@ 01D0F5F022FF095E00682CA1 /* Door.swift */, 01467C3D22E6F54600B5607D /* Easing.swift */, 012DF10722E251CF00D52706 /* Effect.swift */, + 01DD25AB244FA85E00D00FE5 /* Font.swift */, + 01EDA5DA2444DC2B00FC1795 /* Game.swift */, + 01557ACF245109E600FF8FF0 /* HUD.swift */, 01D09B0222A4958E0052745A /* Input.swift */, 012A0C6122CC200D0068E8EF /* Monster.swift */, 0108A66E23F543740075E1AF /* Pathfinder.swift */, @@ -290,6 +304,7 @@ 015A23C8230586E3004CBB78 /* Switch.swift */, 0199F56F23E1AFEA003E3F08 /* Sounds.swift */, 01D09B0A22A7F7570052745A /* Texture.swift */, + 01DD25AD244FA98500D00FE5 /* Text.swift */, 012A0C4C22C96E150068E8EF /* Tile.swift */, 01D09AFE22A48E990052745A /* Tilemap.swift */, 012A0C4E22C96E1F0068E8EF /* Thing.swift */, @@ -436,21 +451,24 @@ attributes = { DefaultBuildSystemTypeForWorkspace = Original; LastSwiftUpdateCheck = 1010; - LastUpgradeCheck = 1010; + LastUpgradeCheck = 1130; ORGANIZATIONNAME = "Nick Lockwood"; TargetAttributes = { 0108A65623F4D84C0075E1AF = { CreatedOnToolsVersion = 11.3.1; + LastSwiftMigration = 1130; }; 016E41AE228E9A5B00ACF137 = { CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1130; }; 016E41C8228E9A8600ACF137 = { CreatedOnToolsVersion = 10.1; - LastSwiftMigration = 1010; + LastSwiftMigration = 1130; }; 01D0F5D522F80E1600682CA1 = { CreatedOnToolsVersion = 10.1; + LastSwiftMigration = 1130; TestTargetID = 016E41AE228E9A5B00ACF137; }; }; @@ -489,6 +507,7 @@ buildActionMask = 2147483647; files = ( 0128F26223EEE7AE00439050 /* shotgunFire.mp3 in Resources */, + 01DD25AA244FA74900D00FE5 /* Font.json in Resources */, 0199F56E23E1A517003E3F08 /* wallThud.mp3 in Resources */, 0199F56623E1A517003E3F08 /* playerWalk.mp3 in Resources */, 0199F56C23E1A517003E3F08 /* monsterGroan.mp3 in Resources */, @@ -556,17 +575,20 @@ 012DF10822E251CF00D52706 /* Effect.swift in Sources */, 012A0C6322CC200E0068E8EF /* Monster.swift in Sources */, 01D09B0B22A7F7570052745A /* Texture.swift in Sources */, + 01EDA5DB2444DC2C00FC1795 /* Game.swift in Sources */, 0159A3F523DEF636001EEB81 /* Pickup.swift in Sources */, 015A23C9230586E3004CBB78 /* Switch.swift in Sources */, 01D09AFF22A48E990052745A /* Tilemap.swift in Sources */, 01D09AFD22A4873B0052745A /* Rect.swift in Sources */, 0199F57023E1AFEA003E3F08 /* Sounds.swift in Sources */, 012A0C9E22D47C220068E8EF /* Actor.swift in Sources */, + 01DD25AE244FA98500D00FE5 /* Text.swift in Sources */, 012A0C4F22C96E1F0068E8EF /* Thing.swift in Sources */, 01D09AF922A484B10052745A /* Vector.swift in Sources */, 01467C3E22E6F54600B5607D /* Easing.swift in Sources */, 01D09B0722A6E09B0052745A /* Rotation.swift in Sources */, 01D09AFB22A485040052745A /* Player.swift in Sources */, + 01557AD0245109E600FF8FF0 /* HUD.swift in Sources */, 012A0C6222CC200E0068E8EF /* Billboard.swift in Sources */, 013D492723EE17C000763FCA /* Weapon.swift in Sources */, 01ADC64022B9846B00DC8AAD /* World.swift in Sources */, @@ -575,6 +597,7 @@ 01D0F5F122FF095E00682CA1 /* Door.swift in Sources */, 0108A66F23F543750075E1AF /* Pathfinder.swift in Sources */, 01D09B0322A4958E0052745A /* Input.swift in Sources */, + 01DD25AC244FA85E00D00FE5 /* Font.swift in Sources */, 012A0CA222D7AD0A0068E8EF /* Animation.swift in Sources */, 01D09B0522A5C9DB0052745A /* Ray.swift in Sources */, 01E3963A2342758D00D02236 /* Pushwall.swift in Sources */, @@ -646,7 +669,6 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Renderer/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -657,7 +679,7 @@ SKIP_INSTALL = YES; SWIFT_DISABLE_SAFETY_CHECKS = YES; SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -676,7 +698,6 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Renderer/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -686,7 +707,7 @@ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; SWIFT_DISABLE_SAFETY_CHECKS = YES; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -744,7 +765,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -799,7 +820,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -823,7 +844,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.charcoaldesign.Rampage; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -842,7 +863,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.charcoaldesign.Rampage; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; @@ -871,7 +892,7 @@ SKIP_INSTALL = YES; SWIFT_DISABLE_SAFETY_CHECKS = NO; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -902,7 +923,7 @@ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; SWIFT_DISABLE_SAFETY_CHECKS = YES; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -923,7 +944,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.charcoaldesign.RampageTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Rampage.app/Rampage"; }; @@ -943,7 +964,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.charcoaldesign.RampageTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Rampage.app/Rampage"; }; diff --git a/Source/Rampage.xcodeproj/xcshareddata/xcschemes/Engine.xcscheme b/Source/Rampage.xcodeproj/xcshareddata/xcschemes/Engine.xcscheme index b8e8ec2..8fdc9d0 100644 --- a/Source/Rampage.xcodeproj/xcshareddata/xcschemes/Engine.xcscheme +++ b/Source/Rampage.xcodeproj/xcshareddata/xcschemes/Engine.xcscheme @@ -1,6 +1,6 @@ - - - - p#P}2bNwrRZD|@ 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 Cnuoyv literal 0 HcmV?d00001 diff --git a/Source/Rampage/Assets.xcassets/titleLogo.imageset/Contents.json b/Source/Rampage/Assets.xcassets/titleLogo.imageset/Contents.json new file mode 100644 index 0000000..7f3981f --- /dev/null +++ b/Source/Rampage/Assets.xcassets/titleLogo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "titleLogo.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Source/Rampage/Assets.xcassets/titleLogo.imageset/titleLogo.png b/Source/Rampage/Assets.xcassets/titleLogo.imageset/titleLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..6015126d43d86d8dc5d96417bbb2eea1d83381ba GIT binary patch literal 2492 zcmV;t2}AaYP)Px;c1c7*RCt{2UCnD0SrD&T7mryGuSy7rhZvQ?0fXQkJq;*(S^ojOdy)tq0vkN- zJs$Uxlk6^Y%5fK#EX*<_hJX?n2E7Ks90M|Y$aLp*bydBp?$ z7*9s$g1`y5wFD(x1E4w6vU?H*k;jt}d_V6=006xD>#n)a`;VVs{O&6pY=28Wnu4&g zMP#`6<;UG%V^L$485fNs?gJq5YGoQ_)P^VsTm-joUWeOj0FT!)n;Xr>)`^6KihW4Q zYkgS^GHS(l^PWHmpu@OmE<*~>J`^UeK}PL}S_5Mf+kblnZr{94wte;2-CX-3GRpMf zh*3m_)L+_%{@W`sc=m-ItN-?jS`N1!pNu-uC=EP#_C-sEN;JcGG74@oi;OvV_62_X zbAf!u5!?6tkBxoRXBruGqA3LKfa7ny|M-b)wEXB&2pQ5pu3Z@!);R(Iz~^88Hg=Wa z1jFgPoX?^~QwW>^XTBbM9yrB>D12Z}qY~)A%snvlvC1fn zvNGyeQ;hpo294CfEm|aK8iB>&Z2azPUGr!W37SS=0N{hQCIlS;F!$VROz`@^2Tz|v ze`i?7TqI-;ZRw{UeC_Aa3E{pUV3bkzqwy z8Fj2F#(gV;Rs*+)9-Q_Cs7V7eHz{X0&VTfBAxy!z0oo#&^BzRay;#W07YD%!Y!NQu z&2bm{F!v&&3j=hEmwq;HNZJ=55P?IHmKeA4N;vHyRavSzSnZwua9q9RIoSTjt~vBx zP`pU0$Si#%6ee(0q`hds`zR5tB+{>AX=S`Q&X$h8To_^Ul4O*)(VL8>!^N)34fAPV zfC2<=i5m_=s;DYtNDM%0T}<2rKJs$wNi7Tj3iRJUnYSGlCH89$ojA?STO9;(77a&t_j=H6G{hguL`~#sm zeF{Zu{qQ*JTbsEc3%hfYQgPQo#5*d@YjraU6PTNzyD6HDo~^k>T4b9*TSk*r_rI~PJbb26vy zbFC7fpd#?v(Me7dcqT}~_nb0eMaKd`<4AqEXKt{iuo}6x>symR1XJtJ?Z>qgZ^Bqml0q#P5iCT{`_c`f-; zigYVC?&Rj>m~yXm0fM|Z6`GvsOha<}rPcI7P)RkK&$k0W+7|g10gxZREa?ZVyv_2VJ-Z2z;0cPfTH5*|wmn}K+Qob#5n5>D_YRvVmO?YzeKG_hz z0PcJ^%Ru?l_ze3yLvNtx^NaEL)~n{qig^^*#%f317rbDCXx?IuycArrQrdZjoTj7J zkIBnvS1!VLWjT>Mz+x9(JM(minH!%=wYgT&lRmQ+dw(etaL82GQp&0T^gpp<#{Ej^gD4yFBmYeMz>zw3Z_3j zBy2YEa{#$YPV#NFkbJ?lqmxsz9r101S^{a$$(LPA-Z}rhWE+7sQKt`@+5#jq`H}Q9 z31a309L3nLpFS4@MPN)c(@uI00B71<(AYkWN$#DIyeY7|X6-*Ol+wVGX4Ak*W?xbq z=OLBk)jaPcbM*M-H;KIlq%){$R4zl6gQ726nP{+=KM@w#=t=) z>PBg{3^_GbRK9{07qOE8lb5;xi5cEWy8lOp=T19kUNv70!bnK$%l(4j4+|z8x5exC zJ@>X@G<1|?z+dJ?dSxOpu?b@r*Nt<%@MI8A@1`bljo|S z$A>DuLQ@r*M&1NfW+5_~Z@Acnp+jhmc20^$gmF(z9^|f$%Mh^e;W55%lw=Tm`6%bh z!Tgn?f`#UycJ`22)S9yb^C@aScf_oH&kK10j2c)|U#dh#JG*37v@i0!R>ZD-6Sx;d z%4Qj7H9~ZzO5C#sZk$t5yY&00UXyX(3Sr@q51QwNt&tRshkhQ@LfJ5nleuk zs>!E?8iqa>7=@~;TG(MpqqT=&L%UxsTC`} armv7 + UIRequiresFullScreen + UIStatusBarHidden UISupportedInterfaceOrientations diff --git a/Source/Rampage/ViewController.swift b/Source/Rampage/ViewController.swift index 6063751..1c88c6a 100644 --- a/Source/Rampage/ViewController.swift +++ b/Source/Rampage/ViewController.swift @@ -21,6 +21,12 @@ public func loadLevels() -> [Tilemap] { return levels.enumerated().map { Tilemap($0.element, index: $0.offset) } } +public func loadFont() -> Font { + let jsonURL = Bundle.main.url(forResource: "Font", withExtension: "json")! + let jsonData = try! Data(contentsOf: jsonURL) + return try! JSONDecoder().decode(Font.self, from: jsonData) +} + public func loadTextures() -> Textures { return Textures(loader: { name in Bitmap(image: UIImage(named: name)!)! @@ -46,11 +52,10 @@ class ViewController: UIViewController { private let panGesture = UIPanGestureRecognizer() private let tapGesture = UITapGestureRecognizer() private let textures = loadTextures() - private let levels = loadLevels() - private lazy var world = World(map: levels[0]) + private var game = Game(levels: loadLevels(), font: loadFont()) private var lastFrameTime = CACurrentMediaTime() private var lastFiredTime = 0.0 - + override func viewDidLoad() { super.viewDidLoad() @@ -70,6 +75,16 @@ class ViewController: UIViewController { view.addGestureRecognizer(tapGesture) tapGesture.addTarget(self, action: #selector(fire)) tapGesture.delegate = self + + game.delegate = self + } + + override var prefersStatusBarHidden: Bool { + return true + } + + override var prefersHomeIndicatorAutoHidden: Bool { + return true } override var prefersStatusBarHidden: Bool { @@ -95,41 +110,20 @@ class ViewController: UIViewController { @objc func update(_ displayLink: CADisplayLink) { let timeStep = min(maximumTimeStep, displayLink.timestamp - lastFrameTime) let inputVector = self.inputVector - let rotation = inputVector.x * world.player.turningSpeed * worldTimeStep - let input = Input( + let rotation = inputVector.x * game.world.player.turningSpeed * worldTimeStep + var input = Input( speed: -inputVector.y, rotation: Rotation(sine: sin(rotation), cosine: cos(rotation)), isFiring: lastFiredTime > lastFrameTime ) + lastFrameTime = displayLink.timestamp + lastFiredTime = min(lastFiredTime, lastFrameTime) + let worldSteps = (timeStep / worldTimeStep).rounded(.up) for _ in 0 ..< Int(worldSteps) { - if let action = world.update(timeStep: timeStep / worldSteps, input: input) { - switch action { - case .loadLevel(let index): - SoundManager.shared.clearAll() - let index = index % levels.count - world.setLevel(levels[index]) - case .playSounds(let sounds): - for sound in sounds { - DispatchQueue.main.asyncAfter(deadline: .now() + sound.delay) { - guard let url = sound.name?.url else { - if let channel = sound.channel { - SoundManager.shared.clearChannel(channel) - } - return - } - try? SoundManager.shared.play( - url, - channel: sound.channel, - volume: sound.volume, - pan: sound.pan - ) - } - } - } - } + game.update(timeStep: timeStep / worldSteps, input: input) + input.isFiring = false } - lastFrameTime = displayLink.timestamp let width = Int(imageView.bounds.width), height = Int(imageView.bounds.height) var renderer = Renderer(width: width, height: height, textures: textures) @@ -138,7 +132,7 @@ class ViewController: UIViewController { min: Vector(x: Double(insets.left), y: Double(insets.top)), max: renderer.bitmap.size - Vector(x: Double(insets.left), y: Double(insets.bottom)) ) - renderer.draw(world) + renderer.draw(game) imageView.image = UIImage(bitmap: renderer.bitmap) } @@ -168,3 +162,26 @@ extension ViewController: UIGestureRecognizerDelegate { return true } } + +extension ViewController: GameDelegate { + func playSound(_ sound: Sound) { + DispatchQueue.main.asyncAfter(deadline: .now() + sound.delay) { + guard let url = sound.name?.url else { + if let channel = sound.channel { + SoundManager.shared.clearChannel(channel) + } + return + } + try? SoundManager.shared.play( + url, + channel: sound.channel, + volume: sound.volume, + pan: sound.pan + ) + } + } + + func clearSounds() { + SoundManager.shared.clearAll() + } +} diff --git a/Source/Renderer/Renderer.swift b/Source/Renderer/Renderer.swift index 12d1fb0..bf53069 100644 --- a/Source/Renderer/Renderer.swift +++ b/Source/Renderer/Renderer.swift @@ -23,6 +23,58 @@ public struct Renderer { } public extension Renderer { + mutating func draw(_ game: Game) { + switch game.state { + case .title, .starting: + // Background + let background = textures[.titleBackground] + let backgroundScale = bitmap.size.y / background.size.y + let backgroundSize = background.size * backgroundScale + let backgroundPosition = (bitmap.size - backgroundSize) / 2 + bitmap.drawImage(background, at: backgroundPosition, size: backgroundSize) + + // Logo + let logo = textures[.titleLogo] + let logoScale = bitmap.size.y / logo.size.y / 2 + let logoSize = logo.size * logoScale + let logoPosition = Vector(x: (bitmap.size.x - logoSize.x) / 2, y: bitmap.size.y * 0.15) + bitmap.drawImage(logo, at: logoPosition, size: logoSize) + + // Text + let textScale = bitmap.size.y / 64 + let font = textures[game.font.texture] + let charSize = Vector(x: Double(font.width / game.font.characters.count), y: font.size.y) + let textWidth = charSize.x * Double(game.titleText.count) * textScale + var offset = Vector(x: (bitmap.size.x - textWidth) / 2, y: bitmap.size.y * 0.75) + for char in game.titleText { + let index = game.font.characters.firstIndex(of: String(char)) ?? 0 + let step = Int(charSize.x) + let xRange = index * step ..< (index + 1) * step + bitmap.drawImage( + font, + xRange: xRange, + at: offset, + size: charSize * textScale, + tint: .yellow + ) + offset.x += charSize.x * textScale + } + case .playing: + draw(game.world) + draw(game.hud) + + // Effects + for effect in game.world.effects { + draw(effect) + } + } + + // Transition + if let effect = game.transition { + draw(effect) + } + } + mutating func draw(_ world: World) { let focalLength = 1.0 let viewWidth = Double(bitmap.width) / Double(bitmap.height) @@ -124,17 +176,14 @@ public extension Renderer { columnPosition += step } + } + mutating func draw(_ hud: HUD) { // Player weapon - let weaponTexture = textures[world.player.animation.texture] - let aspectRatio = Double(weaponTexture.width) / Double(weaponTexture.height) - let screenHeight = Double(bitmap.height) - let weaponWidth = screenHeight * aspectRatio - bitmap.drawImage( - weaponTexture, - at: Vector(x: Double(bitmap.width) / 2 - weaponWidth / 2, y: 0), - size: Vector(x: weaponWidth, y: screenHeight) - ) + let weaponTexture = textures[hud.playerWeapon] + let weaponScale = bitmap.size.y / weaponTexture.size.y + let weaponSize = weaponTexture.size * weaponScale + bitmap.drawImage(weaponTexture, at: (bitmap.size - weaponSize) / 2, size: weaponSize) // Crosshair let crosshair = textures[.crosshair] @@ -149,20 +198,11 @@ public extension Renderer { offset.x += healthIcon.size.x * hudScale // Health - let font = textures[.font] - let charSize = Vector(x: font.size.x / 10, y: font.size.y) - let health = Int(max(0, world.player.health)) - let healthTint: Color - switch health { - case ...10: - healthTint = .red - case 10 ... 30: - healthTint = .yellow - default: - healthTint = .green - } - for char in String(health) { - let index = Int(char.asciiValue!) - 48 + let font = textures[hud.font.texture] + let charSize = Vector(x: Double(font.width / hud.font.characters.count), y: font.size.y) + let healthTint = hud.healthTint + for char in hud.healthString { + let index = hud.font.characters.firstIndex(of: String(char)) ?? 0 let step = Int(charSize.x) let xRange = index * step ..< (index + 1) * step bitmap.drawImage( @@ -177,9 +217,8 @@ public extension Renderer { // Ammunition offset.x = safeArea.max.x - let ammo = Int(max(0, min(99, world.player.ammo))) - for char in String(ammo).reversed() { - let index = Int(char.asciiValue!) - 48 + for char in hud.ammoString.reversed() { + let index = hud.font.characters.firstIndex(of: String(char)) ?? 0 let step = Int(charSize.x) let xRange = index * step ..< (index + 1) * step offset.x -= charSize.x * hudScale @@ -187,27 +226,26 @@ public extension Renderer { } // Weapon icon - let weaponIcon = textures[world.player.weapon.attributes.hudIcon] + let weaponIcon = textures[hud.weaponIcon] offset.x -= weaponIcon.size.x * hudScale bitmap.drawImage(weaponIcon, at: offset, size: weaponIcon.size * hudScale) + } - // Effects - for effect in world.effects { - switch effect.type { - case .fadeIn: - bitmap.tint(with: effect.color, opacity: 1 - effect.progress) - case .fadeOut: - bitmap.tint(with: effect.color, opacity: effect.progress) - case .fizzleOut: - let threshold = Int(effect.progress * Double(fizzle.count)) - for x in 0 ..< bitmap.width { - for y in 0 ..< bitmap.height { - let granularity = 4 - let index = y / granularity * bitmap.width + x / granularity - let fizzledIndex = fizzle[index % fizzle.count] - if fizzledIndex <= threshold { - bitmap[x, y] = effect.color - } + mutating func draw(_ effect: Effect) { + switch effect.type { + case .fadeIn: + bitmap.tint(with: effect.color, opacity: 1 - effect.progress) + case .fadeOut: + bitmap.tint(with: effect.color, opacity: effect.progress) + case .fizzleOut: + let threshold = Int(effect.progress * Double(fizzle.count)) + for x in 0 ..< bitmap.width { + for y in 0 ..< bitmap.height { + let granularity = 4 + let index = y / granularity * bitmap.width + x / granularity + let fizzledIndex = fizzle[index % fizzle.count] + if fizzledIndex <= threshold { + bitmap[x, y] = effect.color } } }