我正在尝试使用 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()
- 1 回答
- 0 关注
- 133 浏览
添加回答
举报
0/150
提交
取消