ConstValue.swift
//
// ConstValue.swift
// OneStroke
//
// Created by akira ohmachi on 2022/05/31.
//
import SwiftUI
class ConstValue: ObservableObject {
static let colorBg: Color = Color.init(red:1, green:1, blue:1)
static let colorStart: Color = Color.init(red:0.274, green:0.27, blue:0.972)
static let colorSetting: Color = Color.init(red:0.294, green:0.45, blue:0.972)
}
ContentView.swift
//
// ContentView.swift
// OneStroke
//
// Created by akira ohmachi on 2022/06/04.
//
import SwiftUI
import GoogleMobileAds
import UIKit
import AVFoundation
struct ContentView: View {
@EnvironmentObject var pub: PublicManager
@State private var destroyFlag: Bool = false
@State private var webViewQueryString: String = "?dummy"
@State private var retryCount: Int = 10
@State private var retryStr: String = NSLocalizedString("retry", comment: "retry") + ":10"
private var dateFormatter: DateFormatter = DateFormatter()
private let soundStarts: Array<AVAudioPlayer> = [
try! AVAudioPlayer(data: NSDataAsset(name: "start")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "start")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "start")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "start")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "start")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "start")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "start")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "start")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "start")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "start")!.data),
]
@State private var soundStartPtr: Int = 0
private let soundRetrys: Array<AVAudioPlayer> = [
try! AVAudioPlayer(data: NSDataAsset(name: "retry")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "retry")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "retry")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "retry")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "retry")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "retry")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "retry")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "retry")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "retry")!.data),
try! AVAudioPlayer(data: NSDataAsset(name: "retry")!.data),
]
@State private var soundRetryPtr: Int = 0
private func setWebViewQueryString(mode: String) {
var str: String = "?locale=en"
str += "&p=" + String(self.pub.peaces)
str += "&s=" + (self.pub.sound ? "1" : "0")
if mode == "start" {
str += "&r=0&a=0" //default
} else if mode == "retry" {
str += "&r=1"
} else if mode == "answer" {
str += "&a=1"
}
str += "&dateTime=" + dateFormatter.string(from: Date())
self.webViewQueryString = str
}
private func retryCountReduce() {
self.retryCount -= 1
if self.retryCount <= 0 {
self.retryCount = 0
self.retryStr = NSLocalizedString("retry", comment: "retry")
} else {
self.retryStr = NSLocalizedString("retry", comment: "retry") + ":" + String(self.retryCount)
}
}
private func retryCountInitial() {
self.retryCount = 10
self.retryStr = NSLocalizedString("retry", comment: "retry") + ":" + String(self.retryCount)
}
private func soundPlay(soundId: String) {
if self.pub.sound {
if soundId == "start" {
self.soundStarts[self.soundStartPtr].play()
self.soundStartPtr += 1
if self.soundStartPtr >= self.soundStarts.count {
self.soundStartPtr = 0
}
} else if soundId == "retry" {
self.soundRetrys[self.soundRetryPtr].play()
self.soundRetryPtr += 1
if self.soundRetryPtr >= self.soundRetrys.count {
self.soundRetryPtr = 0
}
}
}
}
var body: some View {
NavigationView {
GeometryReader { bodyView in
VStack(spacing: 0) {
Rectangle().fill(Color.white).frame(width: bodyView.size.width,height: 1)
HStack(spacing: 0) {
Button(action:{
self.setWebViewQueryString(mode: "start")
self.retryCountInitial()
self.soundPlay(soundId: "start")
}){
Text("start")
.frame(width:bodyView.size.width * 0.3, height: 50, alignment: .center)
.background(ConstValue.colorStart)
.foregroundColor(Color.white)
}
Rectangle().fill(Color.white).frame(width: 1,height: 50)
Button(action:{
self.setWebViewQueryString(mode: "retry")
self.retryCountReduce()
self.soundPlay(soundId: "retry")
}){
Text(verbatim: self.retryStr)
.frame(width:bodyView.size.width * 0.3, height: 50, alignment: .center)
.background(ConstValue.colorStart)
.foregroundColor(Color.white)
}
Rectangle().fill(Color.white).frame(width: 1,height: 50)
if self.retryCount == 0 {
Button(action:{
self.setWebViewQueryString(mode: "answer")
}){
Text("answer")
.frame(width:bodyView.size.width * 0.2, height: 50, alignment: .center)
.background(ConstValue.colorStart)
.foregroundColor(Color.white)
}
} else {
Text("")
.frame(width:bodyView.size.width * 0.2, height: 50, alignment: .center)
.background(ConstValue.colorStart)
.foregroundColor(Color.white)
}
Rectangle().fill(Color.white).frame(width: 1,height: 50)
VStack(spacing: 0) {
NavigationLink(destination: SettingView(),isActive: self.$pub.isSetting) {
Button(action:{
self.pub.tmpPeaces = self.pub.peaces
self.pub.tmpSound = self.pub.sound
self.pub.isSetting = true
}){
Text("setting")
.frame(width:bodyView.size.width * 0.2, height: 50, alignment: .center)
.background(ConstValue.colorSetting)
.foregroundColor(Color.white)
}
}
}
}
.frame(width:bodyView.size.width, height:50)
Rectangle().fill(Color.white).frame(width: bodyView.size.width,height: 1)
ZStack(alignment: .bottom) {
VStack {
Spacer()
VStack {
WebView(queryString: self.webViewQueryString)
}.frame(width:bodyView.size.width, height:bodyView.size.width)
Spacer()
Spacer()
}
HStack(spacing: 0) {
Spacer(minLength: 0)
PublicManager.AdView().frame(maxWidth: bodyView.size.width, maxHeight: 50)
Spacer(minLength: 0)
}.background(Color(red:0.2,green:0.2,blue:0.2))
}
}
.background(ConstValue.colorBg)
//.navigationBarTitle("")
.navigationBarHidden(true)
}
}
.navigationViewStyle(StackNavigationViewStyle())
.onAppear { //アプリ実行時
self.dateFormatter.dateFormat = "yyyyMMddHHmmss"
self.setWebViewQueryString(mode: "start")
self.retryCountInitial()
}
.onDisappear { //アプリ終了時
self.destroyFlag = true
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environmentObject(PublicManager())
}
}