为了账号安全,请及时绑定邮箱和手机立即绑定

将缓冲区绘制到屏幕时绑定不匹配(golang.org/x/exp/shiny/screen)

将缓冲区绘制到屏幕时绑定不匹配(golang.org/x/exp/shiny/screen)

Go
哆啦的时光机 2023-07-10 17:36:38
我正在尝试使用 golang.org/x/exp/shiny/screen 创建一个窗口,然后在屏幕上绘制一个缓冲区。我已为窗口和在窗口上发布的缓冲区分配了相同的边界(高度和宽度),但当我看到结果时似乎存在不匹配。您可以在图片中看到,上传到窗口的蓝色缓冲区并未完全覆盖它。package mainimport (    "image"    "image/color"    "log"    "golang.org/x/exp/shiny/driver"    "golang.org/x/exp/shiny/screen"    "golang.org/x/mobile/event/key"    "golang.org/x/mobile/event/lifecycle")const (    Row = 32    Col = 64)// Colorsvar (    Black = color.RGBA{0, 0, 0, 1.0}    White = color.RGBA{255, 255, 255, 1.0}    Blue  = color.RGBA{0, 0, 255, 1.0})func main() {    go driver.Main(func(s screen.Screen) {        opts := screen.NewWindowOptions{            Height: Row,            Width:  Col,            Title:  "Chip-8 VM",        }        window, err := s.NewWindow(&opts)        if err != nil {            log.Print("Unable to create display window: ")            log.Fatal(err)            return        }        defer window.Release()        dim := image.Point{Col, Row}        drawBuff, err := s.NewBuffer(dim)        if err != nil {            log.Fatal(err)        }        defaultDrawToBuffer(drawBuff.RGBA())        log.Print("Window bounds: ", opts)        log.Printf("Buffer bounds: %s", drawBuff.Bounds())        log.Printf("Buffer size: %s", drawBuff.Size())        window.Upload(image.Point{}, drawBuff, drawBuff.Bounds())        window.Publish()        for {            e := window.NextEvent()            switch e := e.(type) {            case lifecycle.Event:                if e.To == lifecycle.StageDead {                    return                } else if e.To == lifecycle.StageFocused {                    log.Print("Focus back on the screen!")                }            case key.Event:                log.Print("pressed key: ", e.Code)                // exit game                if e.Code == key.CodeEscape {                    return                }            case error:                log.Print(e)            }        }    })    for {    }}
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

您指定初始大小width=62, height=32,这些大小以像素为单位。这意味着您希望您的窗口“小”。Windows 通常有一个最小尺寸(通常由窗口控件决定),并且这个最小尺寸似乎比您预期的尺寸大。因此,您绘制的蓝色矩形不会覆盖整个窗口(不会小于最小尺寸)。

如果您增加尺寸,例如Rows = 300, Cols = 600,那么它将填满您的窗口。

go另外,在调用时删除关键字driver.Main(),一些特定于操作系统的库要求从 goroutine 中调用它main。因此,请删除,for块中的空块,直到您的应用程序退出。main()driver.Main()

另外,这仍然不能保证您看到蓝色矩形,就像刷新/清除窗口(屏幕)一样,可能需要重绘。

因此,请将绘图逻辑移至事件循环,并针对paint.Event事件执行它:

case paint.Event:
    defaultDrawToBuffer(drawBuff.RGBA())
    window.Upload(image.Point{}, drawBuff, drawBuff.Bounds())
    window.Publish()


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信