簡體   English   中英

如何使用 function 調用正確更新 CGContext?

[英]How to correctly update a CGContext with a function call?

我正在制作一個小型射擊游戲,其中一艘小船探索一個 8x8 級別的房間,里面充滿了敵人等。 我目前正在嘗試實現一個 map 來向玩家展示他們已經去了哪里。 我最初的實現很簡單——我制作了一個定制的 UIView,將它連接到我的 Storyboard,並且想簡單地繪制在 map 上訪問的任何新房間。 我選擇使用 CGContext 來執行此操作,並且我的第一次嘗試如下所示。

使用此代碼,第一個 updateMap 調用完美運行 - 矩形以正確的顏色繪制,position 在播放器 map 上繪制。 但是,盡管 CGRect 正確更新,任何后續調用似乎都沒有繪制任何內容。 如果我取消注釋 PopContext(或刪除 PushContext),它將觸發“找不到上下文”拋出。 雖然下面顯示的 state 中的代碼不會打印“找不到上下文”,但它也不會更新 map。

誠然,我對 CGContext 的理解相當乏味,所以我認為我只是在這里犯了一個概念上的錯誤。 話雖如此,我到底在搞砸什么?

class MapView: UIView {


var x: Int!
var y: Int!
var drect: CGRect!

override func draw( _ frame: CGRect) {
    
    super.draw(frame)
    
    if let context: CGContext = UIGraphicsGetCurrentContext(){
        //UIGraphicsPopContext()
        context.setFillColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.0);   //this is the transparent color
        context.setStrokeColor(red: 0.0, green: 0.0, blue: 100.0, alpha: 1.0);
        context.fill(drect);
        context.stroke(drect);    //this will draw the border
        context.addRect(drect)
        UIGraphicsPushContext(context)
    } else {
        print("Context not found")
        return
    }



}

public func updateMap(scene: GameScene){
    x = scene.current_xcoords
    y = scene.current_ycoords
    let w = self.frame.width
    let h = self.frame.height
    drect = CGRect(x: (w/50) + CGFloat(x)*w/8, y: (h/100) + CGFloat(y)*h/8, width: (h / 11), height: (h / 11))
    draw(self.frame)
}

}

你不應該直接調用draw()方法......你可以調用setNeedsDisplay()layoutIfNeeded()

根據蘋果文檔

當第一次顯示視圖或發生使視圖的可見部分無效的事件時,將調用此方法。 你永遠不應該自己直接調用這個方法。 要使視圖的一部分無效,從而導致該部分被重繪,請改為調用 setNeedsDisplay() 或 setNeedsDisplay(_:) 方法。

所以你的代碼變成

public func updateMap(scene: GameScene){
    x = scene.current_xcoords
    y = scene.current_ycoords
    let w = self.frame.width
    let h = self.frame.height
    drect = CGRect(x: (w/50) + CGFloat(x)*w/8, y: (h/100) + CGFloat(y)*h/8, width: (h / 11), height: (h / 11))
    setNeedsDisplay()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM