第一次运行后go-sdl2没有清除窗口表面

时间:2018-03-28 18:51:33

标签: go sdl

我刚刚开始阅读http://lazyfoo.net/tutorials/SDL/index.php的SDL教程课程并正在完成第一课(第01课)。我正在使用github.com/veandco/go-sdl2库将C / C ++代码手动翻译为Go。

这是我的代码:

package main

import (
    "github.com/veandco/go-sdl2/sdl"
)

const screenWidth, screenHeight = 800, 600

func main() {
    defer sdl.Quit()
    if err := sdl.Init(sdl.INIT_VIDEO); err != nil {
        panic(err)
    }

    window, err := sdl.CreateWindow("SDL Tutorial",
        int32(sdl.WINDOWPOS_UNDEFINED), int32(sdl.WINDOWPOS_UNDEFINED),
        screenWidth, screenHeight, uint32(sdl.WINDOW_SHOWN))
    if err != nil {
        panic(err)
    }
    defer window.Destroy()

    screenSurface, err := window.GetSurface()
    if err != nil {
        panic(err)
    }

    if err = screenSurface.FillRect(nil,
        sdl.MapRGB(screenSurface.Format, 0xff, 0xff, 0xff)); err != nil {
        panic(err)
    }

    if err = window.UpdateSurface(); err != nil {
        panic(err)
    }

    sdl.Delay(2000)
}

第一次运行时,它画了一个空白(白色背景)窗口,但每次之后,它都画了一个透明窗口,显示在它后面运行的桌面窗口。

我不确定我做错了什么。

我在Ubuntu 17.10上的KDE窗口管理器上运行Go 1.10,如果它有任何区别。

更新

当我运行XFCE而不是KDE时,问题是

1 个答案:

答案 0 :(得分:1)

添加事件循环并无条件地重绘或在窗口管理器(SDL_WINDOWEVENT)询问时重绘。您不能只绘制一次并希望事物保持在屏幕上,甚至可以看到(例如,您的抽奖发生在窗口管理器准备好显示窗口之前),尤其是合成窗口管理器。