rubymotionでjoyboxを使ってみた

すごい広島#9に参加してきました。
最近、RubyMotionで遊べてなかったので、
この機会にRubyMotionでcocos2dやってみようと思い立ちました。

RubyMotionからCocoapodsを使ってcocos2dをインストールすると、
毎回、cocos2dのソースのダウンロードで待たされてしまう様なので
rubymotion + joyboxを使うとその辺が楽になるのか試してみました。

今回やったこと

  • joyboxのインストール
  • プロジェクトの雛形の生成
  • joyboxで簡単な処理を書いてみる

joyboxのインストール

joyboxはgemコマンドでインストールし、
その後、joyboxコマンドでセットアップします。
セットアップ後、rubymotionでjoybox用のプロジェクトテンプレートが使えるようになります。

1
2
3
$ gem install joybox
$ joybox install
Joybox RubyMotion Templates and Commands installed correctly

joyboxのインストール場所を覗いてみると、
gems/joybox-1.0.0/vendor/vendor-ios/cocos_2d/cocos_2d_include
あたりにcocos2dのヘッダファイルが入っているようです。
cocos2dの2.1.0が入っているっぽいです。

コンパイル済みの静的ライブラリファイルは、
gems/joybox-1.0.0/vendor/vendor-ios/cocos_2d/libcocos2d.a
に置いてありました。
これで、ソースファイルのダウンロードやコンパイルで待たされずに済みそうです。

プロジェクトの雛形の生成

rubymotionのプロジェクトを作成します。
–templateオプションに、joybox用のテンプレートを指定することで、
joyboxを動かすのに必要なソースコードが自動生成されます

1
2
3
4
5
6
7
8
9
$ motion create --template=joybox-ios joybox_test
Create joybox_test
Create joybox_test/app/app_delegate.rb
Create joybox_test/Rakefile
Create joybox_test/resources/Default-568h@2x.png
Create joybox_test/resources/fps_images-hd.png
Create joybox_test/resources/fps_images-ipadhd.png
Create joybox_test/resources/fps_images.png
Create joybox_test/spec/main_spec.rb

生成されたコードを見てみると、
cocos2dの初期化コードをJoyboxが隠蔽してくれているようで、
だいぶスッキリした感じです。

app/app_delegate.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class AppDelegate

def application(application, didFinishLaunchingWithOptions:launchOptions)

@director = Joybox::Configuration.setup do
director display_stats: true
end

@navigation_controller = UINavigationController.alloc.initWithRootViewController(@director)
@navigation_controller.navigationBarHidden = true

@window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
@window.setRootViewController(@navigation_controller)
@window.makeKeyAndVisible
true
end

def applicationWillResignActive(app)
@director.pause if @navigation_controller.visibleViewController == @director
end

def applicationDidBecomeActive(app)
@director.resume if @navigation_controller.visibleViewController == @director
end

def applicationDidEnterBackground(app)
@director.stop_animation if @navigation_controller.visibleViewController == @director
end

def applicationWillEnterForeground(app)
@director.start_animation if @navigation_controller.visibleViewController == @director
end

def applicationWillTerminate(app)
@director.end
end

def applicationDidReceiveMemoryWarning(app)
@director.purge_cached_data
end

def applicationSignificantTimeChange(app)
@director.set_next_delta_time_zero true
end
end

Rakefileは「require ‘joybox’」以外はいつも通りのようです。

Rakefile
1
2
3
4
5
6
7
8
9
# -*- coding: utf-8 -*-
$:.unshift("/Library/RubyMotion/lib")
require 'motion/project/template/ios'
require 'joybox'

Motion::Project::App.setup do |app|
# Use `rake config' to see complete project settings.
app.name = 'joybox_test'
end

joyboxで簡単な処理を書いてみる

cocos2dでお馴染みのCCSceneクラスをjoybox風に書いてみました。
ラベルを表示したり、画像を表示したりする処理を行なってます。

app/my_scene.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding: utf-8 -*-
class MyScene < Joybox::Core::Scene

def on_enter

label = Label.new(
text: "Congratulations!!",
font_size: 40,
color: Color.new(255, 255, 255),
position: [Screen.half_width, Screen.half_height],
dimensions: [120, 40]
)

self << label

sprite = Sprite.new(
file_name: 'apple.jpg',
position: [Screen.half_width, Screen.half_height + 80],
)

self << sprite
end

end

app_delegate.rbのapplicationメソッド内に処理を追加します。

app/app_delegate.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def application(application, didFinishLaunchingWithOptions:launchOptions)

@director = Joybox::Configuration.setup do
director display_stats: true
end

@navigation_controller = UINavigationController.alloc.initWithRootViewController(@director)
@navigation_controller.navigationBarHidden = true

@window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
@window.setRootViewController(@navigation_controller)
@window.makeKeyAndVisible

@director << MyScene.new # 追加
true
end

rakeコマンドを実行します。

1
$ rake

こんな感じで表示されました。

感想

joyboxを使った場合、cocos2dの処理をスネークケースでrubyぽく書けるようです。
ただ、いつの間にかRubymotionのライセンスが切れていて、
古いRubymotionでjoyboxが動かず色々ハマりました。
ちゃんとライセンス更新したほうがいいみたいです。