SlideShare a Scribd company logo
1 of 15
Download to read offline
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
<?php
function 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);
}
?>
今日はPHPでchannelを利
用する方法は説明しません
goでゲームを作るためのライブラリ

描画

 SDL系: go-sdl / gosdl

 OpenGL系: gl / GoGL

音: portaudio-go / go-openal / pulsego など

入力はSDL系は標準でできる。OpenGL系では Go-
GLUT / glfw などを使える。
独断と偏見

GoGL   https://github.com/chsc/GoGL


go-glfw   https://github.com/go-gl/glfw


この組み合わせがよさそう
SUPER HEXAGON
http://superhexagon.com/

デモ動画

 http://www.youtube.com/&v=2sz0mI_6tLQ

これを題材にゲームを作ってみる
What you ll get
初期化
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" })
}
ウィンドウを生成
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)
     ...
ゲーム処理本体
func launch(game Game) {
   ...

!   if err := gl.Init(); err != nil {
        showError(err)OpenGLコンテキストを生成
        return
!   }

    if err := gameMain(game); err != nil {
        showError(err)
        return
    }
}
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
                                   }
                               })
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が返る
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)

        {
まとめと課題
Goでゲームは作れる

 http://github.com/moriyoshi/gohex

defer便利

画面の更新は同期的に行う必要があるのでGoroutine
などの活用がむずかしい

More Related Content

What's hot

【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスターUnity Technologies Japan K.K.
 
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLMedia Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLAtsushi Tadokoro
 
iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!cocopon
 
How to make Inn-fighting dice
How to make Inn-fighting diceHow to make Inn-fighting dice
How to make Inn-fighting diceMasujima Ryohei
 
Coma studyroom
Coma studyroomComa studyroom
Coma studyroomCohei Aoki
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話Moriyoshi Koizumi
 
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
メディア・アートII  第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーションメディア・アートII  第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーションAtsushi Tadokoro
 
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろうUnity Technologies Japan K.K.
 
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!amusementcreators
 
テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」technocat
 
【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しようUnity Technologies Japan K.K.
 
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習BopenFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習BAtsushi Tadokoro
 
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計UnityTechnologiesJapan002
 
㉑CSSでアニメーション!その2
㉑CSSでアニメーション!その2㉑CSSでアニメーション!その2
㉑CSSでアニメーション!その2Nishida Kansuke
 
Interactive Music II Processingによるアニメーション
Interactive Music II ProcessingによるアニメーションInteractive Music II Processingによるアニメーション
Interactive Music II ProcessingによるアニメーションAtsushi Tadokoro
 

What's hot (20)

【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター
 
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLMedia Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
 
iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!iOSプログラマへ。HTML5 Canvasがおもしろい!
iOSプログラマへ。HTML5 Canvasがおもしろい!
 
How to make Inn-fighting dice
How to make Inn-fighting diceHow to make Inn-fighting dice
How to make Inn-fighting dice
 
CG2013 07
CG2013 07CG2013 07
CG2013 07
 
Coma studyroom
Coma studyroomComa studyroom
Coma studyroom
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話
 
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
メディア・アートII  第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーションメディア・アートII  第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
 
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう
 
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!
 
テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」
 
【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう
 
コルーチンを使おう
コルーチンを使おうコルーチンを使おう
コルーチンを使おう
 
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習BopenFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
 
CG2013 03
CG2013 03CG2013 03
CG2013 03
 
enchant.js勉強会
enchant.js勉強会enchant.js勉強会
enchant.js勉強会
 
python-geohex
python-geohexpython-geohex
python-geohex
 
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
 
㉑CSSでアニメーション!その2
㉑CSSでアニメーション!その2㉑CSSでアニメーション!その2
㉑CSSでアニメーション!その2
 
Interactive Music II Processingによるアニメーション
Interactive Music II ProcessingによるアニメーションInteractive Music II Processingによるアニメーション
Interactive Music II Processingによるアニメーション
 

Similar to Gocon2013

Android OpenGL HandsOn
Android OpenGL HandsOnAndroid OpenGL HandsOn
Android OpenGL HandsOnIkuo Tansho
 
2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2dHiroshi Oyamada
 
Common LispでGPGPU
Common LispでGPGPUCommon LispでGPGPU
Common LispでGPGPUgos-k
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜勝成 鈴江
 
coma Creators session vol.2
coma Creators session vol.2coma Creators session vol.2
coma Creators session vol.2Atsushi Tadokoro
 
EmacsとGlossでお絵描きしてみるよ
EmacsとGlossでお絵描きしてみるよEmacsとGlossでお絵描きしてみるよ
EmacsとGlossでお絵描きしてみるよKiwamu Okabe
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Yuki Higuchi
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Uehara Junji
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)Yoichi Nakayama
 
ソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグToru Tamaki
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化翔新 史
 
怪しいWindowsプログラミング
怪しいWindowsプログラミング怪しいWindowsプログラミング
怪しいWindowsプログラミングnagoya313
 
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョンenchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョンRyota Shiroguchi
 
Media Art II 2013 第5回:openFrameworks Addonを使用する
Media Art II 2013 第5回:openFrameworks Addonを使用するMedia Art II 2013 第5回:openFrameworks Addonを使用する
Media Art II 2013 第5回:openFrameworks Addonを使用するAtsushi Tadokoro
 

Similar to Gocon2013 (20)

Android OpenGL HandsOn
Android OpenGL HandsOnAndroid OpenGL HandsOn
Android OpenGL HandsOn
 
2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d
 
Common LispでGPGPU
Common LispでGPGPUCommon LispでGPGPU
Common LispでGPGPU
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
 
coma Creators session vol.2
coma Creators session vol.2coma Creators session vol.2
coma Creators session vol.2
 
FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化
 
EmacsとGlossでお絵描きしてみるよ
EmacsとGlossでお絵描きしてみるよEmacsとGlossでお絵描きしてみるよ
EmacsとGlossでお絵描きしてみるよ
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Bluespec @waseda(PDF)
Bluespec @waseda(PDF)Bluespec @waseda(PDF)
Bluespec @waseda(PDF)
 
Clojure
ClojureClojure
Clojure
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
 
ソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグ
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
 
怪しいWindowsプログラミング
怪しいWindowsプログラミング怪しいWindowsプログラミング
怪しいWindowsプログラミング
 
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョンenchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
 
Media Art II 2013 第5回:openFrameworks Addonを使用する
Media Art II 2013 第5回:openFrameworks Addonを使用するMedia Art II 2013 第5回:openFrameworks Addonを使用する
Media Art II 2013 第5回:openFrameworks Addonを使用する
 

More from Moriyoshi Koizumi

Authentication, Authorization, OAuth, OpenID Connect and Pyramid
Authentication, Authorization, OAuth, OpenID Connect and PyramidAuthentication, Authorization, OAuth, OpenID Connect and Pyramid
Authentication, Authorization, OAuth, OpenID Connect and PyramidMoriyoshi Koizumi
 
All I know about rsc.io/c2go
All I know about rsc.io/c2goAll I know about rsc.io/c2go
All I know about rsc.io/c2goMoriyoshi Koizumi
 
HLSについて知っていることを話します
HLSについて知っていることを話しますHLSについて知っていることを話します
HLSについて知っていることを話しますMoriyoshi Koizumi
 
Pyramidのrendererをカスタマイズする
PyramidのrendererをカスタマイズするPyramidのrendererをカスタマイズする
PyramidのrendererをカスタマイズするMoriyoshi Koizumi
 
Hacking Go Compiler Internals / GoCon 2014 Autumn
Hacking Go Compiler Internals / GoCon 2014 AutumnHacking Go Compiler Internals / GoCon 2014 Autumn
Hacking Go Compiler Internals / GoCon 2014 AutumnMoriyoshi Koizumi
 
よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれたよいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれたMoriyoshi Koizumi
 
mod_himoteからはじめよう
mod_himoteからはじめようmod_himoteからはじめよう
mod_himoteからはじめようMoriyoshi Koizumi
 
HPHPは約束の地なのか
HPHPは約束の地なのかHPHPは約束の地なのか
HPHPは約束の地なのかMoriyoshi Koizumi
 
Phjosh(仮)プロジェクト
Phjosh(仮)プロジェクトPhjosh(仮)プロジェクト
Phjosh(仮)プロジェクトMoriyoshi Koizumi
 
LLの虎 semifinal: 殺伐Python
LLの虎 semifinal: 殺伐PythonLLの虎 semifinal: 殺伐Python
LLの虎 semifinal: 殺伐PythonMoriyoshi Koizumi
 

More from Moriyoshi Koizumi (20)

PHP7を魔改造した話
PHP7を魔改造した話PHP7を魔改造した話
PHP7を魔改造した話
 
Authentication, Authorization, OAuth, OpenID Connect and Pyramid
Authentication, Authorization, OAuth, OpenID Connect and PyramidAuthentication, Authorization, OAuth, OpenID Connect and Pyramid
Authentication, Authorization, OAuth, OpenID Connect and Pyramid
 
All I know about rsc.io/c2go
All I know about rsc.io/c2goAll I know about rsc.io/c2go
All I know about rsc.io/c2go
 
HLSについて知っていることを話します
HLSについて知っていることを話しますHLSについて知っていることを話します
HLSについて知っていることを話します
 
Pyramidのrendererをカスタマイズする
PyramidのrendererをカスタマイズするPyramidのrendererをカスタマイズする
Pyramidのrendererをカスタマイズする
 
Hacking Go Compiler Internals / GoCon 2014 Autumn
Hacking Go Compiler Internals / GoCon 2014 AutumnHacking Go Compiler Internals / GoCon 2014 Autumn
Hacking Go Compiler Internals / GoCon 2014 Autumn
 
Uguisudani
UguisudaniUguisudani
Uguisudani
 
よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれたよいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれた
 
Ik in action
Ik in actionIk in action
Ik in action
 
Nginx lua
Nginx luaNginx lua
Nginx lua
 
Haxeについて
HaxeについてHaxeについて
Haxeについて
 
PHP language update 201211
PHP language update 201211PHP language update 201211
PHP language update 201211
 
mod_himoteからはじめよう
mod_himoteからはじめようmod_himoteからはじめよう
mod_himoteからはじめよう
 
HPHPは約束の地なのか
HPHPは約束の地なのかHPHPは約束の地なのか
HPHPは約束の地なのか
 
Pyfes201110
Pyfes201110Pyfes201110
Pyfes201110
 
Phjosh(仮)プロジェクト
Phjosh(仮)プロジェクトPhjosh(仮)プロジェクト
Phjosh(仮)プロジェクト
 
Aaなゲームをjsで
AaなゲームをjsでAaなゲームをjsで
Aaなゲームをjsで
 
Aaなゲームをjsで
AaなゲームをjsでAaなゲームをjsで
Aaなゲームをjsで
 
ctypes拡張モジュール
ctypes拡張モジュールctypes拡張モジュール
ctypes拡張モジュール
 
LLの虎 semifinal: 殺伐Python
LLの虎 semifinal: 殺伐PythonLLの虎 semifinal: 殺伐Python
LLの虎 semifinal: 殺伐Python
 

Gocon2013

  • 1. Goでゲームを つ ろ く う 小泉 守義 <moriyoshi@php.net>
  • 2. 自己紹介 moriyoshi@php.net ~/src/go$ grep -n 'Moriyoshi' CONTRIBUTORS $ php -r 'phpcredits();' | grep 'Moriyoshi' 趣味は処理系の魔改造です
  • 3. http://d.hatena.ne.jp/moriyoshi/20091114/1258204128 <?php function 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); } ?>
  • 5. goでゲームを作るためのライブラリ 描画 SDL系: go-sdl / gosdl OpenGL系: gl / GoGL 音: portaudio-go / go-openal / pulsego など 入力はSDL系は標準でできる。OpenGL系では Go- GLUT / glfw などを使える。
  • 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) {