- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在为一个播放 connect 4 的框架设计一个 UI。这个框架封装在一个名为 GameSession 的类中。我不会描述它的 API 的来龙去脉以及它是如何运作的。我不相信这很重要。
我相信我可能误解了调度队列并且我没有正确使用它们。但是,我进行了无休止的搜索,但没有找到任何暗示可以解决我的问题的方法。
这是对正在发生的事情的简短解释。控制移动的方法是 playGame(botStarts: Bool, atColumn: Int)。在此方法中,使用称为 addBoundary(atRow: Int, atColumn: Int) 的方法将碰撞边界添加到正确的行和列。然后,使用称为 dropDisc(atColumn: Int, color: UIColor) 的方法创建光盘。此方法创建一个自定义 UIView,将其添加到屏幕上的 View 并添加碰撞和重力行为。它下降直到到达先前添加的边界。
在 playGame() 中,我使用 DispatchMain.Queue.async{dropDisc()} 将光盘放到屏幕上。但是,每次我第二次及以后调用 playGame() 时,自定义圆盘都会绘制在屏幕顶部,但它们不会掉落。在第一次迭代中,它们被绘制并按预期落下。
以下是我在上面引用的函数。
private func playGame(botStarts: Bool, dropPieceAt: Int) {
DispatchQueue.global(qos: .userInitiated).async {
if botStarts {
if let move = gameSession.move {
let column = move.action % self.gameSession.boardLayout.columns
let row = move.action / self.gameSession.boardLayout.columns
self.addBoundary(atRow: row, atColumn: column)
DispatchQueue.main.async {
self.dropDisc(atColumn: column, color: move.color)
}
}
} else {
let column = dropPieceAt
if self.gameSession.userPlay(at: column) {
if let move = self.gameSession.move {
print(move)
let column = move.action % self.gameSession.boardLayout.columns
let row = move.action / self.gameSession.boardLayout.columns
self.addBoundary(atRow: row, atColumn: column)
DispatchQueue.main.async {
self.dropDisc(atColumn: column, color: move.color)
}
}
if let move = self.gameSession.move {
let column = move.action % self.gameSession.boardLayout.columns
let row = move.action / self.gameSession.boardLayout.columns
self.addBoundary(atRow: row, atColumn: column)
DispatchQueue.main.async {
self.dropDisc(atColumn: column, color: move.color)
}
}
}
if self.gameSession.done {
if let outcome = self.gameSession.outcome {
DispatchQueue.main.async {
self.gameLabel.text = outcome.message + "\n Winning pieces \(outcome.winningPieces)"
}
}
}
}
}
}
private func dropDisc(atColumn: Int, color: UIColor) {
var frame = CGRect()
frame.origin = CGPoint.zero
frame.size = Constants.bubbleSize
let x = CGFloat(39) + CGFloat(47 * atColumn)
frame.origin.x = x
let bubbleView = DiscView(frame: frame, color: color)
gameView.addSubview(bubbleView)
collider.addItem(bubbleView)
gravity.addItem(bubbleView)
}
// Adds a boundary using the row and column obtained from game session.
private func addBoundary(atRow: Int, atColumn: Int) {
let fromCoordX = CGFloat(16 + (boardView.initialX-boardView.radius)) + CGFloat(47 * atColumn)
let toCoordX = fromCoordX + CGFloat(24)
let coordY = CGFloat(198.5 + (boardView.initialY+boardView.radius)) + CGFloat(45 * atRow)
let fromPoint = CGPoint(x: fromCoordX, y: coordY+1)
let toPoint = CGPoint(x: toCoordX, y: coordY+1)
self.collider.addBoundary(withIdentifier: "boundary" as NSCopying, from: fromPoint, to: toPoint)
self.drawLineFromPoint(start: fromPoint, toPoint: toPoint, ofColor: UIColor.red, inView: self.gameView)
}
这是我的屏幕截图:https://imgur.com/7M3fklo .
在底行,您可以看到用户光盘(黄色)和机器人光盘(红色)。这些是在第一次调用 playGame() 时添加的。但是,在顶部,您可以看到在第二次调用 playGame() 时添加的两张光盘。这些不会掉下来。
无论我尝试过什么
非常感谢任何反馈!
最佳答案
后台线程很难,只有在绝对必要时才应该使用(因为它是强加给你的,或者因为你有一个耗时的事件要执行并且你不想卡住界面,它由主线程)。这里好像没有必要。你没有做任何耗时的事情。看起来使用 DispatchQueue.global
可能会让您感到困惑;后台调度队列会导致您的代码乱序运行,而您显然没有意识到这一点。
解决方案:删除所有的 DispatchQueue.global
和 DispatchQueue.main
代码。 (换句话说,删除那些行和匹配的右花括号行。)然后一切都会在主队列上运行,没有理由不这样做。
关于ios - UICollisionBehavior 和 UIGravityBehavior 无法按预期与 DispatchQueue 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55678315/
当我启动我的应用程序时,我看到 UILabel 掉落下来,然后我将其向上移动并保持在那里。为什么它不倒呢?移动元素后如何做出 GravityBehavior? class ViewControlle
我有一些使用 UIDynamicAnimation 的 UIView,特别是 UIGravityBehavior。我需要知道如何让他们随时停止和启动。 我一直在尝试手动设置行为属性的各种组合,例如将重
我正在努力学习 UIKit Dynamics。 我创建了一个框 View 并在其上添加了 UIGravityBehavior,但是当我运行该项目时没有任何反应! Viewcontroller.m #i
我正在尝试创建一个 View ,其中一些项目沿正常重力矢量落下,而其他项目沿相反矢量落下 self.animator = [[UIDynamicAnimator alloc] initWithRefe
我正在以编程方式将 UIGravityBehavior 添加到 subview ,但并不总是有效。我在主视图中有 4 个 View ,标签为 101,102,103,104,如图所示: 但出于某种原因
我正在编写可扩展托盘 View 的代码,它使用 UIDynamicAnimator 来实现漂亮的展开/收缩动画。 为了实现逼真的加速,我使用 UIGravityBehavior 让我的托盘掉落,直到托
我目前正在为一个播放 connect 4 的框架设计一个 UI。这个框架封装在一个名为 GameSession 的类中。我不会描述它的 API 的来龙去脉以及它是如何运作的。我不相信这很重要。 我相信
我正在摆弄 iOS 7 中的新物理 API。 我决定制作一个简单的游戏,我有一个角色,只需轻按手指即可在屏幕上移动,形状会定期从底部飞起来,如果它们击中角色,游戏就结束了。 我已经实现了上述所有内容,
所以我声明了一个 UILabel!名为“textLabel”,具有上升的重力效果。现在,当它达到 -30 时,我希望标签重新出现在 (200, 444) 处。我使用 NSTimer 检查 if (la
我是一名优秀的程序员,十分优秀!