- Notifications
You must be signed in to change notification settings - Fork229
veandco/go-sdl2
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
For SDL3, please checkhttps://github.com/JupiterRider/purego-sdl3 which doesn't require cgo and uses codegen!
go-sdl2
is SDL2 wrapped for Go users. It enables interoperability between Go and the SDL2 library which is written in C. That means the original SDL2 installation is required for this to work. Note that the first build may take several minutes on machines that are not powerful such as Raspberry Pi.
NOTE: For the latest versions of SDL2, please use themaster
branch!
If you haven't created a Go module for your program, you can do it by making a directory called, for example,app
and running the following command inside it:
go mod init app
After that you can start writing code that usesgo-sdl2
, for example, like the following:
// main.gopackage mainimport ("github.com/veandco/go-sdl2/sdl")funcmain() {sdl.Init(sdl.INIT_EVERYTHING)}
Then to tell Go to fetch dependencies, you can run:
go mod tidy
and then the program can be built using:
go build
After that, you can execute your program:
./app
OnUbuntu 22.04 and above, type:apt install libsdl2{,-image,-mixer,-ttf,-gfx}-dev
OnFedora 36 and above, type:dnf install SDL2{,_image,_mixer,_ttf,_gfx}-devel
OnArch Linux, type:pacman -S sdl2{,_image,_mixer,_ttf,_gfx}
OnGentoo, type:emerge -av libsdl2 sdl2-{image,mixer,ttf,gfx}
OnmacOS, install SDL2 viaHomebrew like so:brew install sdl2{,_image,_mixer,_ttf,_gfx} pkg-config
OnWindows,
- Install mingw-w64 fromMingw-builds. A 7z archive extractor software might be needed which can be downloadedhere. In this example, we extract the content, which is
mingw64
, intoC:\
. - Download and install
SDL2-devel-[version]-mingw.zip
files fromhttps://github.com/libsdl-org/SDL/releases.- Extract the SDL2 folder from the archive using a tool like7zip
- Inside the extracted SDL2 folder, copy the
i686-w64-mingw32
and/orx86_64-w64-mingw32
into mingw64 folder e.g.C:\mingw64
- Setup
Path
environment variable- Put mingw-w64 binaries location into system
Path
environment variable (e.g.C:\mingw64\bin
)
- Put mingw-w64 binaries location into system
- Close and open terminal again so the new
Path
environment variable takes effect. Now we should be able to rungo build
inside the project directory. - Download and install SDL2 runtime libraries fromhttps://github.com/libsdl-org/SDL/releases. Extract and copy the
.dll
file into the project directory. After that, the program should become runnable. - (Optional) You can repeatStep 2 forSDL_image,SDL_mixer,SDL_ttf
To get the bindings, type:go get -v github.com/veandco/go-sdl2/sdl
go get -v github.com/veandco/go-sdl2/img
go get -v github.com/veandco/go-sdl2/mix
go get -v github.com/veandco/go-sdl2/ttf
go get -v github.com/veandco/go-sdl2/gfx
or type this if you use Bash terminal:go get -v github.com/veandco/go-sdl2/{sdl,img,mix,ttf}
Due togo-sdl2
being under active development, a lot of breaking changes are going to happen during v0.x. Withversioning system coming to Go soon, we'll make use of semantic versioning to ensure stability in the future.
Since v0.3.0, it is possible to build statically against included libraries in.go-sdl2-libs
. To build statically, run:
CGO_ENABLED=1 CC=gcc GOOS=linux GOARCH=amd64 go build -tags static -ldflags "-s -w"
You can also cross-compile to another OS. For example, to Windows:
CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc GOOS=windows GOARCH=amd64 go build -tags static -ldflags "-s -w"
On Windows, if you would like to hide the Command Prompt window when running the statically-compiled program, you could append-H windowsgui
to the-ldflags
value.
For the list of OS and architecture, you can see inside the.go-sdl2-libs directory.
NOTE: If you're using the new Go Module system, you will need to refer to the master branch for now by running:
go get -v github.com/veandco/go-sdl2/sdl@master
Before building the program.
- Install MinGW toolchain.
- OnArch Linux, it's simply
pacman -S mingw-w64
.
- OnArch Linux, it's simply
- Download the SDL2 development package for MinGWhere (and the others likeSDL_image,SDL_mixer, etc..here if you use them).
- Extract the SDL2 development package and copy the
x86_64-w64-mingw32
folder inside recursively to the system's MinGWx86_64-w64-mingw32
folder. You may also do the same for thei686-w64-mingw32
folder.- OnArch Linux, it's
cp -r x86_64-w64-mingw32 /usr
.
- OnArch Linux, it's
- Now you can start cross-compiling your Go program by running
env CGO_ENABLED="1" CC="/usr/bin/x86_64-w64-mingw32-gcc" GOOS="windows" CGO_LDFLAGS="-lmingw32 -lSDL2" CGO_CFLAGS="-D_REENTRANT" go build -x main.go
. You can change some of the parameters if you'd like to. In this example, it should produce amain.exe
executable file. - Before running the program, you need to put
SDL2.dll
from theSDL2 runtime package (For others likeSDL_image,SDL_mixer, etc.., look for themhere) for Windows in the same folder as your executable. - Now you should be able to run the program using Wine or Windows!
- InstallHomebrew
- Install MinGW through Homebrew via
brew install mingw-w64
- Download the SDL2 development package for MinGWhere (and the others likeSDL_image,SDL_mixer, etc..here if you use them).
- Extract the SDL2 development package and copy the
x86_64-w64-mingw
folder inside recursively to the system's MinGWx86_64-w64-mingw32 folder
. You may also do the same for thei686-w64-mingw32
folder. The path to MinGW may be slightly different but the command should look something likecp -r x86_64-w64-mingw32 /usr/local/Cellar/mingw-w64/5.0.3/toolchain-x86_64
. - Now you can start cross-compiling your Go program by running
env CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc GOOS=windows CGO_LDFLAGS="-L/usr/local/Cellar/mingw-w64/5.0.3/toolchain-x86_64/x86_64-w64-mingw32/lib -lSDL2" CGO_CFLAGS="-I/usr/local/Cellar/mingw-w64/5.0.3/toolchain-x86_64/x86_64-w64-mingw32/include -D_REENTRANT" go build -x main.go
. You can change some of the parameters if you'd like to. In this example, it should produce amain.exe
executable file. - Before running the program, you need to put
SDL2.dll
from theSDL2 runtime package (For others likeSDL_image,SDL_mixer, etc.., look for themhere) for Windows in the same folder as your executable. - Now you should be able to run the program using Wine or Windows!
- Install macOS toolchain viaosxcross
- Run the following build command (replace the values in parentheses):
CGO_ENABLED=1 CC=[path-to-osxcross]/target/bin/[arch]-apple-darwin[version]-clang GOOS=darwin GOARCH=[arch] go build -tags static -ldflags "-s -w" -a
NOTE: The following example is for themaster
branch. Please check theREADME ofv0.4.x
for the stable version.
package mainimport"github.com/veandco/go-sdl2/sdl"funcmain() {iferr:=sdl.Init(sdl.INIT_EVERYTHING);err!=nil {panic(err)}defersdl.Quit()window,err:=sdl.CreateWindow("test",sdl.WINDOWPOS_UNDEFINED,sdl.WINDOWPOS_UNDEFINED,800,600,sdl.WINDOW_SHOWN)iferr!=nil {panic(err)}deferwindow.Destroy()surface,err:=window.GetSurface()iferr!=nil {panic(err)}surface.FillRect(nil,0)rect:= sdl.Rect{0,0,200,200}colour:= sdl.Color{R:255,G:0,B:255,A:255}// purplepixel:=sdl.MapRGBA(surface.Format,colour.R,colour.G,colour.B,colour.A)surface.FillRect(&rect,pixel)window.UpdateSurface()running:=trueforrunning {forevent:=sdl.PollEvent();event!=nil;event=sdl.PollEvent() {switchevent.(type) {case sdl.QuitEvent:// NOTE: Please use `*sdl.QuitEvent` for `v0.4.x` (current version).println("Quit")running=falsebreak}}sdl.Delay(33)}}
There are two ways a game might be running: one that updates on user input usingsdl.WaitEvent()
and one that updates regardless of user input usingsdl.PollEvent()
. You can check the examples of those two loopshere.
For more runnable examples, seehttps://github.com/veandco/go-sdl2-examples. You can run any of the.go
files withgo run
.
Why does the program not run on Windows?Try putting theruntime libraries (e.g.SDL2.dll
and friends) in the same folder as your program.
Why does my program crash randomly or hang?Puttingruntime.LockOSThread()
at the start of your main() usually solves the problem (seeSDL2 FAQ about multi-threading).
UPDATE: Recent update added a call queue system where you can put thread-sensitive code and have it called synchronously on the same OS thread. See therender_queue
orrender_goroutines
examples fromhttps://github.com/veandco/go-sdl2-examples to see how it works.
Why can't SDL_mixer seem to play MP3 audio file?Your installed SDL_mixer probably doesn't support MP3 file.
OnmacOS, this is easy to correct. First remove the faulty mixer:brew remove sdl2_mixer
, then reinstall it with the MP3 option:brew install sdl2_mixer --with-flac --with-fluid-synth --with-libmikmod --with-libmodplug --with-smpeg2
. If necessary, check which options you can enable withbrew info sdl2_mixer
. You could also try installing sdl2_mixer with mpg123 by runningbrew install sdl2_mixer --with-mpg123
.
OnOther Operating Systems, you will need to compile smpeg and SDL_mixer from source with the MP3 option enabled. You can find smpeg in theexternal
directory of SDL_mixer. Refer to issue#148 for instructions.
Note that there seems to be a problem with SDL_mixer 2.0.2 so you can also try to revert back to 2.0.1 and see if it solves your problem
Does go-sdl2 support compiling on mobile platforms like Android and iOS?For Android, seehttps://github.com/veandco/go-sdl2-examples/tree/master/examples/android.
There is currently no support for iOS yet.
Why does my window not immediately render after creation?It appears the rendering subsystem needs some time to be able to present the drawn pixels. This can be workaround by adding delay usingsdl.Delay()
or put the rendering code inside a draw loop.
This project exists thanks to all the people who contribute. [Contribute].
Become a financial contributor and help us sustain our community. [Contribute]
Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]
Go-SDL2 is BSD 3-clause licensed.
About
SDL2 binding for Go