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
、サイズを大きくすると、ウィンドウがいっぱいになります。
また、をgo
呼び出すときにキーワードをドロップしますdriver.Main()
。一部のOS固有のライブラリでは、それをmain
ゴルーチンから呼び出す必要があります。だから、空を削除するfor
からmain()
、driver.Main()
あなたのアプリが終了する必要があるまでブロックします。
また、ウィンドウ(画面)が更新またはクリアされたかのように、再描画が必要になる場合があるため、青い長方形が表示されることは保証されません。
そのため、代わりに描画ロジックをイベントループに移動し、イベントに対して実行しpaint.Event
ます。
case paint.Event:
defaultDrawToBuffer(drawBuff.RGBA())
window.Upload(image.Point{}, drawBuff, drawBuff.Bounds())
window.Publish()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加