作品說明

這次對於要做什麼 App 沒什麼想法。本來是想做日記相關,但實在太多人做了,想做點別的。看到要用 slider,想到可以寫個投擲東西類型的遊戲,slider 用來調力度或角度之類的,所以寫出這個。

不過因為最近真的很忙,很多東西就寫很陽春。連遊戲紀錄都是存在 memory,但也可以從樂觀的角度看,這紀錄讀寫超快。

作業要求

  • 使用到 SwiftUI 的 @State & Binding。
struct ContentView: View {
@State var page: String = "HomeView"

@State var pull = false
@State var degree: Double = 45
@State var records: [Record] = []


var body: some View {
if page == "HomeView"{
HomeView(page: $page)
}

else if page == "GamingView"{
GamingView(page: $page, records: $records)
}

else if page == "RankView"{
RankView(page: $page, records: $records)
}
}
}
  • 使用到亂數。
if enemy_all_dead{
enemyDeadCount += 1
if enemyDeadCount >= 210{
enemyDeadCount = 0
enemys = []
level += 1

let enemyCountInLevel = [1, 2, 2, 3, 3, 3, 3, 3, 3, 3]
var pastPosition: [Double] = []

if level > 10{
showEnd = true
pausing = true
level = 10
}

for _ in 0..<enemyCountInLevel[level-1]{
while true{
let position = 50 + Double.random(in: -100...200)
var flag = true

for j in 0..<pastPosition.count{
if abs(pastPosition[j] - position) < 70{
flag = false
}
}
if flag{
pastPosition.append(position)
enemys.append(Enemy(offsetX: position, offsetY: 130))
break
}
}
}
}
}
  • 利用 DisclosureGroup 控制 Form 裡有些欄位顯示 / 隱藏。
DisclosureGroup("生日(計算年齡)") {
DatePicker("生日", selection: $birthday, displayedComponents: .date)
.onChange(of: birthday) { newValue in
let diffs = Calendar.current.dateComponents([.year], from: birthday, to: Date())
age = diffs.year!
}
Stepper("你的年齡 \(age)", onIncrement: {
age += 1
}, onDecrement: {
age -= 1
})
}
  • 顯示 Alert。
Button {
quitAlert = true
} label: {
HStack{
Text("離開")
.foregroundColor(.white)
Image(systemName: "door.left.hand.open")
.foregroundColor(.white)
}
.frame(maxWidth: .infinity)
.padding(8)
.overlay(
RoundedRectangle(cornerRadius: 10)
.stroke(.red, lineWidth: 2)
)
}
.padding(EdgeInsets(top: 10, leading: 10, bottom: 0, trailing: 10))
.alert("確定要離開嗎", isPresented: $quitAlert, actions: {
Button("取消", role: .cancel) {
}
Button("離開", role: .destructive) {
page = "HomeView"
}
}, message: {
})
  • 利用 function sheet & fullScreenCover 切換頁面。
.sheet(isPresented: $showSetting) {
SettingView(showSetting: $showSetting, enemyColor: $enemyColor)
}

.fullScreenCover(isPresented: $showEnd) {
EndView(page: $page, records: $records, showEnd: $showEnd, shootCount: shootCount, curTimeString: curTimeString)
}
  • 使用 ColorPicker 選顏色。
ColorPicker("", selection: $enemyColor, supportsOpacity: false)
EnemyView(enemy: $enemy, pausing: $pausing, enemyColor: $enemyColor)

加分功能

  • 使用 onChange modifier
DatePicker("生日", selection: $birthday, displayedComponents: .date)
.onChange(of: birthday) { newValue in
let diffs = Calendar.current.dateComponents([.year], from: birthday, to: Date())
age = diffs.year!
}
Stepper("你的年齡 \(age)", onIncrement: {
age += 1
}, onDecrement: {
age -= 1
})

--

--