我刚刚开始阅读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时,问题是不。
答案 0 :(得分:1)
添加事件循环并无条件地重绘或在窗口管理器(SDL_WINDOWEVENT
)询问时重绘。您不能只绘制一次并希望事物保持在屏幕上,甚至可以看到(例如,您的抽奖发生在窗口管理器准备好显示窗口之前),尤其是合成窗口管理器。