使用GameKit创建多人游戏
立即解锁
发布时间: 2025-08-27 02:25:48 阅读量: 138 订阅数: 15 


使用SpriteKit和Swift构建2D游戏
### 利用 GameKit 创建多人游戏
#### 1. 引言
在为游戏添加了 Game Center 的一些基本功能后,现在可以将游戏功能扩展到支持通过 Game Center 进行在线多人游戏。在线多人游戏可以让玩家与真实的人对战,增加游戏的受欢迎程度,同时也带来更多乐趣。Game Center 中有两种类型的多人游戏:实时游戏和回合制游戏,本文将重点介绍自动匹配的回合制游戏。
#### 2. 请求回合制匹配
在玩家开始或加入多人游戏之前,需要先发出请求。可以使用 `GKTurnBasedMatchmakerViewController` 类及其对应的 `GKTurnBasedMatchmakerViewControllerDelegate` 协议来设置多人游戏请求。
##### 2.1 准备回合制匹配视图控制器
1. 打开 Xcode 中的项目。可以继续使用之前的项目,也可以使用本章代码资源中 `projects/begin` 文件夹下的起始项目。本章还有一个包含所有添加代码和资源的结束项目,位于 `projects/end` 文件夹中。
2. 在项目导航器中选择 `GameKitHelper.swift` 文件。
3. 在 `GameKitHelper` 类中,在 `gameCenterViewController` 属性下方添加新属性:
```swift
var matchmakerViewController: GKTurnBasedMatchmakerViewController?
```
4. 在 `GameKitHelper.swift` 文件底部的 `Notification.Name` 扩展中添加新的自定义通知:
```swift
static let presentTurnBasedGameCenterViewController =
Notification.Name("presentTurnBasedGameCenterViewController")
```
5. 在 `Notification.Name` 扩展上方添加支持 `GKTurnBasedMatchmakerViewControllerDelegate` 协议的扩展:
```swift
extension GameKitHelper: GKTurnBasedMatchmakerViewControllerDelegate {
func turnBasedMatchmakerViewControllerWasCancelled(_ viewController:
GKTurnBasedMatchmakerViewController) {
viewController.dismiss(animated: true, completion: nil)
}
func turnBasedMatchmakerViewController(_ viewController:
GKTurnBasedMatchmakerViewController, didFailWithError error: Error) {
print("MatchmakerViewController failed with error: \(error)")
}
}
```
##### 2.2 使用回合制匹配视图控制器
在 `GameKitHelper.swift` 文件中,在 `turnBasedMatchmakerViewController(_:didFailWithError:)` 方法下方添加以下代码:
```swift
// Show the Turn-Based Matchmaker View Controller (Find Match)
func findMatch() {
guard GKLocalPlayer.local.isAuthenticated else { return }
let request = GKMatchRequest()
request.minPlayers = 2
request.maxPlayers = 2
request.defaultNumberOfPlayers = 2
request.inviteMessage = "Do you want to play Hog Dice?"
matchmakerViewController = nil
matchmakerViewController =
GKTurnBasedMatchmakerViewController(matchRequest: request)
matchmakerViewController?.turnBasedMatchmakerDelegate = self
NotificationCenter.default.post(name:
.presentTurnBasedGameCenterViewController, object: nil)
}
```
接下来,修改 `GameViewController.swift` 文件:
```swift
@objc func showTurnBasedMatchmakerViewController() {
if let viewController = GameKitHelper.shared.matchmakerViewController {
present(viewController, animated: true, completion: nil)
}
}
```
在 `viewDidLoad()` 方法中添加观察者:
```swift
NotificationCenter.default.addObserver(
self,
selector: #selector(self.showTurnBasedMatchmakerViewController),
name: .presentTurnBasedGameCenterViewController, object: nil)
```
##### 2.3 更新大厅场景
在 `LobbyScene.swift` 文件的 `touchDown(atPoint:)` 方法中,将 `// TODO: Add code to open find match` 替换为:
```swift
GameKitHelper.shared.findMatch()
```
#### 3. 管理多人游戏匹配
Game Center 和 GameKit 提供了设置和管理多人游戏所需的大部分功能,但需要自己提供游戏数据。回合制游戏的核心是 `GKTurnBasedMatch` 对象,它包含了游戏匹配的重要信息,使用存储 - 转发方法在参与者之间共享游戏数据。
`GKTurnBasedMatch` 对象的关键属性如下:
| 属性 | 描述 |
| ---- | ---- |
| participants | 包含参与游戏的“玩家”信息 |
| currentParticipant | 当前轮到的参与者 |
| matchData | 包含特定于游戏的数据,包括匹配细节和当前状态 |
| matchID | 唯一标识匹配的字符串 |
##### 3.1 扩展 GKTurnBasedMatch 类
在 `Extensions` 组中创建一个新的 `iOS Swift File`,命名为 `GameKit+Extensions.swift`,并替换其内容为:
```swift
import GameKit
extension GKTurnBasedMatch {
var localPlayer: GKTurnBasedParticipant? {
return participants.filter({ $0.player == GKLocalPlayer.local}).first
}
var opponents: [GKTurnBasedParticipant] {
return participants.filter {
return $0.player != GKLocalPlayer.local
}
}
}
```
##### 3.2 处理游戏相关数据
由于原 `Player` 类有很多 Game Center 不需要的属性,且部分属性不遵循 `Encodable` 和 `Decodable` 协议,因此创建新类支持多人游戏。
1. 在 `Game Center` 组中创建 `GameCenterPlayer.swift` 文件,内容如下:
```swift
class GameCenterPlayer: Codable, Equatable {
var playerId: String
var playerName: String
var isLocalPlayer: Bool = false
var isWinner: Bool = false
var totalPoints: Int = 0
// protocol required for `Equatable`
static func == (lhs: GameCenterPlayer, rhs: GameCenterPlaye
```
0
0
复制全文
相关推荐










