我正在尝试使用 golang.org/x/exp/shiny/screen 创建一个窗口,然后在屏幕上绘制一个缓冲区。
我已经为窗口和我在窗口上发布的缓冲区分配了相同的边界(高度和宽度),但是当我看到结果时似乎不匹配。
你可以在图片中看到,上传到窗口的蓝色缓冲区没有完全覆盖它。
package main
import (
"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
)
// Colors
var (
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 {
}
}
// Bounds: (0,0)-(64,32)
func defaultDrawToBuffer(img *image.RGBA) {
b := img.Bounds()
log.Printf("Bounds: %s", b.String())
for x := b.Min.X; x < b.Max.X; x++ {
for y := b.Min.Y; y < b.Max.Y; y++ {
img.SetRGBA(x, y, Blue)
}
}
}
最佳答案
您指定初始大小 width=62, height=32
,这些大小以像素为单位。这意味着您希望窗口“很小”。 Windows 通常有一个最小 大小(通常由窗口控件决定),而且这个最小大小似乎比您预期的大小要大。因此,您绘制的蓝色矩形不会覆盖整个窗口(不会小于最小尺寸)。
如果你增加尺寸,例如Rows = 300, Cols = 600
,然后它将填满您的窗口。
此外,在调用 driver.Main()
时删除 go
关键字,一些特定于操作系统的库要求从 main
调用它> 协程。因此,从 main()
中删除空的 for
,driver.Main()
block ,直到您的应用退出。
此外,这仍然不能保证您看到蓝色矩形,就好像窗口(屏幕)被刷新/清除一样,可能需要重绘。
因此,将您的绘图逻辑移至事件循环,并为 paint.Event
事件执行它:
case paint.Event:
defaultDrawToBuffer(drawBuff.RGBA())
window.Upload(image.Point{}, drawBuff, drawBuff.Bounds())
window.Publish()
关于go - 将缓冲区绘制到屏幕时绑定(bind)不匹配 (golang.org/x/exp/shiny/screen),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57473937/