Skip to content

Commit 2d22baf

Browse files
committed
Add remaining pegs, num of pegs in level designer and others
1 parent a0ba35c commit 2d22baf

File tree

14 files changed

+232
-36
lines changed

14 files changed

+232
-36
lines changed

‎ps4/peggleclone.xcodeproj/project.pbxproj‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
688064EB27B8FFD200EC1501 /* PeggleHomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 688064EA27B8FFD100EC1501 /* PeggleHomeView.swift */; };
4141
6882BA8127CA520C009F3DAD /* GameState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6882BA8027CA520C009F3DAD /* GameState.swift */; };
4242
6882BA8327CA6913009F3DAD /* HomeButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6882BA8227CA6912009F3DAD /* HomeButtonView.swift */; };
43+
6882BA8527CA85C0009F3DAD /* PointsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6882BA8427CA85C0009F3DAD /* PointsView.swift */; };
44+
6882BA8727CA94D4009F3DAD /* RemainingPegsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6882BA8627CA94D4009F3DAD /* RemainingPegsView.swift */; };
45+
6882BA8927CA9801009F3DAD /* NumberOfPegsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6882BA8827CA9801009F3DAD /* NumberOfPegsView.swift */; };
4346
68861F0627C92DB500D2AEF7 /* SLPhysicsTriangle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68861F0527C92DB500D2AEF7 /* SLPhysicsTriangle.swift */; };
4447
689A4A0027A2CD0D00A2E4E6 /* Level.swift in Sources */ = {isa = PBXBuildFile; fileRef = 689A49FF27A2CD0D00A2E4E6 /* Level.swift */; };
4548
689A4A0227A2CD7C00A2E4E6 /* AllLevelsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 689A4A0127A2CD7C00A2E4E6 /* AllLevelsManager.swift */; };
@@ -95,6 +98,9 @@
9598
688064EA27B8FFD100EC1501 /* PeggleHomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeggleHomeView.swift; sourceTree = "<group>"; };
9699
6882BA8027CA520C009F3DAD /* GameState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameState.swift; sourceTree = "<group>"; };
97100
6882BA8227CA6912009F3DAD /* HomeButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeButtonView.swift; sourceTree = "<group>"; };
101+
6882BA8427CA85C0009F3DAD /* PointsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PointsView.swift; sourceTree = "<group>"; };
102+
6882BA8627CA94D4009F3DAD /* RemainingPegsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemainingPegsView.swift; sourceTree = "<group>"; };
103+
6882BA8827CA9801009F3DAD /* NumberOfPegsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumberOfPegsView.swift; sourceTree = "<group>"; };
98104
68861F0527C92DB500D2AEF7 /* SLPhysicsTriangle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SLPhysicsTriangle.swift; sourceTree = "<group>"; };
99105
689A49FF27A2CD0D00A2E4E6 /* Level.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Level.swift; sourceTree = "<group>"; };
100106
689A4A0127A2CD7C00A2E4E6 /* AllLevelsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllLevelsManager.swift; sourceTree = "<group>"; };
@@ -190,6 +196,7 @@
190196
68143566279EE7D700A16058 /* PegsRowView.swift */,
191197
689A4A0327A2DBD700A2E4E6 /* LevelSelectorView.swift */,
192198
689A4A0F27A6AE2100A2E4E6 /* LevelDesignerView.swift */,
199+
6882BA8827CA9801009F3DAD /* NumberOfPegsView.swift */,
193200
);
194201
path = LevelDesigner;
195202
sourceTree = "<group>";
@@ -214,6 +221,8 @@
214221
6831831827B53F6500732E00 /* CannonView.swift */,
215222
688064E827B8E01400EC1501 /* LevelLoaderView.swift */,
216223
6834AD1927C6787100F5A4E3 /* BucketView.swift */,
224+
6882BA8427CA85C0009F3DAD /* PointsView.swift */,
225+
6882BA8627CA94D4009F3DAD /* RemainingPegsView.swift */,
217226
);
218227
path = StartGame;
219228
sourceTree = "<group>";
@@ -422,14 +431,17 @@
422431
6834AD2927C76DB300F5A4E3 /* SpookyPegPersistance.swift in Sources */,
423432
68B6B8D727C558FE004CE9E2 /* PointPersistance.swift in Sources */,
424433
6834AD2527C762BD00F5A4E3 /* SpookyPeg.swift in Sources */,
434+
6882BA8727CA94D4009F3DAD /* RemainingPegsView.swift in Sources */,
425435
68143574279FEE2100A16058 /* Peg.swift in Sources */,
426436
6834AD1A27C6787100F5A4E3 /* BucketView.swift in Sources */,
427437
68B6B8D927C5E30A004CE9E2 /* GameLogicDelegate.swift in Sources */,
428438
689A4A0027A2CD0D00A2E4E6 /* Level.swift in Sources */,
429439
68143563279EE71700A16058 /* BackgroundView.swift in Sources */,
440+
6882BA8927CA9801009F3DAD /* NumberOfPegsView.swift in Sources */,
430441
68686A9327B2E0D800B97394 /* GameCanvasView.swift in Sources */,
431442
68B6B8D327C54117004CE9E2 /* PegPersistance.swift in Sources */,
432443
68686AA827B3A1E700B97394 /* SLPhysicsCircle.swift in Sources */,
444+
6882BA8527CA85C0009F3DAD /* PointsView.swift in Sources */,
433445
689A4A0627A47F0D00A2E4E6 /* StorageManager.swift in Sources */,
434446
6834AD2727C762CA00F5A4E3 /* KaboomPeg.swift in Sources */,
435447
);

‎ps4/peggleclone/Models/Level.swift‎

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,16 @@ struct Level: Identifiable {
1111
var id: UUID
1212
var name: String
1313
var peggleObjects: [PeggleObject]
14+
var numOfOrangePegs = 0
15+
var numOfBluePegs = 0
16+
var numOfSpecialPegs = 0
17+
var numOfBlocks = 0
1418

1519
init(name: String, peggleObjects: [PeggleObject]) {
1620
self.id = UUID()
1721
self.name = name
1822
self.peggleObjects = peggleObjects
23+
countDifferentPegs()
1924
}
2025

2126
init() {
@@ -28,6 +33,18 @@ struct Level: Identifiable {
2833
self.id = id
2934
self.name = name
3035
self.peggleObjects = peggleObjects
36+
countDifferentPegs()
37+
}
38+
39+
mutating func countDifferentPegs() {
40+
numOfOrangePegs = 0
41+
numOfBluePegs = 0
42+
numOfBlocks = 0
43+
numOfSpecialPegs = 0
44+
45+
for peggleObject in peggleObjects {
46+
handleAdd(peggleObject: peggleObject)
47+
}
3148
}
3249

3350
mutating func save(name: String, peggleObjects: [PeggleObject]) {
@@ -36,6 +53,7 @@ struct Level: Identifiable {
3653
if !trimmedName.isEmpty {
3754
self.name = trimmedName
3855
}
56+
countDifferentPegs()
3957
}
4058

4159
mutating func move(peggleObject: PeggleObject, newLocation: Point) {
@@ -47,15 +65,49 @@ struct Level: Identifiable {
4765
mutating func delete(peggleObject: PeggleObject) {
4866
if let index = peggleObjects.firstIndex(of: peggleObject) {
4967
peggleObjects.remove(at: index)
68+
handleDelete(peggleObject: peggleObject)
69+
}
70+
}
71+
72+
mutating func handleDelete(peggleObject: PeggleObject) {
73+
if peggleObject is TriangleBlock {
74+
numOfBlocks -= 1
75+
} else if let peg = peggleObject as? Peg {
76+
if peg is SpookyPeg || peg is KaboomPeg {
77+
numOfSpecialPegs -= 1
78+
} else if peg.color == PegState.orangePeg || peg.color == PegState.orangeGlow {
79+
numOfOrangePegs -= 1
80+
} else if peg.color == PegState.bluePeg || peg.color == PegState.blueGlow {
81+
numOfBluePegs -= 1
82+
}
5083
}
5184
}
5285

5386
mutating func removeAllPeggleObjects() {
5487
peggleObjects.removeAll()
88+
numOfBlocks = 0
89+
numOfBluePegs = 0
90+
numOfSpecialPegs = 0
91+
numOfOrangePegs = 0
5592
}
5693

5794
mutating func addPeggleObject(peggleObject: PeggleObject) {
5895
peggleObjects.append(peggleObject)
96+
handleAdd(peggleObject: peggleObject)
97+
}
98+
99+
mutating func handleAdd(peggleObject: PeggleObject) {
100+
if peggleObject is TriangleBlock {
101+
numOfBlocks += 1
102+
} else if let peg = peggleObject as? Peg {
103+
if peg is SpookyPeg || peg is KaboomPeg {
104+
numOfSpecialPegs += 1
105+
} else if peg.color == PegState.orangePeg {
106+
numOfOrangePegs += 1
107+
} else if peg.color == PegState.bluePeg {
108+
numOfBluePegs += 1
109+
}
110+
}
59111
}
60112

61113
func spookCannonBall(cannonBall: Peg) {

‎ps4/peggleclone/Models/Peg.swift‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,27 @@ class Peg: PeggleObject {
1515
var radius: Double
1616
var shadow: Color = .white
1717
var shadowRadius: Double = 0.0
18+
var points: Int
1819

1920
init(color: PegState, center: Point, radius: Double = 25) {
2021
self.color = color
2122
self.radius = radius
23+
if self.color == .orangePeg {
24+
self.points = 100
25+
} else {
26+
self.points = 10
27+
}
2228
super.init(center: center)
2329
}
2430

2531
init(id: UUID, center: Point, color: PegState, radius: Double = 25) {
2632
self.color = color
2733
self.radius = radius
34+
if self.color == .orangePeg {
35+
self.points = 100
36+
} else {
37+
self.points = 10
38+
}
2839
super.init(id: id, center: center)
2940
}
3041

‎ps4/peggleclone/SLGameEngine/SLGameEngine.swift‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ class SLGameEngine {
207207
if cannonBallCount == 0 {
208208
gameLogicDelegate.didRemove(peg: peg)
209209
mappings.removeValue(forKey: peg)
210+
if peg.color != cannonBall.color {
211+
gameLogicDelegate.didAddPoints(peg.points)
212+
}
210213
value.ignore()
211214
powerUpHandler.removePowerPeg(powerPeg: peg)
212215
if peg.color == .orangeGlow {
@@ -307,6 +310,7 @@ class SLGameEngine {
307310

308311
func gameEnd() {
309312
physicsEngine.removeBodies()
313+
gameLogicDelegate?.resetPoints()
310314
mappings = [:]
311315
cannonBall = nil
312316
similarPositionCounter = 0

‎ps4/peggleclone/ViewModels/GameLogicDelegate.swift‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ protocol GameLogicDelegate: AnyObject {
1515
func gameLose()
1616
func spookCannonBall(cannonBall: Peg)
1717
func renderExplosion(kaboomPeg: KaboomPeg)
18+
func didAddPoints(_ points: Int)
19+
func resetPoints()
1820
}

‎ps4/peggleclone/ViewModels/LevelManager+GameLogicDelegate.swift‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,12 @@ extension LevelManager: GameLogicDelegate {
4343
func renderExplosion(kaboomPeg: KaboomPeg) {
4444
level.renderExplosion(kaboomPeg: kaboomPeg)
4545
}
46+
47+
func didAddPoints(_ points: Int) {
48+
self.points += points
49+
}
50+
51+
func resetPoints() {
52+
self.points = 0
53+
}
4654
}

‎ps4/peggleclone/ViewModels/LevelManager.swift‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import Foundation
99
import SwiftUI
1010

1111
class LevelManager: ObservableObject, Identifiable {
12-
1312
@Published var level: Level
1413
@Published var isGameWon: Bool
1514
@Published var isGameLost: Bool
1615
@Published var bucket: Bucket
16+
@Published var points: Int = 0
1717
var selectedPeg: PegState?
1818
var isDeleteSelected = false
1919
var isTriangleBlockSelected = false

‎ps4/peggleclone/Views/LevelDesigner/LevelDesignerView.swift‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ struct LevelDesignerView: View {
3535
.foregroundColor(.black)
3636
.position(x: 50, y: 35)
3737

38+
NumberOfPegsView()
39+
3840
if load {
3941
GeometryReader { geometry in
4042
LevelSelectorView(allLevelsManager: allLevelsManager,

‎ps4/peggleclone/Views/LevelDesigner/LevelSelectorView.swift‎

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,33 +14,43 @@ struct LevelSelectorView: View {
1414
@ObservedObject var levelManager: LevelManager
1515
@Binding var load: Bool
1616
@Binding var levelName: String
17+
@State private var contentSize: CGSize = .zero
1718

1819
var body: some View {
1920
VStack(alignment: .leading) {
2021

2122
Text("Select a level to load").font(.headline)
23+
ScrollView {
24+
VStack {
25+
ForEach(allLevelsManager.levels) { level in
26+
Button() {
27+
levelManager.changeLevel(level: level)
28+
levelName = levelManager.level.name
29+
load.toggle()
30+
} label: {
31+
if levelManager.level == level {
32+
Text(level.name).foregroundColor(.orange).padding()
33+
} else {
34+
Text(level.name).foregroundColor(.red).padding()
35+
}
36+
}
37+
}
2238

23-
ForEach(allLevelsManager.levels) { level in
24-
Button() {
25-
levelManager.changeLevel(level: level)
26-
levelName = levelManager.level.name
27-
load.toggle()
28-
} label: {
29-
if levelManager.level == level {
30-
Text(level.name).foregroundColor(.orange).padding()
31-
} else {
32-
Text(level.name).foregroundColor(.red).padding()
39+
Button() {
40+
levelManager.changeLevel(level: allLevelsManager.createNewLevel())
41+
levelName = levelManager.level.name
42+
load.toggle()
43+
} label: {
44+
Text("+ New Level")
45+
}
46+
}.overlay(
47+
GeometryReader { geo in
48+
Color.clear.onAppear {
49+
contentSize = geo.size
50+
}
3351
}
34-
}
35-
}
36-
37-
Button() {
38-
levelManager.changeLevel(level: allLevelsManager.createNewLevel())
39-
levelName = levelManager.level.name
40-
load.toggle()
41-
} label: {
42-
Text("+ New Level")
43-
}
52+
)
53+
}.frame(maxHeight: contentSize.height)
4454

4555
}.padding()
4656
.background(.white)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//
2+
// NumberOfPegsView.swift
3+
// peggleclone
4+
//
5+
// Created by Stuart Long on 27/2/22.
6+
//
7+
8+
import SwiftUI
9+
10+
struct NumberOfPegsView: View {
11+
@EnvironmentObject var levelManager: LevelManager
12+
13+
var body: some View {
14+
VStack {
15+
Text("Number of orange pegs: \(levelManager.level.numOfOrangePegs)")
16+
Text("Number of blue pegs: \(levelManager.level.numOfBluePegs)")
17+
Text("Number of special pegs: \(levelManager.level.numOfSpecialPegs)")
18+
Text("Number of blocks: \(levelManager.level.numOfBlocks)")
19+
}
20+
.position(x: levelManager.canvasDimension.width - 150, y: 57)
21+
}
22+
}
23+
24+
struct NumberOfPegsView_Previews: PreviewProvider {
25+
static var previews: some View {
26+
NumberOfPegsView()
27+
}
28+
}

0 commit comments

Comments
 (0)