2017-06-19 80 views
0

試圖編碼snake.head.frame相交snake.body.frame,但我在gameOver()中得到一個錯誤func - 蛇體是一個UIImage不能讓蛇頭相交它的身體gameOver - Swift 3

實際上試圖插入snake.body.bodys []。框架和我沒有得到任何錯誤,但相交snake.head.frame到snake.body.bodys []。幀之後,在它沒有觸發遊戲

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 
} 
} 

在此先感謝

回答

1

答案就在你自己的問題。值類型的

「SnakeBody」沒有成員「幀」

您收到此錯誤,因爲類​​沒有定義frame。相反,它有一個ListBodyItem s的數組,其中有幀。解決這個問題的一種方法是創建一個獨立的函數來檢查蛇的頭部是否與身體的任何部分相交。它看起來像這樣。

添加以下方法來上課​​

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() 
    } 
} 

UPDATE 我不知道你的執行的其餘部分,以便它會有點難以告訴你在哪裏調用這個方法。根據您提供的代碼,我的印象是您使用Timer調用gameOver方法。由於事實並非如此,我假設你會有某種函數被週期性地調用(或者以其他方式)並更新蛇的框架。你會做該方法是這樣的

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 
} 
+0

的GAMEOVER()方法上面沒有觸發時,蛇頭框架與其身體相交。我在哪裏以及如何稱此方法? – 7rs7

+0

請參閱更新 – Malik