试图将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'

蛇类:
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])
}

}
蛇体类:
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
}
}

提前谢谢

最佳答案

答案是你自己的问题。
“SnakeBody”类型的值没有成员“frame”
您得到这个错误是因为类SnakeBody没有定义frame。相反,它有一个ListBodyItems的数组,而这个数组又有帧。解决这个问题的一个方法是创建一个单独的函数来检查蛇头是否与身体的任何部分相交。会像这样。
将以下方法添加到类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方法。因为事实并非如此,我假设您将拥有某种类型的函数,该函数定期(或以其他方式)调用并更新snake的帧。你会用这种方法
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
}

关于swift - 无法在游戏中让蛇头相交-Swift 3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44620676/

10-09 12:51