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でMinecraftっぽいの作る

15,858 views

Published on

MinecraftっぽいゲームをGoogleのGo言語で作る

Published in: Software
  • Be the first to comment

GoでMinecraftっぽいの作る

  1. 1. Go言語で Minecraftっぽいの gnu
  2. 2. 自己紹介 • ID: gnu (発音: /núː/, /gnúː/ ) • KMC1回生 • 副会長 • KMC的活動 • Unity2014 • あんまし活動できてない…
  3. 3. 目次 • 概要 • Go言語 • OpenGL • 作ったやつ • 質問とか
  4. 4. この講座は? • GoでOpenGL使ってゲーム作れるライブラリ(パッ ケージ)Azul3Dなるものを見つけたので使ってみた • 主な目的はGoに興味を持ってもらうこと • プログラミングやったことない人にこそGoを知って もらいたい
  5. 5. 目次 • 概要 • Go言語 • OpenGL • 作ったやつ • 質問とか
  6. 6. Go言語 • GoはGoogleが開発したプログラミング言語 • システムプログラミングにおける複雑さを解決する ため生まれた • とにかくシンプル • 並列計算、通信を標準サポート
  7. 7. Go使用例 • コンテナ管理ソフトDockerの開発に使われている • 面白法人カヤックが推してる http://www.kayac.com/news/2014/07/golang
  8. 8. Goの基本情報 • コンパイル言語 • 強い静的型付け言語 • ガベージコレクション • C系の構文 • 手続き型 • オブジェクト指向 ※
  9. 9. シンプルすぎるGo言語① • 可読性、コンパイラ単純化のため • クラス • 型の継承 • ジェネリックプログラミング • オーバーロード • を廃止
  10. 10. シンプルすぎるGo言語② • 予約語が少ない break case chan const continue default defer else fallthrough for func go goto if import interface map package range return select struct switch type var
  11. 11. 予約語の数 • 十進basic 18 • Go 25 • python3 33 • ruby 40 • C 44 • Java 50 • swift 61 • C++ 86
  12. 12. Goの実行ファイル • Goで作った実行ファイル(.exe, .app等)はランタイム がいらない • コンパイルするOSと別のOS用の実行ファイルを生 成できる(クロスコンパイル) • →実行ファイルの配布がめちゃ簡単
  13. 13. Goの型宣言 • CとGoの見た目に分かりやすい違い // Cの変数宣言 int 変数名 = 100 // Goの変数宣言 var 変数名 int = 200
  14. 14. Goの型宣言 • より直観的にわかりやすくなる // Goで2つの変数を同時に宣言 var a, b *int // a,bともにintポインタ型 // Cで同じことをしようとすると int *a, *b // int* a, b ではaのみポインタ
  15. 15. 複数戻り値 • Goでは複数の値を戻り値に指定できる file, err := os.Open(“foo.txt”) • := は変数初期化の略記法(型推論)
  16. 16. エラーハンドリング • これによりエラー処理が分かりやすく file, err := os.Open(“foo.txt”) if err != nil { // エラー処理を書く }
  17. 17. defer文 • deferで指定した関数をreturnする時に実行 file, err := os.Open(“foo.txt”) if err != nil { // エラー処理を書く } defer file.Close() // 全ての処理の後実行 // fileを使った処理を書く
  18. 18. try-catch-finallyに比べて • ネストが深まらず見やすい • エラー処理や必須処理を処理本体の近くにまとめ て書ける
  19. 19. 処理内容1 if err != nil { エラー処理1 } defer 必ずする処理1 … 処理内容2 if err != nil { エラー処理2 } defer 必ずする処理2 … try{ 処理内容1 処理内容2 … }catch(エラーA){ エラー処理A }catch(エラーB){ エラー処理B }… … }finally{ 必ずする処理1 必ずする処理2 … }
  20. 20. 並列処理 • シンプル、直観的にわかる go someFunc() // 関数someFunc()を並列実行 • これだけで別スレッド(Goルーチン)が立ち上がる • Goルーチンはかなり軽量なので同時に数十万個 立っていてもへっちゃら
  21. 21. チャネル • スレッド間の情報のやりとりに使う ch := make(chan string) go func(){ // 関数を定義と同時に実行 time.Sleep(time.Second) // 1秒待機 ch <- “hoge” // chに送信 }() // 紫色の部分が分岐し並列実行される str := <- ch // chから受信するまで待機 fmt.Println(str) // “hoge”を表示
  22. 22. WaitGroup • スレッド間でタイミングを合わせるのに使う • Add(int)…処理中スレッドの数を増やす • 自分の処理が終わるまで他スレッドに待ってほしい時 • Done()…処理中スレッドの数を減らす • 自分の処理が終了した時呼び出す • Wait()…処理中スレッドの数が0になるまで待つ • 全ての処理が終わるまで待機
  23. 23. その他 • 他言語でもおなじみのMutexなど • ただしGo開発チームはより抽象性の高い、理解の しやすい非同期処理を使うよう勧めている • 標準パッケージ”sync”にまとまっている
  24. 24. インターフェース • Goの開発者もお気に入り、Goを強く特徴付ける機 能 • 強力な抽象化によりスクリプト言語のような手軽さ をもたらす • Javaなどのインターフェイスとはいろいろ違う
  25. 25. インターフェース • 特定のタイプのメソッドを持つ型をグループ化して 同じように扱えるようにする • どういうことかというと…
  26. 26. インターフェースの宣言 type walker interface{ walk() int // 引数なし、int型を返す関数walk() } • メソッド walk() を持つ型をグループ化 • walk()を持つ限りどんな型でもwalker型の変数に 代入できる • walker型を引数に取る関数にもわたせる
  27. 27. 何が嬉しいか • どんなことをしたいか(どのようなメソッドが必要か) に合わせてインターフェースを先に作っておく • あとで仕様を変更してもインターフェースが違いを 吸収してくれる • コンパイル時にきちんとチェックしてくれるので間 違った型を入れてしまうこともない
  28. 28. 目次 • 概要 • Go言語 • OpenGL • 作ったやつ • 質問とか
  29. 29. OpenGL • 自分も全然わかってないのでさらっとだけ • グラフィック関連ハードウェアに対する命令(API) のオープンな策定 • Windows、OS X、Unix系OSのほか、OpenGL ESとし てAndroidやiPhoneにも対応 • 競合としてWindowsが提供するAPI群 DirectX(Direct3D)
  30. 30. OpenGL • ものっそい簡単に言うと • 「座標3つ教えてくれたら三角形ポリゴン作るよ!」 • 「画像データ渡してくれたらテクスチャ貼り付ける よ!」 • みたいな命令を使えるようにしてくれる
  31. 31. OpenGLのバージョン OpenGL • 2003年 v1.5 • 2004年 v2.0 • 2008年 v3.0 • 2010年 v4.0 • 最新 v4.5 OpenGL ES • 2003年 v1.0 (GL v1.3の サブセット) • 2004年 v1.1 (v1.5の〃) • 2007年 v2.0 (v2.0の〃) • 2012年 v3.0 (-) • 最新 v3.1
  32. 32. 関係ないけど • 3月3日、次世代OpenGL「Vulkan」が発表 • 肥大化した仕様をシェイプアップ • 並列計算や計算用API群OpenCLとの連帯を強化 • さらなる高速化をめざす • OpenGLも開発は継続 https://www.khronos.org/vulkan
  33. 33. 目次 • 概要 • Go言語 • OpenGL • 作ったやつ • 質問とか
  34. 34. Azul3D • GoからOpenGLが提供する命令を使えるようにする • マウス・キーボードの情報取得や音声再生を支援 する • などの機能を持つゲームエンジン(?)
  35. 35. Azul3DのOpenGL • なぜか最新バージョンではなくOpenGL2.xに対応 • 曰くOpenGL4.xは対応するデバイスが少ない • OpenGL2.xでも拡張機能で最新の機能を使える
  36. 36. Azul3DのOpenGL http://developer.android.com/about/dashboards/index.html GL ES 2.0 3.0
  37. 37. 簡単に導入方法(Windows) • 公式サイト(英語)見れば載ってるけど • http://azul3d.org/doc/install • その1 • Goのインストール • https://golang.org/dl/ • 普通にインストーラ使うかZIPを解凍
  38. 38. 導入方法2 • その2 • gitのインストール • http://git-scm.com/downloads • その3 • MinGWのイン(ry • http://sourceforge.net/projects/tdm-gcc/files/
  39. 39. 導入方法3 • その4 • Go、git、MinGWに環境変数を通す • その5 • go get azul3d.org/example.v1 • ようやく…
  40. 40. サンプルを動かす • cd %GOPATH%¥src¥azul3d.org¥examples.v1¥azul3 d_triangle • go run azul3d_triangle.go • →動いた
  41. 41. Minecraft① • とりあえず四角の面□をつくる • GLは四角形ポリゴン対応だけどGL ESは対応して ない • →Azul3Dも対応してない • 三角×2で代用 • 〼
  42. 42. Minecraft② • 座標の指定はこんな感じ mesh := gfx.NewMesh() mesh.Vertices = []gfx.Vec3{ // top-left {-1,0,1},{-1,0,-1},{1,0,1}, // bottom-right {-1,0,-1},{1,0,-1},{1,0,1}, }
  43. 43. Minecraft③
  44. 44. 右手系・左手系は変更可能 http://wiki.hsp.moe/小ワザ/座標とピクセル.html
  45. 45. Minecraft④ • ポリゴンの座標とテクスチャ画像の座標を対応さ せ、貼り付ける • メッシュは準備ok
  46. 46. Minecraft⑤ • gfx.NewObject()関数でオブジェクトを作成 • メッシュ、テクスチャ、シェーダを割り当てて出来上 がり • このあたりちょっと面倒 • まとめてやってくれる関数欲しかった
  47. 47. Azul3Dのシェーダ • OpenGL用シェーディング(陰影の処理)言語GLSL を用いて定義できる • →OpenGLの資源を活用できる
  48. 48. Minecraft⑥ • 同じことを6面分やれば立方体の完成
  49. 49. Minecraft • ブロックの種類が記述された三次元配列のjson形 式ファイルを読み取り一つ一つ立方体を作る関数 を定義 • 見えないところ(立方体と立方体の接している部 分)は作らないようにしてる
  50. 50. 実演
  51. 51. 実装した機能 • 移動、ジャンプ • 衝突判定 • ブロックの設置、破壊
  52. 52. ここまでしか出来てないorz 時間があったらやりたいこと • マウス操作 • プレイヤー表示 • アイテム • 高速化
  53. 53. Azul3Dの感想 • 最低限の機能しかない感 • モデル読み込み関数や3D物理エンジンbulletを組み込 むらしい • Goの思想に則った設計になってるのは好印象 • ,err 記法とか • Goでゲーム/GUIアプリ書きたいなら一考の価値あ り?
  54. 54. 参考文献 • Go言語 • https://golang.org/ • http://golang-jp.org/ • OpenGL • http://ja.wikipedia.org/wiki/OpenGL • Azul3D公式 • http://azul3d.org/
  55. 55. 目次 • 概要 • Go言語 • OpenGL • 作ったやつ • 質問とか
  56. 56. おわり • ありがとうございました

×