投稿日: Feb 09, 2018 8:42:16 AM
ウィンドウが表示できて、なにやらのグラフィックが描画できて、ウィンドウを閉じるとプログラムが終わるというアプリケーションの基本をとりあえずやってみたい。
ウィンドウを閉じるとプログラムが終わるって当たり前だと思ってる人も多そうだけどあれはそういうプログラムを書いてるからそう動くのであって 云々。まあそんなことはどうでも良いとしてやってみます。
その前に。
本当にgolangに明るく無いので気づいたことを。
a := 0
とかいうのはaという変数を初期化して0を代入します。という動きになるらしい。
var a
a := 0
とかやるとエラーになる。aは初期化済みなので。
var a
a = 0
これはオーケー。
ちょっと馴染みの無い感じの動きなのでメモ。参考になる書籍が欲しいぜベイベ。
package main
import (
"os"
"github.com/veandco/go-sdl2/sdl"
)
func main(){
os.Exit(run())
}
func run int {
var window *sdl.Window
var event sdl.Event
var running bool
var err error
sdl.Init(sdl.INIT_EVERYTHING)
defer sdl.Quit()
window, err = sdl.CreateWindow(
"test", sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED, 600, 400,sdl.WINDOW_SHOWN)
if err != nil {
panic(err)
}
defer window.Destroy()
surface, err := window.GetSurface()
if err != nil {
panic(err)
}
rect := sdl.Rect{100,100,400,200}
surface.FillRect(&rect,0xffff0000)
window.UpdateSurface()
running = true
for running {
for event = sdl.PollEvent(); event != nil; event = sdl.PollEvent(){
switch event.(type) {
case *sdl.QuitEvent:
running = false
}
}
}
return 0
}
forとかの関数の戻り値の書式に馴染みが無い。
いちいちセミコロンつけなくていいのは気持ち良いきがする。
とりあえずwindowつくりますー、windowのsurfaceを取得しますー、surfaceに描画しますーのwindowをアップデートします。
ってことで何か表示するにはこのsurfaceがキモになるっぽいね?
で、イベントはPollEventでイベントゲットしてまあ様々なイベントに対しての処理をswitchでかいてやると。
とりあえずのウィンドウ閉じると終わるっていうのはこいつかなーって、*sdl.QuitEvent のひとつだけかいてある。
実行するとこうなる。
ばっちり! と言いたい所だけど、そうでもなく。
うすうす感じていたんだけど、ウィンドウが重なったり、画面の外に出た場合、サーフェイスの再描画が必要になるっぽい。
Javaのawtなんかもupdateメソッドとかでpaint呼び出して再描画していたまさにあれ。
とはいうものの、SDL2ってゲームとかのためのライブラリなので、再描画っていうよりは毎フレーム画面描いちゃった方が手っ取り早かったりするのかもね。
サーフェイスを持ち回り出来るような書き方をした方がいいのかな。
あとはFPS管理ですか。
今は無条件にループぐりぐりしてるけども、これを時間管理しないとゲームにならない。
というあたりを探ってみましょう。