Hatena::ブログ(Diary)

urekatのスカンク日記3 このページをアンテナに追加 RSSフィード

2012-12-12

[][][]RubyMotionでCocos2dアプリをつくりはじめるまで

RubyMotion Advent Calendar 2012

http://www.adventar.org/calendars/18

12日目の記事です。

昨日(11日目)の記事は、Toshikazu Horiiさんの「RubyMine で Storyboard を使う」

http://toshikazuhorii.github.com/blog/2012/12/11/storyboard-for-rubymotion/

でした。


Cocos2d

iPhoneでゲームといえば「Cocos2d」ですね。

Cocos2dをRubyMotionで動かすまでをやってみました。

あらかじめごめんなさい、私はCocos2dに特別詳しいわけでもないし、

RubyMotionにもぜんせん詳しくないです。間違っていたり、よりよい方法があれば、

やさしく教えて下さい。

そういうわけですので、試行錯誤の記録です。

完成版コードはここにあります。

https://github.com/takeru/RubyMotionAdventCalendar2012_Cocos2d


まずはプロジェクトを作って、実行してみます。

motion create demo02
rake

黒いアプリ。OK。

次にbundlerの設定。

# Rakefile
require 'rubygems'
require 'bundler'
Bundler.require :default
# Gemfile
source :rubygems
gem 'motion-cocoapods'

ここで再度rakeすると、

cannot load such file -- bundler

とか、

Could not find gem 'motion-cocoapods (>= 0) ruby' in the gems available on this machine.

といわれるので、

gem install bundler
gem install motion-cocoapods

をいれました。

再度rake、黒いアプリOK.

cocos2d本体をプロジェクトに取り込む設定をします。

# Rakefile
  app.pods do
    pod 'cocos2d', :podspec=>'cocos2d.podspec'
  end
# cocos2d.podspec
# https://github.com/takeru/RubyMotionAdventCalendar2012_Cocos2d/blob/master/demo01/cocos2d.podspec
Pod::Spec.new do |s|
  s.name        =  'cocos2d'
  s.license     =  'MIT'
  s.version     =  '2.1.beta3'
  s.summary     =  'cocos2d for iPhone is a framework for building 2D games, demos, and other graphical/interactive applications.'
  s.description =  'cocos2d for iPhone is a framework for building 2D games, demos, and other graphical/interactive applications for iPod Touch, iPhone, iPad and Mac. It is based on the cocos2d design but instead of using python it, uses objective-c.'
  s.homepage    =  'http://www.cocos2d-iphone.org'
  s.author      =  { 'Ricardo Quesada' => 'ricardoquesada@gmail.com', 'Zynga Inc.' => 'https://zynga.com/' }
  s.source      =  {:git => 'git://github.com/cocos2d/cocos2d-iphone.git', :tag => 'release-2.1-beta3'}

  s.source_files = ['cocos2d/**/*.{h,m,c}',
                    'external/kazmath/src/**/*.{c,h}',
                    'external/kazmath/include/**/*.{c,h}'] +
                    FileList['external/libpng/*.{h,c}'].exclude(/pngtest/)
  s.xcconfig   =  { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/cocos2d/external/kazmath/include"' }
  s.frameworks =  ["OpenGLES", "QuartzCore", "GameKit"]
  s.library    =  'z'

  s.subspec 'CocosDenshion' do |p|
    p.source_files =  'CocosDenshion/CocosDenshion/*.{h,m}'
    p.frameworks   =  ["OpenAL", "AVFoundation", "AudioToolbox"]
  end

  s.prefix_header_contents = '''
#define CC_ENABLE_GL_STATE_CACHE 1
'''

  def s.copy_header_mapping(from)
    from.relative_path_from(Pathname.new('cocos2d'))
  end
end

% time rake -t

No such file or directory - /Users/takeru/.cocoapods

cocoapodsでググるとはじめに出てくるページ

http://d.hatena.ne.jp/Watson/20111204/mac_dev_jp_advent_calendar_cocoapods01

に、”pod setup” せよとあるので、します。

~/.cocoapods

ができました。

再度rakeします。

% time rake -t

これ、cocos2d本体をgit cloneしてビルド、とやっているので時間がかかります。

CPUもディスクも動いていないので止めたくなりますが、アクティビティモニタネットワークを見るとデータを受信しているようなので気長に待ちます。

% ps | grep git

76905 ttys003    0:01.76 /usr/bin/git clone --mirror git://github.com/cocos2d/cocos2d-iphone.git /Users/takeru/Library/Caches/CocoaPods/Git/ca1112b96b6c978964e2e99a16757926c4a82e58
76906 ttys003    0:05.29 git index-pack --stdin --fix-thin --keep=fetch-pack 76905 on tkrimac.local

% lsof | grep 76905 | grep TCP
git       76905 takeru    3u    IPv4 0xceb3fcdbfa4fb28f       0t0    TCP 192.168.0.6:53263->github.com:git (ESTABLISHED)
git       76905 takeru    5u    IPv4 0xceb3fcdbfa4fb28f       0t0    TCP 192.168.0.6:53263->github.com:git (ESTABLISHED)
rake -t  41.02s user 10.89s system 3% cpu 28:05.76 total

30分ぐらいかかりました。

/Users/takeru/Library/Caches/CocoaPods/Git あたりにcloneされました。

(CocoaPodsのキャッシュなんだろうが、どう働くのかどう更新するのかとかよくわかっていない。)

プロジェクト内のvendor/Pods/cocos2dにcocos2dのコードが配置されたことが確認できます。

しかし、まだ黒いアプリです。

Cocos2dアプリ

ここから雑になります。

https://github.com/takeru/RubyMotionAdventCalendar2012_Cocos2d/tree/master/demo01/app

https://github.com/takeru/RubyMotionAdventCalendar2012_Cocos2d/tree/master/demo01/resources

cocos2d_app_delegate.rb

app_delegate.rb

この2ファイルとpngファイルをappに配置します。

(png画像はこれでつくりました→ https://itunes.apple.com/jp/app/art-text-2-lite/id425147621?mt=12 )

class Cocos2dAppDelegate
  attr_reader :window, :director, :nav_controller

  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame UIScreen.mainScreen.bounds

    glView = CCGLView.viewWithFrame @window.bounds,
      pixelFormat: KEAGLColorFormatRGB565,
      depthFormat: 0,
      preserveBackbuffer: false,
      sharegroup: nil,
      multiSampling: false,
      numberOfSamples: 0

    @director = CCDirector.sharedDirector
    @director.wantsFullScreenLayout = true
    @director.displayStats = true
    @director.animationInterval = 1.0/60
    @director.view = glView
    @director.projection = KCCDirectorProjection2D
    @director.enableRetinaDisplay false #true
    @director.delegate = self

    @nav_controller = UINavigationController.alloc.initWithRootViewController @director
    @nav_controller.navigationBarHidden = true

    @window.addSubview @nav_controller.view
    @window.makeKeyAndVisible

    CCTexture2D.defaultAlphaPixelFormat = KCCTexture2DPixelFormat_RGBA8888

    file_utils = CCFileUtils.sharedFileUtils
    file_utils.enableFallbackSuffixes = false
    file_utils.setiPhoneRetinaDisplaySuffix "-hd"
    file_utils.setiPadSuffix "-ipad"
    file_utils.setiPadRetinaDisplaySuffix "-ipadhd"

    CCTexture2D.PVRImagesHavePremultipliedAlpha true

    true
  end

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

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

  def applicationDidEnterBackground(app)
    @director.stopAnimation if @nav_controller.visibleViewController == @director
  end

  def applicationWillEnterForeground(app)
    @director.startAnimation if @nav_controller.visibleViewController == @director
  end

  def applicationWillTerminate(app)
    @director.end
  end

  def applicationDidReceiveMemoryWarning(app)
    @director.purgeCachedData
  end

  def applicationSignificantTimeChange(app)
    @director.setNextDeltaTimeZero true
  end
end
class AppDelegate < Cocos2dAppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    super

    @scene = MainScene.node
    director.pushScene @scene

    true
  end

  #def shouldAutorotateToInterfaceOrientation(orientation)
  #  [UIInterfaceOrientationPortrait,
  #   UIInterfaceOrientationPortraitUpsideDown,
  #   UIInterfaceOrientationLandscapeLeft,
  #   UIInterfaceOrientationLandscapeRight
  #  ].include?(orientation)
  #end
end

class MainScene < CCLayer
  def init
    super
    p "MainScene#init"
    self.scheduleUpdate
    self
  end

  def onEnter
    super
    p "MainScene#onEnter"
    self.initMenu
  end

  def onExit
    super
    p "MainScene#onExit"
  end

  def update(dt)
    super
    # p "MainScene#update(#{dt})"
  end

  def initMenu
    item1 = CCMenuItemImage.itemWithNormalImage "item1a.png", selectedImage:"item1b.png", disabledImage:"item1c.png", target:self, selector: 'menuSelected:'

    sp2a  = CCSprite.spriteWithFile "item2a.png"
    sp2b  = CCSprite.spriteWithFile "item2b.png"
    sp2c  = CCSprite.spriteWithFile "item2c.png"
    item2 = CCMenuItemSprite.itemWithNormalSprite sp2a, selectedSprite:sp2b, disabledSprite:sp2c, target:self, selector: 'menuSelected:'

    lb3   = CCLabelTTF.labelWithString:"Let's Go!", fontName:"Arial", fontSize:50
    lb3.color = [0,127,0]
    item3 = CCMenuItemLabel.itemWithLabel lb3, target:self, selector: 'menuSelected:'

    lb4   = CCLabelTTF.labelWithString:"Jump!", fontName:"Marker Felt", fontSize:32
    lb4.color = [0,0,255]
    item4 = CCMenuItemLabel.itemWithLabel(lb4, block:lambda{|sender| puts "lambda@Item4 #{sender.inspect}" })

    menu = CCMenu.menuWithArray [item1, item2, item3, item4]
    #menu.position = [0,0]
    menu.alignItemsVertically
    self.addChild menu, z:1
  end

  def menuSelected(sender)
    puts "menuSelected #{sender.inspect}"
  end
end

rakeで実行するとメニューが表示されます。

f:id:urekat:20121209155547p:image

メニューを押すとコンソールにログが出ます。

f:id:urekat:20121209155548p:image

ステータスバーを隠して、画面を横向きにする

ゲームなので、ステータスバーを隠して横向きにしたい。

ただ、これだけのことに初心者はつまづきます。

Info.plistの内容はRakefileに書けます。

# Rakefile
  app.info_plist['UIStatusBarHidden'] = true
  app.info_plist['UIInterfaceOrientation'] = "UIInterfaceOrientationLandscapeLeft"
  app.info_plist['UISupportedInterfaceOrientations'] = ['UIInterfaceOrientationLandscapeLeft']

これでうまくいくはずだったのですが、

f:id:urekat:20121209155549p:image

こうなってしまいました。

おかしい。昨日MacbookAirでやったときはうまくいったのに。

調べてみると、シミュレータのバーションが違いました。5.1と6.0。


6.0のSDK(?)の環境で5.1をシミュレートするには、Rakefile

app.deployment_target = "5.1"

と書いた上で、

% rake clean
% rake simulator target=5.1

として実行するとうまくいきました。

5.1のシミュレータだと、

f:id:urekat:20121209155550p:image

ちゃんと横を向きます。


まとめ

RubyMotion+Cocos2dをはじめるまでの試行錯誤を紹介しました。

誰かの足がかりになれば良いなと思います。

iOS Developer Program二年分とRubyMotionを買ったのですが、いまだにひとつもアプリをリリースできていません。なんとかもとをとりたい。



参考URL

https://github.com/anydiem/cocosmotion

https://github.com/CocoaPods/Specs/tree/master/cocos2d

http://www.rubymotion.com/developer-center/guides/project-management/

https://groups.google.com/forum/?fromgroups=#!topic/rubymotion/IWYEKpSya84

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

トラックバック - http://d.hatena.ne.jp/urekat/20121212/rubymotioncocos2d
Connection: close