SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
Goだけで
モバイルアプリを
作ろう
2015/10/11(日)
@Goオールスターズ!
The Go gopher was designed by Renee French.
The gopher stickers was made by Takuya Ueda.
Licensed under the Creative Commons 3.0
Attributions license.
アジェンダ
● 自己紹介
● Go Mobileとは?
● どうやって作るのか?
● イベント
● spriteパッケージ
● その他できること
● Google Playに公開するまでの道のり
自己紹介
KLab株式会社
KLabGames事業本部 エンジニア
上田拓也
twitter: @tenntenn
■ 好きな言語
Go, JavaScript, Lua
■ 業務
モバイルオンラインゲームの開発(クライアントサイド)
Go Mobileとは?
https://github.com/golang/mobile
Goとクロスコンパイル
■ $GOOSと$GOARCHを指定する
$ GOOS=linux GOARCH=arm go build main.go
■ Android上で実行
$ adb push main /data/local/tmp
$ adb shell
$ run-as pkgname
$ cat /data/local/tmp/main > main
$ chmod 766 main
findやgrepが使えない時に便利
Go Mobileとは
● Goでモバイルアプリを作るツール群
○ iOS / Androidに対応
○ golang.org/x/mobile
● 2通りのスタイル
○ Goだけで書く
⇒ OpenGL を使う
○ 一部だけ書く
⇒ Java, Obj-c/Swiftから
参考:https://github.com/golang/go/wiki/Mobile
Goだけでモバイルアプリを作ってみた
http://github.com/tenntenn/gofun
どうやって作るの?
gomobileコマンド
■ gomobile init
● ツールチェインのインストールや初期化を行う
● 最初の1回だけ実行すればよい
■ gomobile build
● ビルドを行う
● apk(Android)やapp(iOS)の生成を行う
■ gomobile install
● gomobile build後にadb installまで行う
● Android限定
PCで動かす場合は
go buildで行う
Go Mobileのパッケージ
■ glパッケージ
● golang.org/x/mobile/gl
● OpenGL ES で頑張る
■ eventパッケージ
● golang.org/x/mobile/event/touch
● golang.org/x/mobile/event/paint
● golang.org/x/mobile/event/lifecycle など
■ spriteパッケージ
● golang.org/x/mobile/exp/sprite
● 2次元のシーングラフ
イベントループとspriteパッケージ
参考:サンプルコード
イベントループとspriteパッケージ
参考:サンプルコード
app.Main
■ イベントループを行う関数
func main() {
app.Main(func(a app.App) {
// イベントループを書く
})
}
イベントループ
■ app.App.Events()からイベントを取得
// Events() <-chan interface{}
for e := range a.Events() {
switch e := a.Filter(e).(type) {
case lifecycle.Event:
// ...
case paint.Event:
// ...
}
}
spriteパッケージ
■ sprite.Engine
● 描画エンジンを表すインタフェース
● 具体的な実装は別のパッケージに任せる
sprite/glsprite, sprite/portable
■ sprite.Node
● シーングラフのノードを表す構造体
■ sprite.Texture
● テクスチャを表すインタフェース
■ sprite.SubTex
● テクスチャの一部を表す構造体
● ノードに設定される
テクスチャ
サブテクスチャ
イベントループとspriteパッケージ
参考:サンプルコード
テクスチャのロード
■ アセットのオープン
a, err := asset.Open("gopher.png")
■ 画像のデコード
img, err := image.Decode(a)
■ テクスチャのロード
t, err := eng.LoadTexture(img)
assetsディレクトリ以下の
ファイルを見に行く
イベントループとspriteパッケージ
参考:サンプルコード
シーングラフの構築
■ ノードの作成と登録
■ 子ノードの追加
scene := &sprite.Node{}
eng.Register(scene)
n := &sprite.Node{}
eng.Register(n)
scene.AppendChild(n)
サブテクスチャの作成と設定
■ サブテクスチャの作成
st := sprite.Subtex {
T:t, // テクスチャ
R:iamge.Rect(0, 0, 100, 200)
}
■ サブテクスチャの設定
eng.SetSubTex(n, st)
テクスチャ上の該当の領域
を指定する
アフィン変換行列の設定
■ アフィン変換行列の設定
ルートノードは、サイズ:1pt x 1pt、
座標:(0,0)、角度:0に対して変換行列を掛け合わせる
eng.SetTransform(root, f32.Affine{
{2, 0, 5},
{0, 2, 5},
})
1pt = 1/72 inch
アフィン変換行列の計算
■ 親ノードから子ノードへ
親ノードの変換結果に子ノードの変換行列を
掛けわせて子ノードの描画位置を決める
root
n
eng.SetTransform(root, f32.Affine{
{2, 0, 5},
{0, 2, 5},
})
eng.SetTransform(n, f32.Affine{
{100, 0, 10},
{0, 100, 10},
})
2x2, (5, 5)
200x200, (25, 25)
イベントループとspriteパッケージ
参考:サンプルコード
ノードの配置
■ Node.Arranger.Arrange
● 毎フレーム呼ばれる
● ノードの位置を変更したりする
type Arranger interface{
Arrange(e Engine, n *Node, t clock.Time)
}
シーングラフの描画
■ Engine.Render
シーングラフを描画する
現在の時刻と、画面サイズ(size.Event)が必要
// 60FPS
now := clock.Time(
time.Since(st)*60/time.Second)
// szはsize.Event
eng.Render(root, now, sz)
実行例
その他できること
■ touch.Event
● タッチイベント
■ sensor.Event
● センサーイベント
■ Goの標準パッケージ
● ほとんどのパッケージは使える
● net/httpでWebサーバを立てる
○ Androidはandroid.permission.INTERNETがいる
○ 参考:サンプルコード
Google Play に公開するまでの道のり
● Goでモバイルアプリを書く
● apkを作る
○ gomobile build pkg_name
● アイコンを作る
○ apkにresがない
● apkにresを突っ込む
○ apk-toolで一度展開して突っ込む
● 署名+zipaligne
詳しくはブログに書いています
http://klabgames.tech.blog.jp.klab.com/
結構変わってる!
■テクスチャ開放ができる
● sprite.Engine.Release
● glutil.Images.Release
■ テクスチャロード
● 1回目のペイントイベントでなくてよい
● lifecycle.EventのStageVisible(CrossOn)で
よい
Goだけでモバイルアプリを作ろう

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
 
Cloud functionsの紹介
Cloud functionsの紹介Cloud functionsの紹介
Cloud functionsの紹介
 
GAE/GoでLINE Messaging API を使う
GAE/GoでLINE Messaging API を使うGAE/GoでLINE Messaging API を使う
GAE/GoでLINE Messaging API を使う
 
Go初心者向けハンズオン コマンドラインツールを作ろう
Go初心者向けハンズオン コマンドラインツールを作ろうGo初心者向けハンズオン コマンドラインツールを作ろう
Go初心者向けハンズオン コマンドラインツールを作ろう
 
goパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現するgoパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現する
 
エディタの壁を越えるGoの開発ツールの文化と作成法
エディタの壁を越えるGoの開発ツールの文化と作成法エディタの壁を越えるGoの開発ツールの文化と作成法
エディタの壁を越えるGoの開発ツールの文化と作成法
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
Gopher Fest 2017参加レポート
Gopher Fest 2017参加レポートGopher Fest 2017参加レポート
Gopher Fest 2017参加レポート
 
Cloud Functionsの紹介
Cloud Functionsの紹介Cloud Functionsの紹介
Cloud Functionsの紹介
 
Goでwebアプリを開発してみよう
Goでwebアプリを開発してみようGoでwebアプリを開発してみよう
Goでwebアプリを開発してみよう
 
Golang入門
Golang入門Golang入門
Golang入門
 
Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発
 
ネットワークの切り替えを感知する方法
ネットワークの切り替えを感知する方法ネットワークの切り替えを感知する方法
ネットワークの切り替えを感知する方法
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
Go Friday 傑作選
Go Friday 傑作選Go Friday 傑作選
Go Friday 傑作選
 
Google Assistant関係のセッションまとめ
Google Assistant関係のセッションまとめGoogle Assistant関係のセッションまとめ
Google Assistant関係のセッションまとめ
 
GoでMinecraftっぽいの作る
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る
 
実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで
 
Go goes Mobile: Quick Exploration on Go 1.5 and Gomobile
Go goes Mobile: Quick Exploration on Go 1.5 and GomobileGo goes Mobile: Quick Exploration on Go 1.5 and Gomobile
Go goes Mobile: Quick Exploration on Go 1.5 and Gomobile
 
PHP開発からAndroid開発をするようになって学んだWebとモバイルの違い
PHP開発からAndroid開発をするようになって学んだWebとモバイルの違いPHP開発からAndroid開発をするようになって学んだWebとモバイルの違い
PHP開発からAndroid開発をするようになって学んだWebとモバイルの違い
 

Andere mochten auch

今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
 

Andere mochten auch (20)

【初心者向け】Go言語勉強会資料
 【初心者向け】Go言語勉強会資料 【初心者向け】Go言語勉強会資料
【初心者向け】Go言語勉強会資料
 
マスター・オブ・reflectパッケージ II
マスター・オブ・reflectパッケージ IIマスター・オブ・reflectパッケージ II
マスター・オブ・reflectパッケージ II
 
Go言語オーバービュー201507
Go言語オーバービュー201507Go言語オーバービュー201507
Go言語オーバービュー201507
 
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
 
私なりのGo言語のご紹介
私なりのGo言語のご紹介私なりのGo言語のご紹介
私なりのGo言語のご紹介
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
Go入門
Go入門Go入門
Go入門
 
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
 
Mix and Match / Swift and Objective-C
Mix and Match / Swift and Objective-CMix and Match / Swift and Objective-C
Mix and Match / Swift and Objective-C
 
Server Side Swift with Swag
Server Side Swift with SwagServer Side Swift with Swag
Server Side Swift with Swag
 
自作アプリを watchOS 2 対応した話 〜FastCheckin編〜
自作アプリを watchOS 2 対応した話 〜FastCheckin編〜自作アプリを watchOS 2 対応した話 〜FastCheckin編〜
自作アプリを watchOS 2 対応した話 〜FastCheckin編〜
 
Swiftでの関数型プログラミングについて考えていること
Swiftでの関数型プログラミングについて考えていることSwiftでの関数型プログラミングについて考えていること
Swiftでの関数型プログラミングについて考えていること
 
Xcode tips
Xcode tipsXcode tips
Xcode tips
 
iOS9/iPadとマルチタスキング
iOS9/iPadとマルチタスキングiOS9/iPadとマルチタスキング
iOS9/iPadとマルチタスキング
 
Xcode 7で始めるCI
Xcode 7で始めるCIXcode 7で始めるCI
Xcode 7で始めるCI
 
iOSでのFramework導入のおさらい #関モバ
iOSでのFramework導入のおさらい #関モバiOSでのFramework導入のおさらい #関モバ
iOSでのFramework導入のおさらい #関モバ
 
マスター・オブ・Reflectパッケージ
マスター・オブ・Reflectパッケージマスター・オブ・Reflectパッケージ
マスター・オブ・Reflectパッケージ
 
Beyond JSON with FlatBuffers
Beyond JSON with FlatBuffersBeyond JSON with FlatBuffers
Beyond JSON with FlatBuffers
 
Go for Mobile Games
Go for Mobile GamesGo for Mobile Games
Go for Mobile Games
 
コードを書きやすくしてくれる Xcode の基本機能 #NSStudy #devsap
コードを書きやすくしてくれる Xcode の基本機能 #NSStudy #devsapコードを書きやすくしてくれる Xcode の基本機能 #NSStudy #devsap
コードを書きやすくしてくれる Xcode の基本機能 #NSStudy #devsap
 

Ähnlich wie Goだけでモバイルアプリを作ろう

Go一緒にいかが?
Go一緒にいかが?Go一緒にいかが?
Go一緒にいかが?
Ryuji Iwata
 
20120316 designerworkshoppublished
20120316 designerworkshoppublished20120316 designerworkshoppublished
20120316 designerworkshoppublished
Yoichiro Sakurai
 

Ähnlich wie Goだけでモバイルアプリを作ろう (20)

What is "Go" Gopher?
What is "Go" Gopher?What is "Go" Gopher?
What is "Go" Gopher?
 
gomobile
gomobilegomobile
gomobile
 
DroidKaigi 2018 - Dialogflow for Android
DroidKaigi 2018 - Dialogflow for AndroidDroidKaigi 2018 - Dialogflow for Android
DroidKaigi 2018 - Dialogflow for Android
 
PhoneGap勉強会 in 熊本
PhoneGap勉強会 in 熊本PhoneGap勉強会 in 熊本
PhoneGap勉強会 in 熊本
 
Go一緒にいかが?
Go一緒にいかが?Go一緒にいかが?
Go一緒にいかが?
 
Slide
SlideSlide
Slide
 
Geo geo
Geo geoGeo geo
Geo geo
 
ちょっとさわってみるGo言語ハンズオン
ちょっとさわってみるGo言語ハンズオンちょっとさわってみるGo言語ハンズオン
ちょっとさわってみるGo言語ハンズオン
 
自社のメインプロダクトにGoを導入したぞ++
自社のメインプロダクトにGoを導入したぞ++自社のメインプロダクトにGoを導入したぞ++
自社のメインプロダクトにGoを導入したぞ++
 
スッとGoを取り入れる
スッとGoを取り入れるスッとGoを取り入れる
スッとGoを取り入れる
 
Herlockサービス紹介
Herlockサービス紹介Herlockサービス紹介
Herlockサービス紹介
 
社内勉強会1 go lang
社内勉強会1 go lang 社内勉強会1 go lang
社内勉強会1 go lang
 
Golang handson
Golang handsonGolang handson
Golang handson
 
俺達のGoogle i:o 2014 はまだ始まったばかりだ
俺達のGoogle i:o 2014 はまだ始まったばかりだ俺達のGoogle i:o 2014 はまだ始まったばかりだ
俺達のGoogle i:o 2014 はまだ始まったばかりだ
 
Google Homeが家にやってきた
Google Homeが家にやってきたGoogle Homeが家にやってきた
Google Homeが家にやってきた
 
国際化対応におけるUI実装で気をつけるべきこと
国際化対応におけるUI実装で気をつけるべきこと国際化対応におけるUI実装で気をつけるべきこと
国際化対応におけるUI実装で気をつけるべきこと
 
G* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - IntroductionG* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - Introduction
 
ライトニングノードをたててみよう
ライトニングノードをたててみようライトニングノードをたててみよう
ライトニングノードをたててみよう
 
20120316 designerworkshoppublished
20120316 designerworkshoppublished20120316 designerworkshoppublished
20120316 designerworkshoppublished
 
Android6.0の機能まとめ 実機でサンプルを動かしてみた
Android6.0の機能まとめ 実機でサンプルを動かしてみたAndroid6.0の機能まとめ 実機でサンプルを動かしてみた
Android6.0の機能まとめ 実機でサンプルを動かしてみた
 

Mehr von Takuya Ueda

Mehr von Takuya Ueda (16)

Goにおけるバージョン管理の必要性 − vgoについて −
Goにおけるバージョン管理の必要性 − vgoについて −Goにおけるバージョン管理の必要性 − vgoについて −
Goにおけるバージョン管理の必要性 − vgoについて −
 
WebAssembly with Go
WebAssembly with GoWebAssembly with Go
WebAssembly with Go
 
GAE/Goとsyncパッケージ
GAE/GoとsyncパッケージGAE/Goとsyncパッケージ
GAE/Goとsyncパッケージ
 
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発
 
そうだ、Goを始めよう
そうだ、Goを始めようそうだ、Goを始めよう
そうだ、Goを始めよう
 
マスター・オブ・goパッケージ
マスター・オブ・goパッケージマスター・オブ・goパッケージ
マスター・オブ・goパッケージ
 
メルカリ カウルのマスタデータの更新
メルカリ カウルのマスタデータの更新メルカリ カウルのマスタデータの更新
メルカリ カウルのマスタデータの更新
 
Go1.8 for Google App Engine
Go1.8 for Google App EngineGo1.8 for Google App Engine
Go1.8 for Google App Engine
 
Static Analysis in Go
Static Analysis in GoStatic Analysis in Go
Static Analysis in Go
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
エキスパートGo
エキスパートGoエキスパートGo
エキスパートGo
 
Go静的解析ハンズオン
Go静的解析ハンズオンGo静的解析ハンズオン
Go静的解析ハンズオン
 
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用
 
条件式評価器の実装による管理ツールの抽象化
条件式評価器の実装による管理ツールの抽象化条件式評価器の実装による管理ツールの抽象化
条件式評価器の実装による管理ツールの抽象化
 
Mobile Apps by Pure Go with Reverse Binding
Mobile Apps by Pure Go with Reverse BindingMobile Apps by Pure Go with Reverse Binding
Mobile Apps by Pure Go with Reverse Binding
 
GAE/GoでWebアプリ開発入門
GAE/GoでWebアプリ開発入門GAE/GoでWebアプリ開発入門
GAE/GoでWebアプリ開発入門
 

Kürzlich hochgeladen

Kürzlich hochgeladen (11)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

Goだけでモバイルアプリを作ろう