/2024-NC2-M16-GameCenter

πŸ•ΉοΈ λΉ™κ³ λ‘œ λ³΄λŠ” 우리 동넀 맛집_ν¬ν•­νŽΈ 🌊

Primary LanguageSwift

2024-NC2-M16-Game-Center

게암센ᄐα…₯

ο£Ώ Authors

강희주(Rad) κΉ€μœ λΉˆ(Nini)
🎨 λ””μžμΈ 🎨 🍎 ν…Œν¬ 🍎
λž˜λ“œ λ‹ˆλ‹ˆ

πŸŽ₯ Youtube Link

https://youtu.be/DZWRW-y7d7Y?si=BJJ8Ft5C82tiEMWN


πŸ’‘ About Game Center

Game Center 소ᄀᅒ


🎯 What we focus on?

λ©€ν‹° ν”Œλ ˆμ΄μ–΄(친ꡬ), μˆœμœ„ν‘œ(λ¦¬λ”λ³΄λ“œ), λͺ©ν‘œ 달성(업적)

Focus on


πŸ’Ό Use Case

맛집 νƒλ°©μ΄λΌλŠ” 주제λ₯Ό κ²Œμ΄λ―Έν”ΌμΌ€μ΄μ…˜μ„ μ μš©ν•œ λΉ™κ³ λ₯Ό 톡해 μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜λ©°, κ²Œμž„μ„Όν„°μ˜ κΈ°λŠ₯을 톡해 μ„œλ²„λ₯Ό λŒ€μ‹ ν•˜μ—¬ μ‚¬μš©μžκ°„μ˜ 경쟁과 μž¬μ°Έμ—¬λ₯Ό μœ λ„ν•œλ‹€.

Use Case Use Case2


πŸ–ΌοΈ Prototype

   
프로토ᄐᅑ압_메안 프로토ᄐᅑ압_방고 프로토ᄐᅑ압_게암센ᄐα…₯

πŸ•ΉοΈ Demo Video

prototype.mp4

πŸ› οΈ About Code

1️⃣ GameKit을 μ‚¬μš©ν•˜μ—¬ ν˜„μž¬ λ””λ°”μ΄μŠ€μ˜ κ²Œμž„ μ„Όν„° ν”Œλ ˆμ΄μ–΄ 인증

-> μΈμ¦λ˜μ§€ μ•Šμ€ 경우, κ²Œμž„ μ„Όν„° 둜그인 화면을 ν‘œμ‹œν•˜μ—¬ ν”Œλ ˆμ΄μ–΄κ°€ λ‘œκ·ΈμΈν•  수 μžˆλ„λ‘ ν•΄μ€Œ

import GameKit
// 둜컬 ν”Œλ ˆμ΄μ–΄ 인증 λ©”μ„œλ“œ
    func authenticateLocalPlayer() {
        // 이미 인증 쀑이면 쀑볡 μ‹€ν–‰ 방지
        guard !authenticating else { return }
        authenticating = true

        // 인증 ν•Έλ“€λŸ¬ μ„€μ •
        GKLocalPlayer.local.authenticateHandler = { [weak self] viewController, error in
            guard let self = self else { return }
            self.authenticating = false
            if let error = error {
                print("Authentication failed: \\(error.localizedDescription)")
                self.isAuthenticated = false
            } else if let viewController = viewController {
                // 둜그인 λ·° μ»¨νŠΈλ‘€λŸ¬κ°€ ν•„μš”ν•œ 경우 ν‘œμ‹œ
                print("Game Center login required")
                if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
                   let window = windowScene.windows.first {
                    window.rootViewController?.present(viewController, animated: true, completion: nil)
                }
            } else if GKLocalPlayer.local.isAuthenticated {
                // 인증 성곡
                self.isAuthenticated = true
                print("Player authenticated")
            } else {
                // 인증 μ‹€νŒ¨
                self.isAuthenticated = false
                print("Player not authenticated")
            }
        }
    }

2️⃣ Game Center μˆœμœ„ν‘œ(λ¦¬λ”λ³΄λ“œ)에 μ‚¬μš©μžμ˜ 점수 보내기

// (μˆœμœ„ν‘œλ₯Ό μœ„ν•œ) κ²Œμž„μ„Όν„° 점수 μ €μž₯ λ©”μ„œλ“œ
    func reportBingoCount(_ count: Int) {
        // 인증 μ—¬λΆ€ 확인
        guard isAuthenticated else {
            print("Player is not authenticated")
            return
        }

        let score = GKLeaderboardScore()
        score.leaderboardID = "μˆœμœ„ν‘œ ID"
        // μˆœμœ„ν‘œμ— λΆ€μ—¬ν•΄μ•Ό ν•˜λŠ” 영숫자 μ‹λ³„μž - 이 IDλŠ” 100자둜 μ œν•œ, 영ꡬ적으둜 μ„€μ •λ˜λ©° λ‚˜μ€‘μ— λ³€κ²½ν•  수 μ—†μŒ
        score.value = Int(count)

        // 점수 μ €μž₯
        GKLeaderboard.submitScore(score.value, context: 0, player: GKLocalPlayer.local, leaderboardIDs: [score.leaderboardID]) { error in
            if let error = error {
                print("Failed to report score: \\(error.localizedDescription)")
            } else {
                print("Score reported successfully")
            }
        }
    }

3️⃣ λͺ©ν‘œ 달성을 ν™•μΈν•˜κΈ° μœ„ν•œ 데이터 전달

// λͺ©ν‘œ(업적) 달성 λ©”μ„œλ“œ
    func reportAchievement(identifier: String, percentComplete: Double) {
        // 인증 μ—¬λΆ€ 확인
        guard isAuthenticated else {
            print("Player is not authenticated")
            return
        }

        // λͺ©ν‘œ 객체 생성 및 μ„€μ •
        let achievement = GKAchievement(identifier: identifier)
        achievement.percentComplete = percentComplete
        achievement.showsCompletionBanner = true

        // λͺ©ν‘œ 달성 보고
        GKAchievement.report([achievement]) { error in
            if let error = error {
                print("Failed to report achievement: \\(error.localizedDescription)")
            } else {
                print("Achievement reported successfully")
            }
        }
    }

4️⃣ Game Center μˆœμœ„ν‘œ 보기

// μˆœμœ„ν‘œ 보기 λ©”μ„œλ“œ
    func showLeaderboard() {
        let leaderboardID = "μˆœμœ„ν‘œ ID"
        let viewController = GKGameCenterViewController(leaderboardID: leaderboardID, playerScope: .friendsOnly, timeScope: .allTime)
        viewController.gameCenterDelegate = self

        if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
            if let window = windowScene.windows.first {
                window.rootViewController?.present(viewController, animated: true, completion: nil)
            }
        }
    }