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

More Related Content

PDF
規格書で読むC++11のスレッド
PDF
計算機アーキテクチャを考慮した高能率画像処理プログラミング
PPTX
Rootlessコンテナ
PDF
分散システムの限界について知ろう
PDF
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
PDF
目grep入門 +解説
PPTX
C#や.NET Frameworkがやっていること
規格書で読むC++11のスレッド
計算機アーキテクチャを考慮した高能率画像処理プログラミング
Rootlessコンテナ
分散システムの限界について知ろう
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
プログラムを高速化する話Ⅱ 〜GPGPU編〜
目grep入門 +解説
C#や.NET Frameworkがやっていること

What's hot (20)

PDF
Dockerからcontainerdへの移行
PDF
中3女子でもわかる constexpr
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
PDF
ゲーム開発者のための C++11/C++14
PPTX
C#とILとネイティブと
PDF
PHPで大規模ブラウザゲームを開発してわかったこと
PDF
MagicOnion~C#でゲームサーバを開発しよう~
PPTX
設計と実装で 抑えておきたい サービスクラスと例外
PDF
GoによるiOSアプリの開発
PDF
できる!並列・並行プログラミング
PDF
TVM の紹介
PDF
GoによるWebアプリ開発のキホン
PPTX
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
PDF
CRDT in 15 minutes
PDF
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
PDF
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
PDF
いつやるの?Git入門 v1.1.0
PDF
いまさら聞けないarmを使ったNEONの基礎と活用事例
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
PPTX
30分で分かる!OSの作り方
Dockerからcontainerdへの移行
中3女子でもわかる constexpr
ARM CPUにおけるSIMDを用いた高速計算入門
ゲーム開発者のための C++11/C++14
C#とILとネイティブと
PHPで大規模ブラウザゲームを開発してわかったこと
MagicOnion~C#でゲームサーバを開発しよう~
設計と実装で 抑えておきたい サービスクラスと例外
GoによるiOSアプリの開発
できる!並列・並行プログラミング
TVM の紹介
GoによるWebアプリ開発のキホン
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
CRDT in 15 minutes
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
いつやるの?Git入門 v1.1.0
いまさら聞けないarmを使ったNEONの基礎と活用事例
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
30分で分かる!OSの作り方
Ad

Similar to GoでMinecraftっぽいの作る (20)

PDF
Go入門
PDF
今日から始めるGopher - スタートGo #0 @GDG名古屋
PDF
JavaScript経験者のためのGo言語入門
PDF
Go mobileでモバイルアプリを作ろう
PDF
初心者向けGo言語勉強会
PDF
組み込みLinuxでのGolangのススメ
PDF
エキスパートGo
PDF
Goでかんたんソースコードの静的解析
PDF
F#+Erlangで簡単なシューティングゲームを作ってみている
PDF
Go一緒にいかが?
PPTX
20130228 Goノススメ(BPStudy #66)
PDF
らくちん Go言語
PDF
組み込みLinuxでのGolangのススメ(Go con版)
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか?
PPTX
20130316 プログラミング言語Go
PDF
TechDo Goハンズオン#3
PDF
Erlangやってみた
PDF
マスターオブゴールーチンアンドチャネル スタートGo #1
PDF
Golang handson
PPTX
Go言語ってどんな言語? 導入実績や気になるトレンド
Go入門
今日から始めるGopher - スタートGo #0 @GDG名古屋
JavaScript経験者のためのGo言語入門
Go mobileでモバイルアプリを作ろう
初心者向けGo言語勉強会
組み込みLinuxでのGolangのススメ
エキスパートGo
Goでかんたんソースコードの静的解析
F#+Erlangで簡単なシューティングゲームを作ってみている
Go一緒にいかが?
20130228 Goノススメ(BPStudy #66)
らくちん Go言語
組み込みLinuxでのGolangのススメ(Go con版)
メルカリ・ソウゾウでは どうGoを活用しているのか?
20130316 プログラミング言語Go
TechDo Goハンズオン#3
Erlangやってみた
マスターオブゴールーチンアンドチャネル スタートGo #1
Golang handson
Go言語ってどんな言語? 導入実績や気になるトレンド
Ad

More from 京大 マイコンクラブ (20)

PDF
テキストファイルを読む💪 第1回
PDF
かわいくなろうとしたら語彙力が下がった話
PDF
Common Lisp入門
PDF
多倍長整数の乗算と高速フーリエ変換
PDF
つくってあそぼ ラムダ計算インタプリタ
PDF
Geometry with Unity
PDF
セミコロンレスc++
PDF
エンジニアと健康
PPTX
女の子になれなかった人のために
PDF
Pietで競プロしよう
ODP
もし太陽のコアがIntelCoreだったら
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
PDF
ドット絵でプログラミング!難解言語『Piet』勉強会
PDF
No SSH (@nojima; KMC関東例会)
PDF
DTM練習会2017第1.5回 「伴奏の付け方」
PPTX
hideya流 テストプレイ観察術
PDF
暗号技術入門 秘密の国のアリス 総集編
PDF
C#でゲームを作る2016 第8回
PDF
C#でゲームを作る2016 第7回
テキストファイルを読む💪 第1回
かわいくなろうとしたら語彙力が下がった話
Common Lisp入門
多倍長整数の乗算と高速フーリエ変換
つくってあそぼ ラムダ計算インタプリタ
Geometry with Unity
セミコロンレスc++
エンジニアと健康
女の子になれなかった人のために
Pietで競プロしよう
もし太陽のコアがIntelCoreだったら
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
ドット絵でプログラミング!難解言語『Piet』勉強会
No SSH (@nojima; KMC関東例会)
DTM練習会2017第1.5回 「伴奏の付け方」
hideya流 テストプレイ観察術
暗号技術入門 秘密の国のアリス 総集編
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第7回

GoでMinecraftっぽいの作る