尝试将snake.head.frame编码为与snake.body.frame相交但我在gameOver()函数中出错 - snake body是UIImage
实际上试图插入snake.body.bodys []。frame并且我没有得到任何错误但是在将snake.head.frame交叉到snake.body.bodys []之后它没有触发游戏结束.frame
func gameOver() {
if snake.head.frame.intersects(snake.body.frame) // ERROR - {
print("game over")
timer.invalidate()
}
}
// Value of type 'SnakeBody' has no member 'frame'
类Snake:
class Snake {
let head = SnakeHead()
let body = SnakeBody()
weak var mainView: UIView!
var direction = Direction.right
init(view: UIView) {
mainView = view
head.nextItem = body.bodys[0]
view.addSubview(head)
view.addSubview(body.bodys[0])
}
}
类SnakeBody:
class SnakeBody {
var startRadius: CGFloat = 20.0
var bodys = [ListBodyItem]()
init() {
bodys.append(conBody(CGRect(x: 60, y: 90, width: 30, height: 30)))
}
func addOne(_ view: UIView) {
let curLast = bodys.last!
bodys.append(conBody(curLast.frame))
curLast.nextItem = bodys.last
view.addSubview(bodys.last!)
}
func conBody(_ frame: CGRect) -> ListBodyItem {
let body = ListBodyItem(frame: frame)
body.setImage(UIImage(named: "snakeBody"), for: UIControlState())
body.clipsToBounds = true
return body
}
}
提前致谢
答案 0 :(得分:1)
答案在你自己的问题中。
'SnakeBody'类型的值没有成员'frame'
您收到此错误是因为课程SnakeBody
没有定义frame
。相反,它有一个ListBodyItem
的数组,而这些数组又有帧。修复它的一种方法是创建一个单独的函数,检查蛇的头部是否与身体的任何部分相交。它看起来像这样。
将以下方法添加到课程SnakeBody
func isIntersectingWithHead(_ frame: CGRect) -> Bool {
var isIntersecting = false
for item in bodys {
if frame.intersects(item.frame) {
isIntersecting = true
break
}
}
return isIntersecting
}
然后将gameOver
方法更改为
func gameOver() {
if snake.body.isIntersectingWithHead(snake.head.frame) {
print("game over")
timer.invalidate()
}
}
<强>更新强>
我不知道你实现的其余部分,所以要告诉你到底在哪里调用这个方法会有点困难。根据您提供的代码,我认为您使用gameOver
调用了Timer
方法。由于情况并非如此,我假设你会有某种类型的函数被定期调用(或其他方式)并更新蛇的框架。你会在那个方法中做这样的事情
func updateSnakeFrame() {
//Snake's body and head frame updated here
if isIntersectingWithHead(snake.head.frame) {
gameOver()
}
}
注意强>
通过此实施,您的gameOver
方法将更改为
func gameOver() {
print("game over")
timer.invalidate() //Only use this line if you actually are using a timer and want to invalidate it here
}