我正在尝试使用golang.org/x/exp/发亮/屏幕创建一个窗口,然后在屏幕上画一个缓冲区。
我已经为窗口和我在窗口上发布的缓冲区分配了相同的边界(高度和宽度),但是当我看到结果时,似乎出现了不匹配。
您可以在图片中看到,上传到窗口的蓝色缓冲区没有完全覆盖它。

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)
}
}
}发布于 2019-08-13 08:59:58
您指定width=62, height=32的初始大小,这些是以像素为单位的大小。这意味着你希望你的窗户是“小”的。窗口通常有一个最小大小(通常由窗口控件决定),而且这个最小大小似乎比您预期的大小要大。因此,您绘制的蓝色矩形将不会整个窗口(这将不小于最小的大小)。
如果您增加大小,例如Rows = 300, Cols = 600,那么它将填充您的窗口。
另外,在调用go时删除driver.Main()关键字,一些特定于操作系统的库要求从main goroutine调用它。因此,将空的for从main(),driver.Main()块中删除,直到应用程序退出为止。
而且,这仍然不能保证您看到蓝色矩形,就像窗口(屏幕)被刷新/清除一样,可能需要重新绘制。
因此,将绘图逻辑移动到事件循环,并为paint.Event事件执行它:
case paint.Event:
defaultDrawToBuffer(drawBuff.RGBA())
window.Upload(image.Point{}, drawBuff, drawBuff.Bounds())
window.Publish()https://stackoverflow.com/questions/57473937
复制相似问题