GoでWindowsゲーム開発?
GoからDXライブラリを使うのを試してみる。
※DXライブラリ
http://dxlib.o.oo7.jp/
「とりあえずやってみた」レベルで、Goに適した作りになっているとかそういったアレは全くありません。
ソース
ビルド
go get golang.org/x/text/encoding/japanese
go build
結果
画像を読み込んで動かしているだけです。
メインループ
このような雰囲気。
dxlib.DxLib_Init()
dxlib.SetDrawScreen(-2)
for {
if dxlib.ProcessMessage() != 0 {
break
}
dxlib.ClearDrawScreen()
// something...
dxlib.ScreenFlip()
}
dxlib.DxLib_End()
DxLib関数へのアクセス
DxLib.dllを使います。
var (
mod = syscall.NewLazyDLL("DxLib.dll")
dx_DxLib_Init = mod.NewProc("dx_DxLib_Init")
dx_DxLib_End = mod.NewProc("dx_DxLib_End")
dx_SetWindowText = mod.NewProc("dx_SetWindowText")
//
// ...
//
)
func DxLib_Init() int {
var r, _, _ = dx_DxLib_Init.Call()
return int(r)
}
func DxLib_End() int {
var r, _, _ = dx_DxLib_End.Call()
return int(r)
}
func SetWindowText(newTitle string) int {
var r, _, _ = dx_SetWindowText.Call(pstr(newTitle))
return int(r)
}
pstrはとりあえず作った便利関数。
func convertStringToCp932(str string) string {
r, _, err := transform.String(japanese.ShiftJIS.NewEncoder(), str)
if err != nil {
panic(err)
}
return r
}
func pstr(str string) uintptr {
cp932str := syscall.StringBytePtr(convertStringToCp932(str))
return uintptr(unsafe.Pointer(cp932str))
}
これで、DxLib_Init、DxLib_End、SetWindowTextが普通に呼べるようになりました。あとはこれの積み重ねでいける?
サンプルソースでは、以下の関数を使えるようにしてあります。
- dx_ChangeWindowMode
- dx_DxLib_Init
- dx_DxLib_End
- dx_ProcessMessage
- dx_SetWindowText
- dx_DrawCircle
- dx_LoadGraph
- dx_DrawGraph
- dx_DrawExtendGraph
- dx_WaitTimer
- dx_ScreenFlip
- dx_SetDrawScreen
- dx_ClearDrawScreen