- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 swift NSCopy 来深度复制 GKGameModel 的对象,包括所有玩家及其钱包引用(包含代表现金的整数)。
使用 Swift Playgrounds,我尝试将 100 美元记入所有复制的玩家,但保持原始玩家对象完好无损。
但是,我注意到该代码也会影响原始玩家对象。
在较高的层次上,代码应该显示:
Game class, a GKGameModel
Player class, a GKPlayerModel
Wallet class, handles very basic player's Int transactions.
目标:
代码如下:
// Uses Swift playground
import GameplayKit
class Game : NSObject, GKGameModel{
override var description: String {
return ("game: \(String(describing: self.players))")
}
// -- GKGameModel code follows --
var players: [GKGameModelPlayer]?
var activePlayer: GKGameModelPlayer?
func gameModelUpdates(for player: GKGameModelPlayer) -> [GKGameModelUpdate]? {
return nil
}
func unapplyGameModelUpdate(_ gameModelUpdate: GKGameModelUpdate) {
}
func apply(_ gameModelUpdate: GKGameModelUpdate) {
}
func setGameModel(_ gameModel: GKGameModel) {
guard let inputModel = gameModel as? Game else {
assertionFailure("No game model initialised")
return
}
guard let players = inputModel.players else {
assertionFailure("No players initialised")
return
}
self.activePlayer = inputModel.activePlayer
self.players = players
}
func copy(with zone: NSZone? = nil) -> Any {
print ("copying game obj!")
let copy = Game()
copy.setGameModel(self)
copy.players = self.players // if I do not include it, copy.players is nil
return copy
}
}
class Player : NSObject, NSCopying, GKGameModelPlayer {
override var description: String {
return ("name: \(name), cash: $\(cash), wallet: $\(wallet.balance)")
}
internal var playerId: Int = 0 {
didSet {
print ("Set playerId = \(self.playerId)")
}
}
var name: String
var cash : Int = 0
var wallet : Wallet = Wallet()
init(name: String) {
self.name = name
}
func copy(with zone: NSZone? = nil) -> Any {
print ("copying player!!") // this code is never reached
let copy = self
copy.wallet = self.wallet.copy(with: zone) as! Wallet
return copy
}
}
enum WalletError : Error {
case mustBePositive
case notEnoughFunds
}
fileprivate protocol WalletDelegate {
var balance : Int { get }
func credit(amount: Int) throws
func debit(amount: Int) throws
}
class Wallet : NSCopying, CustomStringConvertible, WalletDelegate {
public private(set) var balance: Int = 0
func credit(amount: Int = 0) throws {
try canCredit(amount: amount)
self.balance += amount
}
func debit(amount: Int = 0) throws {
try canDebit(amount: amount)
self.balance -= amount
}
func copy(with zone: NSZone? = nil) -> Any {
print ("copy wallet") // this code is never reached
let copy = Wallet()
return copy
}
}
extension Wallet {
private func canCredit(amount: Int) throws {
guard amount > 0 else {
throw WalletError.mustBePositive
}
}
private func canDebit(amount: Int) throws {
guard amount > 0 else {
throw WalletError.mustBePositive
}
guard self.balance >= amount else {
throw WalletError.notEnoughFunds
}
guard (self.balance - amount >= 0) else {
throw WalletError.notEnoughFunds
}
}
}
extension Wallet {
var description: String {
return ("Balance: $\(self.balance)")
}
}
let players : [GKGameModelPlayer] = [ Player.init(name: "Bob"), Player.init(name: "Alex"), Player.init(name: "John") ]
let game = Game()
game.players = players
func copyTheGame() {
let copiedGame = game.copy() as! Game
print ("BEFORE:")
print ("Original: \(String(describing: game))")
print ("Copied: \(String(describing: copiedGame))")
print ("----")
if let copiedPlayers = copiedGame.players {
for p in copiedPlayers as! [Player] {
do {
p.cash = 100 // try to manipulate a class variable.
try p.wallet.credit(amount: 100)
} catch let err {
print (err.localizedDescription)
break
}
}
}
print ("AFTER:")
print ("Original: \(String(describing: game))")
print ("Copied: \(String(describing: copiedGame))")
print ("----")
}
copyTheGame()
在我的输出中,我得到以下内容:
copying game obj!
BEFORE:
Original: game: Optional([name: Bob, cash: $0, wallet: $0, name: Alex, cash: $0, wallet: $0, name: John, cash: $0, wallet: $0])
Copied: game: Optional([name: Bob, cash: $0, wallet: $0, name: Alex, cash: $0, wallet: $0, name: John, cash: $0, wallet: $0])
----
AFTER:
Original: game: Optional([name: Bob, cash: $100, wallet: $100, name: Alex, cash: $100, wallet: $100, name: John, cash: $100, wallet: $100])
Copied: game: Optional([name: Bob, cash: $100, wallet: $100, name: Alex, cash: $100, wallet: $100, name: John, cash: $100, wallet: $100])
----
问题:
如何确保我所做的任何更改仅针对复制的游戏对象,而不是原始对象?
感谢
<小时/>更新:
我已经能够通过循环遍历所有玩家对象来强制复制,但我不相信这是最好的方法。
如果我将游戏类中的复制函数更改为:
func copy(with zone: NSZone? = nil) -> Any {
let copy = Game()
let duplicate = self.players?.map({ (player: GKGameModelPlayer) -> GKGameModelPlayer in
let person = player as! Player
let copiedPlayer = person.copy(with: zone) as! Player
return copiedPlayer
})
copy.players = duplicate
return copy
}
这也让我可以复制所有玩家对象;播放器和钱包类中的 copy() 函数受到攻击。
最佳答案
我已经能够通过强制复制引用对象、数组或子对象来解决该问题
即:
func copy(with zone: NSZone? = nil) -> Any {
let copy = Game()
let duplicate = self.players?.map({ (player: GKGameModelPlayer) -> GKGameModelPlayer in
let person = player as! Player
let copiedPlayer = person.copy(with: zone) as! Player
return copiedPlayer
})
copy.players = duplicate
return copy
}
关于swift - NSCopy GKGameModel 无法正确复制玩家对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52554081/
这个问题在这里已经有了答案: What does the question mark character ('?') mean in C++? (8 个答案) 关闭 7 年前。 这一行我看不懂为什么
在构建模式下甚至可以有两个玩家吗?查看 Roblox 开发者杂志文章“What did you sleigh?”,它在玩家列表中显示了两个“玩家”。 最佳答案 打开 Roblox Studio 转到任
在构建模式下甚至可以有两个玩家吗?查看 Roblox 开发者杂志文章“What did you sleigh?”,它在玩家列表中显示了两个“玩家”。 最佳答案 打开 Roblox Studio 转到任
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
“Clash of Clans”使用 Game Center 对玩家进行身份验证并将其与现有的远程存储游戏状态相关联。 据我所知,游戏仅在客户端提供玩家标识符。是否有支持的技术来安全地验证用户而不是仅
我正在开发多人游戏,但我无法找出如何将其他客户端连接到创建的游戏。我的意思是客户端 A 创建到服务器的套接字连接,其他客户端(A,B ...)如何连接到客户端 A?有人可以帮我吗? 附注我是网络编程新
我正在尝试使用浏览器控制台一步一步地制作井字游戏,并最终改进我的功能。然而,我被困在玩家2回合(ttt_player2_turn()),我必须检查箱子是否为空。看来我在这个例子中的论证有问题。感谢您的
如果我向上移动玩家 1 和玩家 2,假设我按下玩家 1 的向下键,我的玩家将停止向上移动。我找不到问题所在。有人可以帮助我并解释我做错了什么吗? package game; import java.a
我正在创建一个自上而下的 2D 游戏,并且使用 Box2D 来模拟物理,我的问题是: 如何使玩家保持与我的宇宙飞船的相对速度,并且仍然能够在飞船也在移动的情况下围绕我的玩家移动? 我在下面放了一个插图
我是 Java 新手,我正在尝试制作一个简单的游戏来娱乐。我首先尝试将 repaint 放入 PaintComponent() 中,它一直有效,直到我尝试添加一些背景。有谁知道如何让我的玩家在有或没有
//我正在尝试对玩家 2 的代码进行一些编辑,因此我删除了涉及玩家 1 的所有内容。但出于某种原因,如果没有玩家 1 的代码,玩家 2 根本不会执行任何操作。(假设使用 i、j、k 和 l 键 mov
我接到了一项任务,要编写一个由人类玩家和 AI 玩家组成的 NIM 游戏。游戏是“Misere”(最后一个必须拿起一根棍子的人输了)。 AI 应该使用 Minimax 算法,但它正在采取使其输得更快的
我是一名优秀的程序员,十分优秀!