Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Goでゲームをつ ろ く う小泉 守義 <moriyoshi@php.net>
自己紹介moriyoshi@php.net~/src/go$ grep -n Moriyoshi CONTRIBUTORS$ php -r phpcredits(); | grep Moriyoshi趣味は処理系の魔改造です
http://d.hatena.ne.jp/moriyoshi/20091114/1258204128<?phpfunction sub($i, $ch) {    for (;;) {        $a = <- [$ch];       ...
今日はPHPでchannelを利用する方法は説明しません
goでゲームを作るためのライブラリ描画 SDL系: go-sdl / gosdl OpenGL系: gl / GoGL音: portaudio-go / go-openal / pulsego など入力はSDL系は標準でできる。OpenGL系で...
独断と偏見GoGL   https://github.com/chsc/GoGLgo-glfw   https://github.com/go-gl/glfwこの組み合わせがよさそう
SUPER HEXAGONhttp://superhexagon.com/デモ動画 http://www.youtube.com/&v=2sz0mI_6tLQこれを題材にゲームを作ってみる
What you ll get
初期化package mainimport (! gl "github.com/chsc/gogl/gl21"! "github.com/jteeuwen/glfw"}...func main() {! if err := glfw.Init(...
ウィンドウを生成func launch(game Game) {! glfw.OpenWindowHint(glfw.WindowNoResize, 1)                               ウィンドウを生成!    i...
ゲーム処理本体func launch(game Game) {   ...!   if err := gl.Init(); err != nil {        showError(err)OpenGLコンテキストを生成        ret...
gameMainfunc gameMain(game Game) error {! if err := initScene(game); err != nil {! ! return err! }! defer destroyScene()  ...
game.Runfunc (game Game) Run(f func()) {! for glfw.WindowParam(glfw.Opened) == 1 {! ! f()                        ウィンドウが開かれ...
initScene / destroyScene / drawScenepackage mainimport (                                                                  ...
まとめと課題Goでゲームは作れる http://github.com/moriyoshi/gohexdefer便利画面の更新は同期的に行う必要があるのでGoroutineなどの活用がむずかしい
Upcoming SlideShare
Loading in …5
×

Gocon2013

3,289 views

Published on

  • Be the first to comment

Gocon2013

  1. 1. Goでゲームをつ ろ く う小泉 守義 <moriyoshi@php.net>
  2. 2. 自己紹介moriyoshi@php.net~/src/go$ grep -n Moriyoshi CONTRIBUTORS$ php -r phpcredits(); | grep Moriyoshi趣味は処理系の魔改造です
  3. 3. http://d.hatena.ne.jp/moriyoshi/20091114/1258204128<?phpfunction sub($i, $ch) { for (;;) { $a = <- [$ch]; printf("%d:", $i); var_dump($a); }}$ch = thread_message_queue_create();for ($i = 0; $i < 10; $i++) { thread_create(sub, $i, $ch);}$i = 0;for (;;) { [$ch] <- $i++; usleep(50000);}?>
  4. 4. 今日はPHPでchannelを利用する方法は説明しません
  5. 5. goでゲームを作るためのライブラリ描画 SDL系: go-sdl / gosdl OpenGL系: gl / GoGL音: portaudio-go / go-openal / pulsego など入力はSDL系は標準でできる。OpenGL系では Go-GLUT / glfw などを使える。
  6. 6. 独断と偏見GoGL https://github.com/chsc/GoGLgo-glfw https://github.com/go-gl/glfwこの組み合わせがよさそう
  7. 7. SUPER HEXAGONhttp://superhexagon.com/デモ動画 http://www.youtube.com/&v=2sz0mI_6tLQこれを題材にゲームを作ってみる
  8. 8. What you ll get
  9. 9. 初期化package mainimport (! 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. 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. 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. 12. gameMainfunc 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. 13. game.Runfunc (game Game) Run(f func()) {! for glfw.WindowParam(glfw.Opened) == 1 {! ! f() ウィンドウが開かれている間は1! ! glfw.SwapBuffers()! } フレームバッファを入れ替え}game.KeyPressfunc (game Game) KeyPressed(key int) bool { return glfw.Key(key) == glfw.KeyPress} 該当キーの押下があった場合 glfw.KeyPressが返る
  14. 14. initScene / destroyScene / drawScenepackage mainimport ( 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) {
  15. 15. まとめと課題Goでゲームは作れる http://github.com/moriyoshi/gohexdefer便利画面の更新は同期的に行う必要があるのでGoroutineなどの活用がむずかしい

×