Your SlideShare is downloading. ×
GoでMinecraftっぽいの作る
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

GoでMinecraftっぽいの作る

0
views

Published on

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

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


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
0
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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