我正在嘗試使用 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 關注
- 160 瀏覽
添加回答
舉報
0/150
提交
取消