将缓冲区绘制到屏幕时绑定不匹配(golang.org/x/exp/shiny/screen)

我正在尝试使用 golang.org/x/exp/shiny/screen 创建一个窗口,然后在屏幕上绘制一个缓冲区。

我已为窗口和在窗口上发布的缓冲区分配了相同的边界(高度和宽度),但当我看到结果时似乎存在不匹配。

您可以在图片中看到,上传到窗口的蓝色缓冲区并未完全覆盖它。

http://img2.mukewang.com/64abd13f000114b701230061.jpg

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 {

    }


}



哆啦的时光机
浏览 134回答 1
1回答

临摹微笑

您指定初始大小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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go