繁体   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