现在开始创建一个窗口,首先创建一个文件夹,比如文件夹名称为g3d,并使用vscode打开,打开vscode的终端(左下角):
在终端输入:go mod init g3d 初始化一下,然后将我们下载的SDL2-2.0.22-win32-x64.zip压缩包内的SDL2.dll解压放到我们创建的g3d文件夹内即可,至此初始化项目完成。
01.创建文件夹engine,并在文件夹内创建game文件夹,创建一个game.go文件,并创建一个main.go文件,具体如下图:
各个文件的代码如下:
game.go:
package engine
import (
SDL "github.com/veandco/go-sdl2/sdl"
)
type Game struct {
MWindow *SDL.Window
MRenderer *SDL.Renderer
MIsRunning bool
}
//初始化引擎
func (g *Game) Initialize() bool {
var err error
//初始化SDL
if err = SDL.Init(SDL.INIT_VIDEO); err != nil {
SDL.Log("Unable to initialize SDL: %s", SDL.GetError())
return false
}
//创建窗口
if g.MWindow, err = SDL.CreateWindow(
"golang游戏引擎(创建一个窗口)",
100,
100,
1024,
768,
0,
); err != nil {
SDL.Log("Failed to create window: %s", SDL.GetError())
return false
}
//创建渲染
if g.MRenderer, err = SDL.CreateRenderer(
g.MWindow,
-1,
SDL.RENDERER_ACCELERATED|SDL.RENDERER_PRESENTVSYNC,
); err != nil {
SDL.Log("Failed to create renderer: %s", SDL.GetError())
return false
}
//保持运行
g.MIsRunning = true
return true
}
//引擎循环
func (g *Game) RunLoop() {
for {
g.ProcessInput()
g.UpdateGame()
g.GenerateOutput()
if !g.MIsRunning {
break
}
}
}
func (g *Game) ProcessInput() {
var event SDL.Event
for {
if event = SDL.PollEvent(); event == nil {
break
} else {
switch event.GetType() {
case SDL.QUIT: //窗口关闭退出
g.MIsRunning = false
}
}
}
//获取所有按键状态
state := SDL.GetKeyboardState()
//按下ESC退出
if state[SDL.SCANCODE_ESCAPE] == 1 {
g.MIsRunning = false
}
}
func (g *Game) UpdateGame() {
}
func (g *Game) GenerateOutput() {
//背景颜色
g.MRenderer.SetDrawColor(
0, // R
0, // G
255, // B
255, // A
)
g.MRenderer.Clear() //清屏
g.MRenderer.Present() //交换缓冲区
}
//引擎销毁
func (g *Game) Shutdown() {
g.MRenderer.Destroy()
g.MWindow.Destroy()
SDL.Quit()
}
main.go:
package main
import engine "g3d/engine/game"
func main() {
var game engine.Game
if game.Initialize(){
game.RunLoop()
}
game.Shutdown()
}
代码输入完成之后在终端输入:go mod tidy 来安装依赖(golang记得配置代理,否则可能下载不成功),然后输入go run . 来运行我们即可得到一个蓝色的窗口: