SlideShare une entreprise Scribd logo
1  sur  56
Télécharger pour lire hors ligne
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
• 作ったやつ
• 質問とか
おわり
• ありがとうございました

Contenu connexe

Tendances

Tendances (20)

Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudyJenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
JenkinsとDockerって何が良いの? 〜言うてるオレもわからんわ〜 #jenkinsstudy
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
WPF開発での陥りやすい罠
WPF開発での陥りやすい罠WPF開発での陥りやすい罠
WPF開発での陥りやすい罠
 
TensorFlow XLAは、 中で何をやっているのか?
TensorFlow XLAは、 中で何をやっているのか?TensorFlow XLAは、 中で何をやっているのか?
TensorFlow XLAは、 中で何をやっているのか?
 
Spanner移行について本気出して考えてみた
Spanner移行について本気出して考えてみたSpanner移行について本気出して考えてみた
Spanner移行について本気出して考えてみた
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
Kubernetesによる機械学習基盤への挑戦
Kubernetesによる機械学習基盤への挑戦Kubernetesによる機械学習基盤への挑戦
Kubernetesによる機械学習基盤への挑戦
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 

Similaire à GoでMinecraftっぽいの作る

CodingTips+ 基礎編
CodingTips+ 基礎編CodingTips+ 基礎編
CodingTips+ 基礎編
Yusuke Ito
 
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
 
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼうGraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
Koichi Sakata
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
terurou
 
The History of Groovy #GroovyBase
The History of Groovy #GroovyBaseThe History of Groovy #GroovyBase
The History of Groovy #GroovyBase
kyon mm
 
Tizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiTizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native api
Naruto TAKAHASHI
 
オープンセミナー香川2012 LT
オープンセミナー香川2012 LTオープンセミナー香川2012 LT
オープンセミナー香川2012 LT
Kouta Imanaka
 

Similaire à GoでMinecraftっぽいの作る (20)

CodingTips+ 基礎編
CodingTips+ 基礎編CodingTips+ 基礎編
CodingTips+ 基礎編
 
社内勉強会1 go lang
社内勉強会1 go lang 社内勉強会1 go lang
社内勉強会1 go lang
 
今日から始める Go言語 と appengine
今日から始める Go言語 と appengine今日から始める Go言語 と appengine
今日から始める Go言語 と appengine
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
 
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
 
Macで快適にプログラミング
Macで快適にプログラミングMacで快適にプログラミング
Macで快適にプログラミング
 
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼうGraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
 
C#への招待
C#への招待C#への招待
C#への招待
 
インフラ運用管理ツールとGolang OSS運用管理勉強会LT
インフラ運用管理ツールとGolang OSS運用管理勉強会LTインフラ運用管理ツールとGolang OSS運用管理勉強会LT
インフラ運用管理ツールとGolang OSS運用管理勉強会LT
 
OSSで楽に作るGo言語クライアントツール
OSSで楽に作るGo言語クライアントツールOSSで楽に作るGo言語クライアントツール
OSSで楽に作るGo言語クライアントツール
 
密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
 
Net fringejp2016
Net fringejp2016Net fringejp2016
Net fringejp2016
 
The History of Groovy #GroovyBase
The History of Groovy #GroovyBaseThe History of Groovy #GroovyBase
The History of Groovy #GroovyBase
 
Easy scripting in Go
Easy scripting in GoEasy scripting in Go
Easy scripting in Go
 
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
 
Tizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiTizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native api
 
ゲーム組み込み用スクリプト言語を作ってみた
ゲーム組み込み用スクリプト言語を作ってみたゲーム組み込み用スクリプト言語を作ってみた
ゲーム組み込み用スクリプト言語を作ってみた
 
オープンセミナー香川2012 LT
オープンセミナー香川2012 LTオープンセミナー香川2012 LT
オープンセミナー香川2012 LT
 

Plus de 京大 マイコンクラブ

Plus de 京大 マイコンクラブ (20)

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

GoでMinecraftっぽいの作る