More Related Content
Similar to Gocon2013 (20)
More from Moriyoshi Koizumi
More from Moriyoshi Koizumi (20)
Gocon2013
- 6. 独断と偏見
GoGL https://github.com/chsc/GoGL
go-glfw https://github.com/go-gl/glfw
この組み合わせがよさそう
- 9. 初期化
package main
import (
! gl "github.com/chsc/gogl/gl21"
! "github.com/jteeuwen/glfw"
}
...
func main() {
! if err := glfw.Init(); err != nil {
! ! showError(err) glfwを初期化
! ! return
! }
! defer glfw.Terminate()
glfwの後始末
! launch(Game{ 640, 480, "HexaGOn" })
}
- 10. ウィンドウを生成
func launch(game Game) {
! glfw.OpenWindowHint(glfw.WindowNoResize, 1)
ウィンドウを生成
! if err := glfw.OpenWindow(game.width, game.height, 0, 0, 0,
0, 16, 0, glfw.Windowed); err != nil {
! ! showError(err)
! ! return
! }
! defer glfw.CloseWindow()
! glfw.SetWindowTitle(game.title)
...
- 11. ゲーム処理本体
func launch(game Game) {
...
! if err := gl.Init(); err != nil {
showError(err)OpenGLコンテキストを生成
return
! }
if err := gameMain(game); err != nil {
showError(err)
return
}
}
- 12. gameMain
func gameMain(game Game) error {
! if err := initScene(game); err != nil {
! ! return err
! }
! defer destroyScene()
...
game.Run(func () {
drawScene() game.Run(func () {
... drawScene()
}) ...
メインループの中身
return nil if (game.KeyPressed('Z')) {
} myPosition += .06
}
if (game.KeyPressed('X')) {
myPosition -= .06
}
})
- 13. game.Run
func (game Game) Run(f func()) {
! for glfw.WindowParam(glfw.Opened) == 1 {
! ! f() ウィンドウが開かれている間は1
! ! glfw.SwapBuffers()
! } フレームバッファを入れ替え
}
game.KeyPress
func (game Game) KeyPressed(key int) bool {
return glfw.Key(key) == glfw.KeyPress
} 該当キーの押下があった場合 glfw.KeyPressが返る
- 14. initScene / destroyScene / drawScene
package main
import ( 1フレーム分の描画処理
"math"
"math/rand"
)
gl "github.com/chsc/gogl/gl21"
func drawScene() {
type Wall struct {
segment int
! gl.Clear(gl.COLOR_BUFFER_BIT |
position float64
width float64 gl.DEPTH_BUFFER_BIT)
}
var (
rotz
rotSpeed
float64
float64
bgdivision int
= math.Pi * 0.02
= 6
! gl.MatrixMode(gl.MODELVIEW)
bgcolor
bgradius
[]gl.Float = []gl.Float{1, 1, 0}
float64 = 20 ! gl.LoadIdentity()
hexradius float64 = .5
perturbation float64
walls []Wall
= .04
= nil
! gl.Rotatef(gl.Float(rotz), 0, 0,
pog float64
myPosition float64
= 0.
= 0. 1)
myDistance float64 = .1
)
! gl.Translatef(0, 0, gl.Float(-3. +
func initScene(game Game) (err error) {
gl.Enable(gl.TEXTURE_2D)
gl.Enable(gl.DEPTH_TEST)
rand.Float64() * perturbation))
gl.ClearColor(0., 0., 0., 0.)
gl.ClearDepth(1)
gl.DepthFunc(gl.LEQUAL)
! rotz += rotSpeed * 180 / math.Pi
gl.Viewport(0, 0, gl.Sizei(game.width), gl.Sizei(game.height))
gl.MatrixMode(gl.PROJECTION)
gl.LoadIdentity()
pog += .02
gl.Frustum(-1, 1, -1, 1, 1.0, 10.0)
gl.MatrixMode(gl.MODELVIEW)
gl.LoadIdentity()
return
drawBackground()
何もGoらしいことは
}
func destroyScene() {
drawCentralHexagon()
}
drawWalls()
func drawBackground() {
! gl.Begin(gl.TRIANGLES)
defer gl.End()
drawMyTriangle()
}
ありません
for i := 0; i < bgdivision; i += 1 {
x1, y1 := gl.Float(math.Cos(float64(i) * math.Pi * 2 / float64(bgdivision)) * bgradius),
gl.Float(math.Sin(float64(i) * math.Pi * 2 / float64(bgdivision)) * bgradius)
x2, y2 := gl.Float(math.Cos(float64(i + 1) * math.Pi * 2/ float64(bgdivision)) * bgradius),
gl.Float(math.Sin(float64(i + 1) * math.Pi * 2 / float64(bgdivision)) * bgradius)
{