diff --git a/Ballz1/Assets.xcassets/win_lose_text_background.imageset/Contents.json b/Ballz1/Assets.xcassets/win_lose_text_background.imageset/Contents.json new file mode 100644 index 0000000..8fa58ec --- /dev/null +++ b/Ballz1/Assets.xcassets/win_lose_text_background.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "win_lose_text_background.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Ballz1/Assets.xcassets/win_lose_text_background.imageset/win_lose_text_background.pdf b/Ballz1/Assets.xcassets/win_lose_text_background.imageset/win_lose_text_background.pdf new file mode 100644 index 0000000..e514c2a Binary files /dev/null and b/Ballz1/Assets.xcassets/win_lose_text_background.imageset/win_lose_text_background.pdf differ diff --git a/Ballz1/Controllers/LevelsGameController.swift b/Ballz1/Controllers/LevelsGameController.swift index 43a4eb5..a2e76f4 100644 --- a/Ballz1/Controllers/LevelsGameController.swift +++ b/Ballz1/Controllers/LevelsGameController.swift @@ -21,6 +21,7 @@ class LevelsGameController: UIViewController, @IBOutlet var rowCountLabel: UILabel! @IBOutlet var heartImageView: UIImageView! + /* XXX REMOVE THESE NEXT 3 LINES */ @IBOutlet var gameOverView: UIView! @IBOutlet var gameOverLevelCount: UILabel! @IBOutlet var gameOverLevelScore: UILabel! @@ -31,6 +32,11 @@ class LevelsGameController: UIViewController, @IBOutlet weak var bannerAdView: GADBannerView! + @IBOutlet var gameOverViewNew: UIView! + @IBOutlet weak var gameOverTextBackground: UIImageView! + @IBOutlet weak var gameOverShareButton: UIButton! + @IBOutlet weak var gameOverNextButton: UIButton! + private var interstitialAd: GADInterstitial! private var rewardAdViewController: RewardAdViewController! @@ -269,6 +275,33 @@ class LevelsGameController: UIViewController, } } + @IBAction func gameOverShareButtonClicked(_ sender: Any) { + let layer = UIApplication.shared.keyWindow!.layer + let scale = UIScreen.main.scale + // Creates UIImage of same size as view + UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale); + layer.render(in: UIGraphicsGetCurrentContext()!) + let screenshot = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + let activityViewController = UIActivityViewController(activityItems: [screenshot], applicationActivities: []) + self.present(activityViewController, animated: true, completion: nil) + } + + @IBAction func gameOverNextButtonClicked(_ sender: Any) { + let scene = self.scene as! LevelsGameScene + scene.removeConfetti() + scene.removeGameOverView() + + // Show an interstitial ad + if self.interstitialAd.isReady { + self.interstitialAd.present(fromRootViewController: self) + } + + // Replay the game scene; state should have already been saved + self.goToGameScene() + } + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Prepare for a segue } @@ -323,7 +356,14 @@ class LevelsGameController: UIViewController, resumeButton.layer.cornerRadius = resumeButton.frame.height * 0.5 gameMenuButton.layer.cornerRadius = gameMenuButton.frame.height * 0.5 - gameOverView.center = CGPoint(x: view.frame.midX, y: view.frame.midY) + // XXX REMOVE ME gameOverView.center = CGPoint(x: view.frame.midX, y: view.frame.midY) + gameOverViewNew.center = CGPoint(x: view.frame.midX, y: view.frame.midY) + + gameOverNextButton.imageView?.contentMode = .scaleAspectFit + gameOverShareButton.imageView?.contentMode = .scaleAspectFit + + gameOverNextButton.layer.cornerRadius = gameOverNextButton.frame.height * 0.5 + gameOverShareButton.layer.cornerRadius = gameOverShareButton.frame.height * 0.5 view.presentScene(scene) view.ignoresSiblingOrder = true @@ -435,6 +475,7 @@ class LevelsGameController: UIViewController, currentLevelCount -= 1 } + /* XXX REMOVE ME gameOverLevelCount.attributedText = NSAttributedString(string: "Level \(currentLevelCount)", attributes: strokeTextAttributes) gameOverLevelScore.attributedText = NSAttributedString(string: "\(scene.gameModel!.gameScore)", @@ -443,19 +484,26 @@ class LevelsGameController: UIViewController, // If they beat their high score, let them know scene.showGameOverView(win: win, gameOverView: gameOverView) + */ if win { // Used for determining when we might be able to prompt the use for a positive review (they're more likely to be happy if they've completed more than 1 level successfully) numConsecutiveWins += 1 // Used in analytics to determine how many levels were completed in a session numLevelsCompleted += 1 + gameOverNextButton.setTitle("Next", for: .normal) } else { numConsecutiveWins = 0 // Increment the number of levels failed numLevelsFailed += 1 + + // Change the text of the button to say "Try Again" instead of "Next" + gameOverNextButton.setTitle("Try Again", for: .normal) } + scene.showGameOverView(win: win, gameOverView: gameOverViewNew) + let winInt = win ? 1 : 0 let userRescuedInt = userWasRescued ? 1 : 0 // Analytics log event: level ending; send over the level number that just endedNS whether or not they just beat this level @@ -466,6 +514,7 @@ class LevelsGameController: UIViewController, "rescued": userRescuedInt as NSNumber, ]) + /* XXX REWORK ME let _ = Timer.scheduledTimer(withTimeInterval: 3.0, repeats: false) { _ in let scene = self.scene as! LevelsGameScene if win { @@ -482,6 +531,7 @@ class LevelsGameController: UIViewController, // Replay the game scene; state should have already been saved self.goToGameScene() } + */ } // MARK: Private functions diff --git a/Ballz1/Views/BrickBreak.storyboard b/Ballz1/Views/BrickBreak.storyboard index 29d45a6..e4765f6 100644 --- a/Ballz1/Views/BrickBreak.storyboard +++ b/Ballz1/Views/BrickBreak.storyboard @@ -820,6 +820,49 @@ + @@ -907,7 +950,11 @@ + + + + @@ -991,6 +1038,55 @@ + @@ -1044,5 +1140,6 @@ + diff --git a/Ballz1/Views/LevelsGameScene.swift b/Ballz1/Views/LevelsGameScene.swift index 9be09b0..2ebaa4a 100644 --- a/Ballz1/Views/LevelsGameScene.swift +++ b/Ballz1/Views/LevelsGameScene.swift @@ -506,6 +506,7 @@ class LevelsGameScene: GameScene { let blurView = UIVisualEffectView(effect: blur) blurView.frame = view!.frame + /* XXX let imageView = UIImageView(image: UIImage(named: "score_background_yellow_fade")) // Set the center of the image to be the center of the main view imageView.center = view!.center @@ -529,6 +530,14 @@ class LevelsGameScene: GameScene { // Add the background image for the labels view!.addSubview(imageView2) + */ + + // Add the blur view to the screen first + view!.addSubview(blurView) + + // Set the alphas to 0 so we can fade it in + blurView.alpha = 0 + gameOverView.alpha = 0 // Unhide the level cleared view gameOverView.isHidden = false @@ -536,61 +545,72 @@ class LevelsGameScene: GameScene { // Add the level cleared view on top of the blur view and the level cleared view view!.addSubview(gameOverView) - // Set a flag so that the update scene tick will fade the view in - showingGameOverView = true - - activeViews = [blurView, gameOverView, imageView, imageView2] + var imageView: UIImageView? = nil if win { if gameModel!.gameScore > gameModel!.highScore { - let _ = Timer.scheduledTimer(withTimeInterval: 1.5, repeats: false) { _ in - self.addHighScoreStamp() - } + imageView = addHighScoreStamp() } else { - let _ = Timer.scheduledTimer(withTimeInterval: 1.5, repeats: false) { _ in - self.addLevelPassedStamp() - } + imageView = addLevelPassedStamp() } } else { - let _ = Timer.scheduledTimer(withTimeInterval: 1.5, repeats: false) { _ in - self.addLevelFailedStamp() - } + imageView = addLevelFailedStamp() } + + view!.addSubview(imageView!) + + // XXX activeViews = [blurView, gameOverView, imageView, imageView2] + activeViews = [blurView, gameOverView, imageView!] + + // Set a flag so that the update scene tick will fade the view in + showingGameOverView = true } - public func addLevelPassedStamp() { + public func addLevelPassedStamp() -> UIImageView { let levelPassedStampView = UIImageView(image: UIImage(named: "level_passed_narrow4")) levelPassedStampView.center = view!.center levelPassedStampView.center.y -= 70 levelPassedStampView.contentMode = .scaleAspectFit + levelPassedStampView.alpha = 0 + /* XXX REMOVE ME view!.addSubview(levelPassedStampView) activeViews.append(levelPassedStampView) + */ + return levelPassedStampView } - public func addLevelFailedStamp() { - let levelPassedStampView = UIImageView(image: UIImage(named: "level_failed_narrow4")) - levelPassedStampView.center = view!.center - levelPassedStampView.center.y -= 70 - levelPassedStampView.contentMode = .scaleAspectFit + public func addLevelFailedStamp() -> UIImageView { + let levelFailedStampView = UIImageView(image: UIImage(named: "level_failed_narrow4")) + levelFailedStampView.center = view!.center + levelFailedStampView.center.y -= 70 + levelFailedStampView.contentMode = .scaleAspectFit + levelFailedStampView.alpha = 0 - view!.addSubview(levelPassedStampView) + /* XXX REMOVE ME + view!.addSubview(levelFailedStampView) - activeViews.append(levelPassedStampView) + activeViews.append(levelFailedStampView) + */ + return levelFailedStampView } - public func addHighScoreStamp() { + public func addHighScoreStamp() -> UIImageView { let highScoreStamp = UIImageView(image: UIImage(named: "high_score_narrow4")) highScoreStamp.center = view!.center highScoreStamp.center.y -= 70 highScoreStamp.contentMode = .scaleAspectFit + highScoreStamp.alpha = 0 + /* XXX REMOVE ME view!.addSubview(highScoreStamp) activeViews.append(highScoreStamp) + */ + return highScoreStamp } public func removeGameOverView() {