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が動かず色々ハマりました。
ちゃんとライセンス更新したほうがいいみたいです。

Comments