Go
DXライブラリ
DxLib

GoでWindowsゲーム開発(DxLib)メモ

GoでWindowsゲーム開発?

GoからDXライブラリを使うのを試してみる。

※DXライブラリ
http://dxlib.o.oo7.jp/

「とりあえずやってみた」レベルで、Goに適した作りになっているとかそういったアレは全くありません。

ソース

https://github.com/wtetsu/dxlib-go

ビルド

go get golang.org/x/text/encoding/japanese
go build

結果

画像を読み込んで動かしているだけです。

ss02.gif

メインループ

このような雰囲気。

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