<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
   <channel>
      <title>myb design :: blog</title>
      <link>http://www.mybdesign.com/blog/</link>
      <description></description>
      <language>ja</language>
      <copyright>Copyright 2012</copyright>
      <lastBuildDate>Tue, 31 Jan 2012 20:07:35 +0900</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

      
      <item>
         <title>Global Game Jam 2012 (GGJ)に参加してきました。</title>
         <description><![CDATA[去る1月27日〜29日に、48時間以内に即席のチームでゲームを制作するイベント、<a href="http://globalgamejam.org/" target="_blank">Global Game Jam</a>に参加してきました。
このようないわゆるJamイベントは初めてで、勝手も分からず恐る恐る参加してみたんですが、これがもうなんとも熱く濃密な体験をすることができました。

僕の参加したチームにはUnityのエバンジェリストである高橋さんがいらっしゃって、その時点でチートだろうという噂もありましたが、メインプログラマー×2、リーダー兼サーバー担当、サウンド担当、グラフィック担当(自分)と、構成としては非常にいいチームでした。

そんな構成だったので、今回はデザインに専念。普段はプログラミングに飽きたらデザインやって、デザインに飽きたらプログラミングでと勝手気ままにやっているんですが、限られた時間内で結果を出さなければならないというプレッシャーを感じつつ、出せるものを出してきました。

プロトタイプの時点でシステムとして完成されていたこともあり、キャラクターから世界観が固まっていって完成にこぎ着けたことは非常によかったと思うのですが、普段から自分のデザインに対して感じていた問題点が(自分の中で)浮き彫りになって、それは今後も意識して打ち砕いていかなければなあ、と思ったり。

いずれにせよ、この短時間にこれだけ集中して作業するということも普段ないことなので、なにか新しい世界を見た気がします。

さて、そんな48時間で制作したゲームはこちら、「<a href="http://globalgamejam.org/2012/greedy-snake-san" target="_blank">Greedy Snake-san</a>」。
ページ中ほどのGame Files: Please click it !l (Game Start!)からブラウザ上で遊べます(要<a href="http://unity3d.com/webplayer/">Unity Web Player</a>)。
うまく動かない場合はゲーム画面の上にあるUnity Web Player 3.5(RC1)というリンクをクリックしてPlayerをアップデートしてみてください。
タイムアタックのランキングもあります。
Enjoy it!

<iframe width="512" height="288" src="http://www.youtube.com/embed/ZM4K721Z_LY?rel=0" frameborder="0" allowfullscreen></iframe>

]]></description>
         <link>http://www.mybdesign.com/blog/2012/01/000046.html</link>
         <guid>http://www.mybdesign.com/blog/2012/01/000046.html</guid>
        
        
         <pubDate>Tue, 31 Jan 2012 20:07:35 +0900</pubDate>
      </item>
      
      <item>
         <title>cocos3d+Bulletで物理シミュレーション (実装編) #cocos2d_2011_adcal</title>
         <description><![CDATA[<p>
<a href="http://twitter.com/#!/yoichineji" target="_blank">@yoichineji</a>さん主催の<a href="http://atnd.org/events/22814" target="_blank">cocos2d Advent Calendar 2011</a>、1日遅れで19日目の記事です。<br />
前日の記事: <a href="https://sites.google.com/site/cocos2dtiledmapd/home/gemuwo-zuorunara-xiao-guo-yin-sheng-bgmmo-bi-yaodayone" target="_blank">ゲームを作るなら効果音、声、BGMも必要だよね</a> (<a href="http://twitter.com/#!/aoi68k" target="_blank">@aoi68k</a>さん)
</p>
<p>
前回<a href="http://www.mybdesign.com/blog/2011/12/000044.html">導入編</a>の続きで、実装編です。<br />
サンプルコードは前回と同じものです。(<a href="http://www.mybdesign.com/blog/2011/12/16/cocos2dAdventCalendarDay16.zip">こちら</a>からダウンロードできます)<br />
固定された床にキューブが降り注ぎ、積み重なっていくデモです。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_07-62.html" onclick="window.open('http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_07-62.html','popup','width=320,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_07-thumb-160x240-62.png" width="160" height="240" alt="ccadcal16_07.png" class="mt-image-none" style="" /></a></span>
</p>
<br />
<h4>3Dモデルの読み込みと表示</h4>
<p>
cocos3dでの3Dモデルの読み込み・表示は、テンプレートから作成したプロジェクトのCC3World派生クラスにもある通り、とても簡単です。
</p>
<p>
<pre class="objc"><code>[<span class="keyword">self</span> <span class="method">addContentFromPODResourceFile</span>: <span class="string">@&quot;hello-world.pod&quot;</span>];</code></pre>
</p>
<p>
これだけ。
</p>
<p>
モデルのフォーマットはPOD(PowerVR Object Data)ですが、Collada2PODというツールでCOLLADAフォーマット(.dae)から変換できます。<br />
大概のモデリングツールはCOLLADAで出力できると思います。<br />
Collada2PODのダウンロードは<a href="http://www.imgtec.com/powervr/insider/powervr-collada2pod.asp" target="_blank">こちら</a>から(要サインアップ)。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal19_01-66.html" onclick="window.open('http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal19_01-66.html','popup','width=557,height=783,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal19_01-thumb-320x449-66.png" width="320" height="449" alt="ccadcal19_01.png" class="mt-image-none" style="" /></a></span>
</p>
<p>
Collada2PODの設定ファイル(Collada2PODSettings.txt)がcocos3dのToolsフォルダに同梱されているので、これをLoad Optionsから読み込んで変換するとうまい具合にいきます。
</p>
<p>
テクスチャを貼っている場合は、その画像をプロジェクトのリソースとして追加すればOKです。
</p>
<br />
<h4>物理シミュレーションの準備</h4>
<p>
物理シミュレーションの実装を記述するソースコードでbtBulletDynamicsCommon.hをimportします。
</p>
<p>
<pre class="objc"><code><span class="statement">#import</span> <span class="string">&quot;btBulletDynamicsCommon.h&quot;</span></code></pre>
</p>
<p>
BulletはC++で記述されているため、Objective-Cから使う場合はObjective-C++で記述します。<br />
該当するソースコードの拡張子を「.m」から「.mm」に変更します。
</p>
<p>
サンプルコードではcocos2dAdventCalendarDay16World.hでbtBulletDynamicsCommon.hをimportしているため、このヘッダファイルをimportしているすべてのファイルの拡張子が「.mm」になっていますが、実際にC++のコードを記述しているのはcocos2dAdventCalendarDay16World.mmだけです。
</p>
<br />
<h4>ダイナミクスワールドの作成</h4>
<p>
まず物理シミュレーションを行うための世界・ダイナミクス(力学)ワールドを作成します。<br />
今回は単純な剛体による物理シミュレーションのため、btDiscreteDynamicsWorldクラスを使います。
</p>
<p>
<pre class="objc"><code>collisionConfiguration = <span class="keyword">new</span> <span class="method">btDefaultCollisionConfiguration</span>();
collisionDispatcher = <span class="keyword">new</span> <span class="method">btCollisionDispatcher</span>(collisionConfiguration);
broadphaseInterface = <span class="keyword">new</span> <span class="method">btDbvtBroadphase</span>();
constraintSolver = <span class="keyword">new</span> <span class="method">btSequentialImpulseConstraintSolver</span>();
dynamicsWorld = <span class="keyword">new</span> <span class="method">btDiscreteDynamicsWorld</span>(collisionDispatcher, broadphaseInterface, constraintSolver, collisionConfiguration);
dynamicsWorld-><span class="method">setGravity</span>(<span class="method">btVector3</span>(<span class="number">0.0f</span>, <span class="number">-9.8f</span>, <span class="number">0.0f</span>));</code></pre>
</p>
<p>
最後にY軸のマイナス方向に1Gの重力を設定しています。
</p>
<br />
<h4>コリジョンシェイプの作成</h4>
<p>
コリジョンシェイプとは衝突判定を行うために物体がどんな形状をしているかを表すオブジェクトです。<br />
btCollisionShapeクラスを基底として、直方体、球、円柱、円錐、カプセル型などそれぞれの形状の派生クラスが用意されています。<br />
床用のコリジョンシェイプ(直方体)の作成はこんな感じです。
</p>
<p>
<pre class="objc"><code>groundCollisionShape = <span class="keyword">new</span> <span class="method">btBoxShape</span>(<span class="method">btVector3</span>(<span class="number">4.0f</span>, <span class="number">0.25f</span>, <span class="number">4.0f</span>));</code></pre>
</p>
<p>
コンストラクタの引数にX、Y、Z方向の大きさを渡して作成します。<br />
Bulletでは大きさを表すときによくhalf extent(半分の大きさ)が使われています。なので、このシェイプの大きさも縦横8×8、高さ0.5となります。
</p>
<p>
コリジョンシェイプは使い回すことができます。<br />
サンプルコードでも降り注ぐキューブの方は、一つのコリジョンシェイプをインスタンス変数として保持しておいて使い回しています。
</p>
<br />
<h4>モーションステートの作成</h4>
<p>
モーションステートとはBulletによる物理シミュレーションの結果変化した向きや位置を受け渡すためのインターフェースです。<br />
通常はbtMotionStateの派生クラスを自分で作る必要はないようなので、デフォルトのbtDefaultMotionStateクラスを使います。
</p>
<p>
<pre class="objc"><code><span class="class">btDefaultMotionState</span> *groundMotionState = <span class="keyword">new</span> <span class="method">btDefaultMotionState</span>(<span class="method">btTransform</span>(<span class="method">btQuaternion</span>(<span class="number">0.0f</span>, <span class="number">0.0f</span>, <span class="number">0.0f</span>, <span class="number">-1.0f</span>), 
  <span class="method">btVector3</span>(groundMeshNode.<span class="method">location</span>.x, groundMeshNode.<span class="method">location</span>.y, groundMeshNode.<span class="method">location</span>.z)));</code></pre>
</p>
<p>
コンストラクタに初期状態の回転・位置を示す変換情報を渡して作成します。位置は配置済みのCC3MeshNodeオブジェクトのlocationに合わせています。<br />
回転を示すクオータニオンのWが-1な理由は後ほど。
</p>
<br />
<h4>リジッドボディの作成</h4>
<p>
リジッドボディ(剛体)とはBulletにより物理シミュレーションを行う物体を表すオブジェクトです。<br />
先に作成しておいたコリジョンシェイプとモーションステートをリジッドボディに関連付けます。
</p>
<p>
<pre class="objc"><code><span class="class">btRigidBody</span>::<span class="class">btRigidBodyConstructionInfo</span> <span class="method">groundRigidBodyCI</span>(<span class="number">0.0f</span>, groundMotionState, groundCollisionShape, <span class="method">btVector3</span>(<span class="number">0.0f</span>, <span class="number">0.0f</span>, <span class="number">0.0f</span>));
<span class="class">btRigidBody</span> *groundRigidBody = <span class="keyword">new</span> <span class="method">btRigidBody</span>(groundRigidBodyCI);</code></pre>
</p>
<p>
btRigidBodyConstructionInfo構造体で、物体の質量、モーションステート、コリジョンシェイプ、慣性を設定します。
</p>
<p>
Bulletには、シミュレーションによって動かされる「動的剛体」、衝突するが動かない「静的剛体」、ユーザーによって動かされ動的剛体を押すことはできるがそれ自体は影響を受けない「キネマティック剛体」の3種類があります。<br />
質量を正の値にすると動的剛体、0にすると静的剛体になります。静的剛体にキネマティックフラグを設定するとキネマティック剛体になります。<br />
床は衝突するが動かない静的剛体なので、質量に0を指定しています。
</p>
<p>
降り注ぐキューブは動的剛体なので、以下のようなコードになります。
</p>
<p>
<pre class="objc"><code><span class="keyword">GLfloat</span> mass = <span class="number">1.0f</span>;
<span class="class">btVector3</span> localInertia(<span class="number">0.0f</span>, <span class="number">0.0f</span>, <span class="number">0.0f</span>);
cubeCollisionShape-><span class="method">calculateLocalInertia</span>(mass, localInertia);
<span class="comment">// (中略)</span>
<span class="class">btRigidBody</span>::<span class="class">btRigidBodyConstructionInfo</span> <span class="method">rigidBodyCI</span>(mass, motionState, cubeCollisionShape, localInertia);
<span class="class">btRigidBody</span> *rigidBody = <span class="keyword">new</span> <span class="method">btRigidBody</span>(rigidBodyCI);</code></pre>
</p>
<p>
動的剛体の場合は、慣性をcalculateLocalInertia()関数によって算出します。
</p>
<p>
こうして作成したリジッドボディには、パラメータで表面の摩擦や弾み具合など物体の材質を設定できます。<br />
このリジッドボディをダイナミクスワールドに追加することによって物理シミュレーションされるようになります。
</p>
<p>
<pre class="objc"><code>dynamicsWorld-><span class="method">addRigidBody</span>(rigidBody);</code></pre>
</p>
<br />
<h4>シミュレーションの実行</h4>
<p>
まずCCSchedulerを使って、更新用メソッドが毎フレーム呼ばれるようにしておきます。
</p>
<p>
<pre class="objc"><code>[[<span class="class">CCScheduler</span> <span class="method">sharedScheduler</span>] <span class="method">scheduleSelector</span>:<span class="keyword">@selector</span>(updatePhysics:) <span class="method">forTarget</span>:<span class="keyword">self</span> <span class="method">interval</span>:<span class="number">0</span> <span class="method">paused</span>:<span class="keyword">NO</span>];</code></pre>
</p>
<p>
更新用メソッドの方では、dynamicsWorldのstepSimulation()関数を呼びます。
</p>
<p>
<pre class="objc"><code>dynamicsWorld-><span class="method">stepSimulation</span>(dt, <span class="number">2</span>);</code></pre>
</p>
<p>
これで物理シミュレーションが1ステップ実行され、各物体の向きや位置が更新されます。<br />
あとは、各物体のモーションステートから変換情報を取り出して、対応するCC3Nodeオブジェクトに反映していけばいいわけです。
</p>
<p>
<pre class="objc"><code><span class="class">CC3MeshNode</span> *meshNode = cube.<span class="method">meshNode;</span>
<span class="class">btRigidBody</span> *rigidBody = cube.<span class="method">rigidBody;</span>

<span class="class">btTransform</span> transform;
rigidBody-><span class="method">getMotionState</span>()-><span class="method">getWorldTransform</span>(transform);
<span class="class">btVector3</span> pos = transform.<span class="method">getOrigin</span>();
meshNode.location = <span class="statement">cc3v</span>(pos.<span class="method">getX</span>(), pos.<span class="method">getY</span>(), pos.<span class="method">getZ</span>());
<span class="class">btQuaternion</span> quaternion = transform.<span class="method">getRotation</span>();
meshNode.quaternion = <span class="method">CC3Vector4Make</span>(quaternion.<span class="method">getX</span>(), quaternion.<span class="method">getY</span>(), quaternion.<span class="method">getZ</span>(), -quaternion.<span class="method">getW</span>());</code></pre>
</p>
<p>
物体の位置は座標をそのまま渡せばOKです。<br />
回転は、クオータニオンのWを-1倍して渡します。回転方向が合わず物体同士がめり込むことがあったのでこうしています。
</p>
<p>
完成したデモはこんな感じです。
</p>
<p>
<iframe width="420" height="315" src="http://www.youtube.com/embed/On2-497urMk?rel=0" frameborder="0" allowfullscreen></iframe>
</p>
<p>
ちょうど0.6.5がリリースされたcocos3dですが、3Dオブジェクトを簡単に扱え、かつ、CCActionによるアクションももちろん使えるという非常に便利なフレームワークです。<br />
ぜひ使ってみてください！
</p>
<br />
<p>
参考資料:<br />
cocos3d APIリファレンス<br />
<a href="http://brenwill.com/docs/cocos3d/0.6.5/api" target="_blank">http://brenwill.com/docs/cocos3d/0.6.5/api</a><br />
cocos3d プログラミングガイド<br />
<a href="http://brenwill.com/2011/cocos3d-programming-guide/" target="_blank">http://brenwill.com/2011/cocos3d-programming-guide/</a><br />
Bullet APIリファレンス<br />
<a href="http://bulletphysics.com/Bullet/BulletFull/" target="_blank">http://bulletphysics.com/Bullet/BulletFull/</a><br />
Bullet 日本語マニュアル<br />
<a href="http://bulletjpn.web.fc2.com/" target="_blank">http://bulletjpn.web.fc2.com/</a>
</p>
<br />
<p>
次の記事: <a href="http://d.hatena.ne.jp/Kanta/20111220/1324427540" target="_blank">Cocos3dをさわってみた。</a> (<a href="http://twitter.com/#!/kclab" target="_blank">@kclab</a>さん)
</p>
]]></description>
         <link>http://www.mybdesign.com/blog/2011/12/000045.html</link>
         <guid>http://www.mybdesign.com/blog/2011/12/000045.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">iPhone</category>
        
        
         <pubDate>Tue, 20 Dec 2011 23:00:00 +0900</pubDate>
      </item>
      
      <item>
         <title>cocos3d+Bulletで物理シミュレーション (導入編) #cocos2d_2011_adcal</title>
         <description><![CDATA[<p>
<a href="http://twitter.com/#!/yoichineji" target="_blank">@yoichineji</a>さん主催の<a href="http://atnd.org/events/22814" target="_blank">cocos2d Advent Calendar 2011</a>、16日目の記事です。<br />
前日の記事: <a href="http://d.hatena.ne.jp/Seasons/20111214/1323887397" target="_blank">CCSendMessagesでもっと簡潔に直感的なコードを書こう</a> (<a href="http://twitter.com/#!/Seasons" target="_blank">@Seasons</a>さん)
</p>
<p>
今回はcocos2d上で3Dオブジェクトを扱えるフレームワーク「cocos3d」とオープンソースの物理演算エンジン「Bullet」を使って物理シミュレーションをしてみます。<br />
サンプルコードは<span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://www.mybdesign.com/blog/2011/12/16/cocos2dAdventCalendarDay16.zip">こちら</a></span>からダウンロードできます。
</p>
<br />
<h4>cocos3dの導入</h4>
<p>
cocos3dは<a href="http://brenwill.com/cocos3d/" target="_blank">http://brenwill.com/cocos3d/</a>の右カラムの「DOWNLOAD COCOS3D」からダウンロードできます。<br />
執筆時点での最新バージョンは0.6.4です。
</p>
<p>
Terminalで解凍したフォルダへ移動し、cocos2dのパスを指定してインストールスクリプトを実行すると、Xcodeのテンプレートがインストールされます。<br />
この操作は管理者権限で実行する必要があります。
</p>
<p>
<pre><code>$ cd cocos3d\ 0.6.4
$ ./install-cocos3d.sh -u -f -2 &quot;../cocos2d-iphone-1.0.1&quot;</code></pre>
</p>
<br />

<h4>cocos3dのプロジェクトを作成する</h4>
<p>
Xcodeのメニュー File → New → New Project... を選択し、iOS / cocos3dから「cocos3d Application」を選択します。<br />
プロジェクト名を付けて適当な場所に保存します。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_01-42.html" onclick="window.open('http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_01-42.html','popup','width=728,height=491,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_01-thumb-512x345-42.png" width="512" height="345" alt="ccadcal16_01.png" class="mt-image-none" style="" /></a></span>
</p>
<p>
これをそのままビルド・実行してみるとHello worldの文字が回転します。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_02-45.html" onclick="window.open('http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_02-45.html','popup','width=320,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_02-thumb-160x240-45.png" width="160" height="240" alt="ccadcal16_02.png" class="mt-image-none" style="" /></a></span>
</p>
<br />

<h4>Bulletの導入</h4>
<p>
Bulletは<a href="http://bulletphysics.org/wordpress/" target="_blank">http://bulletphysics.org/wordpress/</a>の左上の「Bullet Download」からダウンロードできます。<br />
執筆時点での最新バージョンは2.79です。
</p>
<p>
今回は、Bulletを静的ライブラリとして導入します。<br />
解凍したフォルダ内にあるsrcフォルダをプロジェクトフォルダにコピーして、名前をBulletに変更しておきます。<br />
Project Navigatorでプロジェクトを選択して下のAdd Targetをクリック、Mac OS X / Framework &amp; Libraryから「C/C++ Library」を選択します。<br />
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_03-48.html" onclick="window.open('http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_03-48.html','popup','width=1170,height=629,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_03-thumb-512x275-48.png" width="512" height="275" alt="ccadcal16_03.png" class="mt-image-none" style="" /></a></span>
</p>
<p>
Product Nameは「Bullet」、Typeは「Static」にして、Use Automatic Reference Countingはオフにしておきます。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_04-52.html" onclick="window.open('http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_04-52.html','popup','width=728,height=491,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_04-thumb-512x345-52.png" width="512" height="345" alt="ccadcal16_04.png" class="mt-image-none" style="" /></a></span>
</p>
<p>
Xcodeのメニュー File → Add Files to &quot;&lt;プロジェクト名&gt;&quot;... を選択して、Bulletのソースファイルをプロジェクトに追加します。<br />
このときAdd to targetsで「Bullet」にチェックして、先ほどのBulletフォルダを指定します。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_05-55.html" onclick="window.open('http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_05-55.html','popup','width=585,height=614,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_05-thumb-512x537-55.png" width="512" height="537" alt="ccadcal16_05.png" class="mt-image-none" style="" /></a></span>
</p>
<p>
Project Navigatorでビルドしないファイルの参照をごそっと削除します。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_06-58.html" onclick="window.open('http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_06-58.html','popup','width=534,height=660,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_06-thumb-267x330-58.png" width="267" height="330" alt="ccadcal16_06.png" class="mt-image-none" style="" /></a></span>
</p>
<p>
プロジェクトのBuild Settingsを変更します。
</p>
<ul class="condensed">
<li>Header Search PathsにBulletフォルダへのパス($SRCROOT/$PROJECT_NAME/Bullet)をRecursiveで追加。</li>
</ul>
<p>
BulletのターゲットのBuild Settingsを変更します。
</p>
<ul class="condensed">
<li>Base SDKを「Latest iOS」に変更。</li>
<li>Architecturesを「Standard (armv7)」に変更。</li>
<li>Other Linker Flagsから「-lz」を外す。</li>
</ul>
<p>
アプリケーションターゲットのBuild Settingsを変更します。
</p>
<ul class="condensed">
<li>Build Phases → Target Dependencies の+ボタンを押してBulletを追加。</li>
<li>Build Phases → Link Binary With Libraries の+ボタンを押してlibBullet.aを追加。</li>
</ul>
<br />
<p>
さて、ようやくこれでコードを書く準備ができました。<br />
思いのほか長くなってしまったのでここまでを導入編として、実際の物理シミュレーションの実装は次の機会にしたいと思います。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_07-62.html" onclick="window.open('http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_07-62.html','popup','width=320,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal16_07-thumb-160x240-62.png" width="160" height="240" alt="ccadcal16_07.png" class="mt-image-none" style="" /></a></span><br />
こんな感じになります！
</p>
<p>
次の記事: <a href="http://ettan.jp/sb.cgi?eid=606" target="_blank">よく分かってない人がgoogle先生と一緒につくるはじめてのBox2D</a> (<a href="http://twitter.com/#!/marchEnterprise" target="_blank">@marchEnterprise</a>さん)
</p>]]></description>
         <link>http://www.mybdesign.com/blog/2011/12/000044.html</link>
         <guid>http://www.mybdesign.com/blog/2011/12/000044.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">iPhone</category>
        
        
         <pubDate>Fri, 16 Dec 2011 00:22:35 +0900</pubDate>
      </item>
      
      <item>
         <title>CCMenuでラベル付きボタン、長押しボタン #cocos2d_2011_adcal</title>
         <description><![CDATA[<p>
<a href="http://twitter.com/#!/yoichineji" target="_blank">@yoichineji</a>さん主催の<a href="http://atnd.org/events/22814" target="_blank">cocos2d Advent Calendar 2011</a>に乗っかってみたので、久しぶりにブログを書きます。<br />
クリスマスまでの毎日、cocos2dに関するTipsを1日1つブログにするというイベントです。<br />
前日の記事: <a href="http://katokichisoft.tumblr.com/post/13915890474/ccmotionstreak" target="_blank">CCMotionStreakを使えばライントレースアプリも簡単</a> (<a href="http://twitter.com/#!/hkato193" target="_blank">@hkato193</a>さん)
</p>
<p>
cocos2dを使っていてよくやることの、本当にちょっとしたTipsなので、すでにご存知の方はご容赦を...。<br />
サンプルコードは<span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://www.mybdesign.com/blog/2011/12/09/cocos2dAdventCalendarDay9.zip">こちら</a></span>からダウンロードできます。
</p>
<br />
<h4>ラベル付きボタン</h4>
<p>
cocos2dでボタンを実装するときにはCCMenuを使います。<br />
押されていない状態(normal)、押された状態(selected)、押せない状態(disabled)のそれぞれの画像(スプライト)を設定するだけで簡単にボタンを実装できます。<br />
</p>
<p>
<pre class="objc"><code><span class="class">CCSprite</span> *normalSprite = [<span class="class">CCSprite</span> <span class="method">spriteWithFile</span>:<span class="string">@"button_normal.png"</span>];
<span class="class">CCSprite</span> *selectedSprite = [<span class="class">CCSprite</span> <span class="method">spriteWithFile</span>:<span class="string">@"button_selected.png"</span>];
<span class="class">CCSprite</span> *disabledSprite = [<span class="class">CCSprite</span> <span class="method">spriteWithFile</span>:<span class="string">@"button_disabled.png"</span>];

<span class="class">CCMenuItemSprite</span> *menuItem = [<span class="class">CCMenuItemSprite</span> <span class="method">itemFromNormalSprite</span>:normalSprite 
                                                     <span class="method">selectedSprite</span>:selectedSprite 
                                                     <span class="method">disabledSprite</span>:disabledSprite 
                                                             <span class="method">target</span>:<span class="keyword">self</span> 
                                                           <span class="method">selector</span>:<span class="keyword">@selector</span>(didPressButton:)];
<span class="class">CCMenu</span> *menu = [<span class="class">CCMenu</span> <span class="method">menuWithItems</span>:menuItem, <span class="keyword">nil</span>];</code></pre>
</p>
<p>
selected、disabledの画像を別に作らなくても、スプライトを半透明にすることで見た目を変えることはよくやります。
</p>
<p>
<pre class="objc"><code><span class="class">CCSprite</span> *normalSprite = [<span class="class">CCSprite</span> <span class="method">spriteWithFile</span>:<span class="string">@"button.png"</span>];
<span class="class">CCSprite</span> *selectedSprite = [<span class="class">CCSprite</span> <span class="method">spriteWithFile</span>:<span class="string">@"button.png"</span>];
selectedSprite.opacity = <span class="number">0x7f</span>; <span class="comment">// 半透明にする</span>
<span class="class">CCSprite</span> *disabledSprite = [<span class="class">CCSprite</span> <span class="method">spriteWithFile</span>:<span class="string">@"button.png"</span>];
disabledSprite.opacity = <span class="number">0x7f</span>; <span class="comment">// 半透明にする</span>

<span class="class">CCMenuItemSprite</span> *menuItem = [<span class="class">CCMenuItemSprite</span> <span class="method">itemFromNormalSprite</span>:normalSprite 
                                                     <span class="method">selectedSprite</span>:selectedSprite 
                                                     <span class="method">disabledSprite</span>:disabledSprite 
                                                             <span class="method">target</span>:<span class="keyword">self</span> 
                                                           <span class="method">selector</span>:<span class="keyword">@selector</span>(didPressButton:)];
<span class="class">CCMenu</span> *menu = [<span class="class">CCMenu</span> <span class="method">menuWithItems</span>:menuItem, <span class="keyword">nil</span>];</code></pre>
</p>
<p>
また、メニューなど形は同じで書かれている文字が違うだけのボタンをいくつも用意する、ということもよくあります。<br />
そんなときはCCMenuItemの子にCCLabelを追加します。
</p>
<p>
<pre class="objc"><code><span class="class">CCLabelTTF</span> *label = [<span class="class">CCLabelTTF</span> <span class="method">labelWithString</span>:<span class="string">@"PUSH!"</span> 
                                       <span class="method">fontName</span>:<span class="string">@"Arial"</span> <span class="method">fontSize</span>:<span class="number">20.0f</span>];
[menuItem <span class="method">addChild</span>:label];</code></pre>
</p>
<p>
さてここで問題なのですが、半透明にしたスプライトをselected、disabledの画像に設定しても文字の方は半透明にならないので、ちょっと浮いてしまいます。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal01-32.html" onclick="window.open('http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal01-32.html','popup','width=964,height=320,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal01-thumb-512x169-32.png" width="512" height="169" alt="ccadcal01.png" class="mt-image-none" style="" /></a></span>
(左:通常の状態、右:ボタンが押された状態)
</p>
<p>
そこで、CCMenuItemSpriteを拡張して、ボタンのスプライトが切り替わるタイミングで子要素にもスプライトの透明度が反映されるようにしてやります。
</p>
<p>
<pre class="objc"><code><span class="keyword">@implementation</span> <span class="class">ExMenuItemSprite</span>

- (<span class="keyword">void</span>)adaptChildrenAppearanceTo:(<span class="class">CCNode</span> <CCRGBAProtocol> *)target
{
    <span class="keyword">for</span>(<span class="class">CCNode</span> *node in children_)
    {
        <span class="keyword">if</span>([node <span class="method">isEqual</span>:normalImage_] || [node <span class="method">isEqual</span>:selectedImage_] || [node <span class="method">isEqual</span>:disabledImage_])
            <span class="keyword">continue</span>;
        
        <span class="keyword">if</span>(![node <span class="method">conformsToProtocol</span>:<span class="keyword">@protocol</span>(CCRGBAProtocol)])
            <span class="keyword">continue</span>;
        
        [(<span class="class">CCNode</span> <CCRGBAProtocol> *)node <span class="method">setOpacity</span>:[target <span class="method">opacity</span>]];
    }
}

- (<span class="keyword">void</span>)selected
{
    [<span class="keyword">super</span> <span class="method">selected</span>];
    [<span class="keyword">self</span> <span class="method">adaptChildrenAppearanceTo</span>:selectedImage_];
}

- (<span class="keyword">void</span>)unselected
{
    [<span class="keyword">super</span> <span class="method">unselected</span>];
    [<span class="keyword">self</span> <span class="method">adaptChildrenAppearanceTo</span>:normalImage_];
}

- (<span class="keyword">void</span>)setIsEnabled:(<span class="keyword">BOOL</span>)enabled
{
    [<span class="keyword">super</span> <span class="method">setIsEnabled</span>:enabled];
    
    <span class="keyword">if</span>(enabled)
    {
        <span class="keyword">if</span>(<span class="keyword">self</span>.isSelected)
            [<span class="keyword">self</span> <span class="method">adaptChildrenAppearanceTo</span>:selectedImage_];
        <span class="keyword">else</span>
            [<span class="keyword">self</span> <span class="method">adaptChildrenAppearanceTo</span>:normalImage_];
    }
    <span class="keyword">else</span>
    {
        <span class="keyword">if</span>(<span class="keyword">self</span>.disabledImage)
            [<span class="keyword">self</span> <span class="method">adaptChildrenAppearanceTo</span>:disabledImage_];
        <span class="keyword">else</span>
            [<span class="keyword">self</span> <span class="method">adaptChildrenAppearanceTo</span>:normalImage_];
    }
}

<span class="keyword">@end</span></code></pre>
</p>
<p>
adaptChildrenAppearanceTo:というメソッドの引数に画像を渡すと、その画像と同じ透明度を子要素に設定していきます。<br />
あとはボタンが押されたとき(selected)、離されたとき(unselected)、使用可・不可状態が変わったとき(setIsEnabled:)に、状況に合った画像を引数にしてadaptChildrenAppearanceTo:を呼べばいい、という寸法です。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal02-35.html" onclick="window.open('http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal02-35.html','popup','width=964,height=320,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal02-thumb-512x169-35.png" width="512" height="169" alt="ccadcal02.png" class="mt-image-none" style="" /></a></span>
これでバッチリ！
</p>
<br />
<h4>長押しボタン</h4>
<p>
指をなるべく動かさず素早くボタンの機能を切り替える、というようなことが必要なシチュエーションがあったので、長押しボタンを実装してみました。<br />
CCMenuではタッチイベントは個々のボタンであるCCMenuItemではなく、CCMenuで扱っています。<br />
そこでCCMenuを拡張して、タッチの開始時にタイマーを仕込み、タッチが終了する前にタイマーが作動したら長押しされたことにするようにしました。
</p>
<p>
<pre class="objc"><code><span class="keyword">@implementation</span> <span class="class">ExMenu</span>

- (id)init
{
    <span class="keyword">if</span>((<span class="keyword">self</span> = [<span class="keyword">super</span> <span class="method">init</span>]))
    {
        longPressTimer = <span class="keyword">nil</span>;
        longPressState = kExMenuLongPressStateNone;
    }
    <span class="keyword">return</span> <span class="keyword">self</span>;
}

- (<span class="keyword">void</span>)dealloc
{
    <span class="keyword">if</span>(longPressTimer != <span class="keyword">nil</span>)
        [longPressTimer <span class="method">invalidate</span>];
    
    [<span class="keyword">super</span> <span class="method">dealloc</span>];
}

- (<span class="keyword">BOOL</span>)ccTouchBegan:(<span class="class">UITouch</span> *)touch withEvent:(<span class="class">UIEvent</span> *)event
{
    <span class="keyword">BOOL</span> result = [<span class="keyword">super</span> <span class="method">ccTouchBegan</span>:touch <span class="method">withEvent</span>:event];
    <span class="keyword">if</span>(result)
    {
        <span class="keyword">if</span>(longPressTimer != <span class="keyword">nil</span>)
            [longPressTimer <span class="method">invalidate</span>];
        
        longPressTimer = [NSTimer <span class="method">scheduledTimerWithTimeInterval</span>:kExMenuLongPressInterval 
                                                          <span class="method">target</span>:<span class="keyword">self</span> selector:<span class="keyword">@selector</span>(didFireLongPressTimer:) 
                                                        <span class="method">userInfo</span>:<span class="keyword">nil</span> <span class="method">repeats</span>:<span class="keyword">NO</span>];
        longPressState = kExMenuLongPressStateBegan;
    }
    <span class="keyword">else</span>
    {
        longPressState = kExMenuLongPressStateNone;
    }
    
    <span class="keyword">return</span> result;
}

-(<span class="keyword">void</span>) ccTouchMoved:(<span class="class">UITouch</span> *)touch withEvent:(<span class="class">UIEvent</span> *)event
{
    <span class="keyword">if</span>(longPressState == kExMenuLongPressStateFired)
    {
        <span class="comment">// didFireLongPressTimerでccTouchEndedを呼ぶのでここでは呼ばない</span>
    }
    <span class="keyword">else</span>
    {
        [<span class="keyword">super</span> <span class="method">ccTouchMoved</span>:touch <span class="method">withEvent</span>:event];
    }
}

- (<span class="keyword">void</span>)ccTouchEnded:(<span class="class">UITouch</span> *)touch withEvent:(<span class="class">UIEvent</span> *)event
{
    <span class="keyword">if</span>(longPressTimer != <span class="keyword">nil</span>)
    {
        [longPressTimer <span class="method">invalidate</span>];
        longPressTimer = <span class="keyword">nil</span>;
    }
    
    <span class="keyword">if</span>(longPressState == kExMenuLongPressStateFired)
    {
        <span class="comment">// didFireLongPressTimerでccTouchEndedを呼ぶのでここでは呼ばない</span>
    }
    <span class="keyword">else</span>
    {
        longPressState = kExMenuLongPressStateNone;
        [<span class="keyword">super</span> <span class="method">ccTouchEnded</span>:touch <span class="method">withEvent</span>:event];
    }
}

- (<span class="keyword">void</span>)ccTouchCancelled:(<span class="class">UITouch</span> *)touch withEvent:(<span class="class">UIEvent</span> *)event
{
    <span class="keyword">if</span>(longPressTimer != <span class="keyword">nil</span>)
    {
        [longPressTimer <span class="method">invalidate</span>];
        longPressTimer = <span class="keyword">nil</span>;
    }
    
    longPressState = kExMenuLongPressStateNone;
    [<span class="keyword">super</span> <span class="method">ccTouchCancelled</span>:touch <span class="method">withEvent</span>:event];
}

- (<span class="keyword">void</span>)didFireLongPressTimer:(<span class="class">NSTimer</span> *)timer
{
    longPressTimer = <span class="keyword">nil</span>;
    
    <span class="keyword">if</span>(longPressState == kExMenuLongPressStateBegan)
    {
        longPressState = kExMenuLongPressStateFired;
        [<span class="keyword">super</span> <span class="method">ccTouchEnded</span>:<span class="keyword">nil</span> <span class="method">withEvent</span>:<span class="keyword">nil</span>];
    }
    <span class="keyword">else</span>
    {
        longPressState = kExMenuLongPressStateNone;
    }
}

- (<span class="keyword">BOOL</span>)isLongPress
{
    <span class="keyword">return</span> (longPressState == kExMenuLongPressStateFired);
}

<span class="keyword">@end</span></code></pre>
</p>
<p>
ccTouchBegan:withEvent:でNSTimerのインスタンスを作って、一定時間後にdidFireLongPressTimer:が呼ばれるようにタイマーを始動します。<br />
didFireLongPressTimer:ではlongPressStateに長押しが成立したという状態を記憶していて、superのccTouchEnded:withEvent:を呼びます。<br />
すると、押されたボタンに設定されているセレクタが通常通り呼ばれるので、ボタンの親であるExMenuのisLongPressメソッドを参照して処理を分岐させることができる、という仕組みです。
</p>
<p>
<pre class="objc"><code>- (<span class="keyword">void</span>)didPressButton:(<span class="class">CCMenuItem</span> *)sender
{
     <span class="class">ExMenu</span> *menu = (<span class="class">ExMenu</span> *)sender.parent;
     <span class="keyword">if</span>([menu <span class="method">isLongPress</span>])
     {
         <span class="comment"> // 長押しされた！</span>
     }
}</code></pre>
</p>
<p>
サンプルでは、CCMenuItemToggleを使ってボタンを長押しするともうひとつのボタンとトグルで切り替わるようにしてみました。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal03-38.html" onclick="window.open('http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal03-38.html','popup','width=964,height=320,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.mybdesign.com/blog/assets_c/2011/12/ccadcal03-thumb-512x169-38.png" width="512" height="169" alt="ccadcal03.png" class="mt-image-none" style="" /></a></span>
</p>
<br />
<p>
さて、<a href="http://atnd.org/events/22814" target="_blank">cocos2d Advent Calendar 2011</a>もここから2周目に入りそうです。<br />
まだまだ参加枠はあるようなので小粋なTipsをお持ちの方、ぜひ参加してみませんか？
</p>
<p>
次の記事: <a href="http://xionchannel.blogspot.com/2011/12/coco2d-advent-calendar-2011-10-cocos2d.html" target="_blank">cocos2dキャラクタークラス設計の考察</a> (<a href="http://twitter.com/#!/ajinotataki" target="_blank">@ajinotataki</a>さん)
</p>]]></description>
         <link>http://www.mybdesign.com/blog/2011/12/000043.html</link>
         <guid>http://www.mybdesign.com/blog/2011/12/000043.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">iPhone</category>
        
        
         <pubDate>Fri, 09 Dec 2011 01:18:37 +0900</pubDate>
      </item>
      
      <item>
         <title>Visual Studio 2010 ProfessionalでWindows Phone 7の開発。</title>
         <description><![CDATA[もろもろ事情があってWindows Phone 7の開発環境を整えていますが、その際にちょっとはまったことをメモ。

元々MacにParallelsで入れたWindows 7上にVisual Studio 2010 Professionalを入れていたので、これで開発すればいいかー、と思っていたら、WP7のSDKはVS 2010 Express、Expression Blendなどがオール・イン・ワン・パッケージになっていて、普通にインストールしただけではテンプレートがProfessionalの方には適用されませんでした。

メニューは英語だけどまあいいかと、HelloWorldを作るところまではExpressを使っていましたが、本格的に開発を始めようとしたところでExpressではインデントにタブコードを挿入できないらしいことに気がつき、以下の記事を参考にProfessionalの方にWP7のテンプレートを入れました。

<a href="http://blogs.msdn.com/b/shintak/archive/2010/09/22/10065767.aspx" target="_blank">Phone 7 に届くまで #52：VS2010 日本語環境にWP7のテンプレートを入れる - 高橋 忍のブログ - Site Home - MSDN Blogs</a>

2.と3.の間にシステムを再起動しないと4.がうまく実行されませんでしたが、これでタブでインデントもできて、メニューも日本語に。

ちなみに、デスクトップのSilverlightと同じように開発できるらしいので、<a href="http://www.mybdesign.com/blog/2010/08/000037.html">こちらの記事</a>が参考になるかもしれませんよ！]]></description>
         <link>http://www.mybdesign.com/blog/2011/05/000042.html</link>
         <guid>http://www.mybdesign.com/blog/2011/05/000042.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">Silverlight</category>
        
          <category domain="http://www.sixapart.com/ns/types#category">Windows Phone 7</category>
        
        
         <pubDate>Sat, 28 May 2011 02:02:38 +0900</pubDate>
      </item>
      
      <item>
         <title>有料iPhone/iPadアプリの3月分売り上げを義援金として寄付しました。</title>
         <description><![CDATA[Appleからの有料iPhone/iPadアプリの3月分売り上げ入金額の明細が届いたので、振り込みに行ってきました。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/images/IMG_1609.JPG"><img alt="IMG_1609.JPG" src="http://www.mybdesign.com/blog/assets_c/2011/05/IMG_1609-thumb-480x358-30.jpg" width="480" height="358" class="mt-image-none" style="" /></a></span>

売り上げは31,330円、手数料等が4,000円で差し引き27,330円の入金だったので、27,330円を日本赤十字社に寄付しました。微々たる金額ですが、復興の一助になればと思います。
今後もアプリを通じて復興の支援をしていきたいと思います。

<p style="margin:2em 0px; text-align:center;">
<a href="http://sites.google.com/site/quake20110311jp/bokin" target="_blank"><img alt="banner.jpg" src="http://www.mybdesign.com/blog/images/banner.jpg" width="468" height="60" class="mt-image-none" style="" /></a><br />
</p>

<a href="http://www.facebook.com/uuuu.to?sk=app_6009294086" target="_blank"> 株式会社フォーユーさんの制作されたバナー</a>を使わせていただいています。ありがとうございます！]]></description>
         <link>http://www.mybdesign.com/blog/2011/05/000041.html</link>
         <guid>http://www.mybdesign.com/blog/2011/05/000041.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">Misc</category>
        
        
         <pubDate>Fri, 06 May 2011 12:33:59 +0900</pubDate>
      </item>
      
      <item>
         <title>東北地方太平洋沖地震に際して、有料iPhone/iPadアプリの3月分売り上げ全額を寄付することにしました。</title>
         <description><![CDATA[東北地方太平洋沖地震で被災された方々に、心からお見舞いを申し上げます。

微力ながら復興の一助になればと思い、現在リリースしている有料のiPhone/iPadアプリの3月分売り上げを、手数料を引いてAppleから振り込まれた金額全額を義援金として寄付することにしました。(寄付先は今のところ、日本赤十字社を予定しています)
3月分の売り上げが確定して振り込まれるのは、4月末ごろの見込みです。そのころにまた結果を報告したいと思います。

対象のアプリはこちらです:

<a href="http://itunes.apple.com/jp/app/spam-eater/id315225651?mt=8" target="_blank"><img alt="se_icon_75.jpg" src="http://www.mybdesign.com/blog/images/se_icon_75.jpg" width="75" height="75" class="mt-image-none" style="" /><br />Spam Eater</a>
メールサーバー上でスパムメールを除去するツール。(*POP3のみ対応)

<a href="http://itunes.apple.com/jp/app/the-twins/id374188249?mt=8" target="_blank"><img alt="tt_icon_75.jpg" src="http://www.mybdesign.com/blog/images/tt_icon_75.jpg" width="75" height="75" class="mt-image-none" style="" /><br />The Twins</a>
iPad専用！上下のバーで打ち返すブロック崩し。

<a href="http://tmokita.net/blog/?p=292" target="_blank">こちらの記事</a>で触れられていますが、寄付"だけ"を目的にアプリを購入することは効率がよろしくないです。アプリが気になった方はぜひ購入してください。

その他にも、現在位置をメールなどで知らせることができるアプリ、"Signal Fire"も無料でリリースしています。こちらもお役に立てれば。

<a href="http://itunes.apple.com/jp/app/signal-fire/id287411474?mt=8"><img alt="sf_icon_75.jpg" src="http://www.mybdesign.com/blog/images/sf_icon_75.jpg" width="75" height="75" class="mt-image-none" style="" />
Signal Fire</a>

<p style="margin:2em 0px; text-align:center;">
<a href="http://sites.google.com/site/quake20110311jp/bokin" target="_blank"><img alt="banner.jpg" src="http://www.mybdesign.com/blog/images/banner.jpg" width="468" height="60" class="mt-image-none" style="" /></a><br />
</p>

<a href="http://www.facebook.com/uuuu.to?sk=app_6009294086" target="_blank"> 株式会社フォーユーさんの制作されたバナー</a>を使わせていただいています。ありがとうございます！

2011-03-16 バナーのリンク先を変更。バナーの配布元を追加。]]></description>
         <link>http://www.mybdesign.com/blog/2011/03/000040.html</link>
         <guid>http://www.mybdesign.com/blog/2011/03/000040.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">Misc</category>
        
        
         <pubDate>Tue, 15 Mar 2011 18:35:49 +0900</pubDate>
      </item>
      
      <item>
         <title>6th gen iPod nanoでNike+ その2。</title>
         <description><![CDATA[<a href="http://www.mybdesign.com/blog/2010/09/000038.html">昨日</a>代用品で手首装着して調子良かったので、スポーツショップにリストバンドを買いに行ってきました。

とはいえ、やはり売っているのはよくあるタオル地の厚みのあるものばかりで、nanoをクリップするにはちょっと不安な感じ。...ふと見るとワックル・リストというシリコン製のリストバンドが売っていたので、買ってみました。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2010/09/IMG_0993-thumb-320x428-19.jpg"><img alt="IMG_0993.JPG" src="http://www.mybdesign.com/blog/assets_c/2010/09/IMG_0993-thumb-320x428-19.jpg" width="320" height="428" class="mt-image-none" style="" /></a></span>

こんなの。2,100円とお高いですが、ゲルマニウム付きなので血行がよくなりそう。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2010/09/IMG_0995-thumb-320x428-21.jpg"><img alt="IMG_0995.JPG" src="http://www.mybdesign.com/blog/assets_c/2010/09/IMG_0995-thumb-320x428-21.jpg" width="320" height="428" class="mt-image-none" style="" /></a></span>

早速装着！...どう見ても髪留めのゴムです。

しかし、シリコン製なので汗をかいても滑らず、上の写真のような平たい部分をクリップしているので安定感はバッチリで、走行中も外れそうになることはありませんでした。
これでより快適にNike+を活用できそうです。]]></description>
         <link>http://www.mybdesign.com/blog/2010/09/000039.html</link>
         <guid>http://www.mybdesign.com/blog/2010/09/000039.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">Misc</category>
        
        
         <pubDate>Tue, 14 Sep 2010 00:06:25 +0900</pubDate>
      </item>
      
      <item>
         <title>6th gen iPod nanoでNike+。</title>
         <description><![CDATA[<a href="http://www.mybdesign.com/blog/2008/09/000018.html">およそ2年前</a>、4th gen iPod nanoでNike+を始めましたが、色々あって中断したりして、また再び7月ごろから再開していました。

そして今日、6th gen iPod nano (8GB)が手元に届いたので早速Nike+で使ってみました。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2010/09/IMG_0991-thumb-320x428-15.jpg"><img alt="IMG_0991.JPG" src="http://www.mybdesign.com/blog/assets_c/2010/09/IMG_0991-thumb-320x428-15.jpg" width="320" height="428" class="mt-image-none" style="" /></a></span>

4th genと6th gen。パースがついているので分かりづらいけど横幅はほぼ同じ。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.mybdesign.com/blog/assets_c/2010/09/IMG_0992-thumb-320x428-17.jpg"><img alt="IMG_0992.JPG" src="http://www.mybdesign.com/blog/assets_c/2010/09/IMG_0992-thumb-320x428-17.jpg" width="320" height="428" class="mt-image-none" style="" /></a></span>

Nike+のレシーバーをつけて腕に乗せてみたところ。<a href="http://www.google.com/images?client=safari&rls=en&q=ビデオシーバー&oe=UTF-8&um=1&ie=UTF-8&source=univ&ei=RvSMTLz4BIaycMvXyKIE&sa=X&oi=image_result_group&ct=title&resnum=4&ved=0CDUQsAQwAw&biw=1175&bih=764" target="_blank">ビデオシーバー</a>みたくなるかと思ったら、結構不格好でした。

4th genは純正のアームバンドで腕に固定していましたが、結構外れやすいので走行中気にしながら使っていました。また画面を見ながら操作できないのもネックでした。
6th genならリストバンドをしてそこにクリップすれば見ながら操作できるし、アームバンドよりも安定して良さそう！と思い、早速実践してみました。

リストバンドが手元にないのでとりあえずスポーツ用の眼鏡ストラップで代用しましたが、がっちりクリップできて安定度は上々、やはり手元で見ながら操作できるのは快適です。
その他、4th genと違った点はこんな感じ。
<ul class="condensed"><li>ワークアウトの時間が、1分単位で設定できるようになった(4th genは5分単位)。</li><li>一度スワイプする必要はあるが、Power Songボタンが画面に出てくるので分かりやすい。</li><li>ボタンを押した時の途中経過の読み上げが、ちょっと早口で機械っぽくなった。</li><li>今まではあまり気味だったヘッドフォンのコードが逆にほんの少し足りないくらいになった(つける位置が変わったので当たり前だけど)。</li></ul>

とまあ、すこぶるいい感じです。
とりあえずリストバンドと10cmくらいのヘッドフォン延長コードを買ってこようと思います。]]></description>
         <link>http://www.mybdesign.com/blog/2010/09/000038.html</link>
         <guid>http://www.mybdesign.com/blog/2010/09/000038.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">Misc</category>
        
        
         <pubDate>Sun, 12 Sep 2010 23:58:53 +0900</pubDate>
      </item>
      
      <item>
         <title>日曜プログラマーのためのVisual Studio 2010入門。</title>
         <description><![CDATA[ASCII.jpさんで、「日曜プログラマーのためのVisual Studio 2010入門」と題してSilverlightの機能を活用したインタラクティブコンテンツの制作をいたしました。
癒しをテーマにして、女優の青山倫子さんをフィーチャーしています。

RSSから取得した天気情報に合わせて背景画像が変わるのを基本に、時刻に合わせて青山さんの写真が切り替わる「倫子時計」、ピクセルシェーダーを使ってムービーを合成している「倫子の詩」、ウェブカメラやドラッグ&ドロップされた画像を合成する「倫子カメラ」の機能が楽しめます。

全4回の記事掲載で連載は終了していますが、コンテンツは閲覧可能なのでぜひ見てみてください。

<a href="http://ascii.jp/ad/noriko/" target="_blank">日曜プログラマーのためのVisual Studio 2010入門</a> (要Silverlight)

メイキング記事:
<a href="http://ascii.jp/elem/000/000/531/531873/" target="_blank">第1回　制作開始！　青山倫子さんをフィーチャーしたら？</a>
<a href="http://ascii.jp/elem/000/000/536/536354/" target="_blank">第2回　Visual Studio 2010で始めるSilverlightコンテンツ制作</a>
<a href="http://ascii.jp/elem/000/000/536/536355/" target="_blank">第3回　青山倫子さんに詩を朗読してもらおう！</a>
<a href="http://ascii.jp/elem/000/000/536/536356/" target="_blank">最終回　ドラッグ＆ドロップで、青山倫子さんとツーショットを撮る</a>]]></description>
         <link>http://www.mybdesign.com/blog/2010/08/000037.html</link>
         <guid>http://www.mybdesign.com/blog/2010/08/000037.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">Silverlight</category>
        
          <category domain="http://www.sixapart.com/ns/types#category">Web</category>
        
        
         <pubDate>Mon, 30 Aug 2010 23:38:37 +0900</pubDate>
      </item>
      
      <item>
         <title>Dashbot 0.1.0を公開しました。</title>
         <description><![CDATA[Twitterに自動的にツイートを投稿したり、返信したりする、人工無能botを手軽に作れるDashboard Widget、「<a href="http://www.mybdesign.com/widgets/db/index.html">Dashbot</a>」を公開しました。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="db_window.jpg" src="http://www.mybdesign.com/blog/images/db_window.jpg" width="376" height="180" class="mt-image-none" style="" /></span>

通常のツイートは、一定時間ごとにランダムまたは連続で投稿が可能です。また、時間指定のツイートも投稿できます。
自分宛てのツイートの返信では、正規表現条件、日時条件、ユーザー属性条件によって返信内容を制御できます。
投稿される内容は事前にテストして確認することができます。

Dashboard Widgetのため、Macを起動していないと動作しませんが、別途サーバを用意する必要もなく手元で気軽にオン/オフして運用することができます。

ちなみに、この<a href="http://www.mybdesign.com/widgets/db/index.html">Dashbot</a>で運用しているサンプルのbotは<a href="http://twitter.com/dashbot_dev" target="_blank">こちら</a>です。]]></description>
         <link>http://www.mybdesign.com/blog/2010/03/000036.html</link>
         <guid>http://www.mybdesign.com/blog/2010/03/000036.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">Dashbot</category>
        
          <category domain="http://www.sixapart.com/ns/types#category">Widget</category>
        
        
         <pubDate>Thu, 18 Mar 2010 01:33:57 +0900</pubDate>
      </item>
      
      <item>
         <title>In the Moodをアップデートしました。</title>
         <description><![CDATA[まとめてのエントリですが、Blip.fmへの送信時にクラッシュしていたIn the Mood for iPhone、クラッシュはしないものの曲名が見つからないことがあったIn the Mood dashboard widgetをアップデートしました。

原因はBlip.fmから取得した曲名リストの形式が微妙に変わっていたことでした。この程度でクラッシュしてしまうのは、作りがよろしくないからですね...。

色々と加えたい新機能もあるのですが、先日発表された<a href="http://www.apple.com/jp/ipad/" target="_blank">iPad</a>用のアプリも作りたかったり...頑張ります。]]></description>
         <link>http://www.mybdesign.com/blog/2010/02/000035.html</link>
         <guid>http://www.mybdesign.com/blog/2010/02/000035.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">In the Mood</category>
        
          <category domain="http://www.sixapart.com/ns/types#category">iPhone</category>
        
        
         <pubDate>Tue, 02 Feb 2010 23:50:35 +0900</pubDate>
      </item>
      
      <item>
         <title>In the Mood for iPhone 1.2.0リリース、次バージョン開発テスト中。</title>
         <description><![CDATA[本日、In the Mood for iPhone 1.2.0がリリースされました。
App Storeからダウンロードできます。

<a href="http://click.linksynergy.com/fs-bin/stat?id=4UUu6TRkrsk&offerid=94348&type=3&subid=0&tmpid=2192&RD_PARM1=http%253A%252F%252Fitunes.apple.com%252Fjp%252Fapp%252Fin-mood%252Fid324689831%253Fmt%253D8%2526uo%253D6%2526partnerId%253D30"><img height="15" width="61" alt="In the Mood" src="http://ax.itunes.apple.com/images/badgeitunes61x15dark.gif" /></a>

Blip.fmへの対応が主な新機能ですが、作っていくうちに色々と詰め込んでしまい、だいぶ新機能満載になっています。
特に、当初オマケ的なつもりで作っていたARビューは、新機能の中でも最も時間がかかってしまいました。

ところで、今回リリースを知らせるメールとともに、非公開APIを削除するようにとのメールがAppleのレビューチームから届きました。
In the Moodでは最初のバージョンから、iPhone Developer's Cookbookにも掲載されているUICalloutViewを使っていて、これが引っかかったようです。
具体的なAPI名と共に、今回は承認するけど次回アップデートで削除してね、というように書かれていて、不透明だと非難されているレビュー体制が改善されつつあるなー、と感じました。

さて今回、Blip.fmへの対応を果たしたので、次バージョンではその検索機能を生かしてNearby Songsの曲を聴けるようにしたいと思ってます。
とりあえず曲を検索してYouTubeのビデオを観られるようにしたデモアプリが下のスクリーンショット。制作時間20分。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="itm_test.jpg" src="http://www.mybdesign.com/blog/images/itm_test.jpg" width="153" height="230" class="mt-image-none" style="" /></span>

問題はYouTubeだと本体横向きになるので、ARビューと競合してしまうこと。]]></description>
         <link>http://www.mybdesign.com/blog/2009/11/000034.html</link>
         <guid>http://www.mybdesign.com/blog/2009/11/000034.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">In the Mood</category>
        
          <category domain="http://www.sixapart.com/ns/types#category">iPhone</category>
        
        
         <pubDate>Thu, 26 Nov 2009 16:53:14 +0900</pubDate>
      </item>
      
      <item>
         <title>In the Mood for iPhone 1.2.0を申請しました。</title>
         <description><![CDATA[多数の機能を追加した、In the Mood for iPhone 1.2.0をApp Storeに申請しました。
主な新機能は、Blip.fmへの対応、自動送信機能、ライブラリからの曲選択などです。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="itm_screen5.jpg" src="http://www.mybdesign.com/blog/images/itm_screen5.jpg" width="482" height="230" class="mt-image-none" style="" /></span>

またiPhone 3GSのみ対応ですが、Nearby Songsにリスト表示・地図表示に加えAR表示を追加しました。
精度は高くありませんが、iPhoneをかざす角度によって2モードの表示ができます。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="itm_screen6.jpg" src="http://www.mybdesign.com/blog/itm_screen6.jpg" width="482" height="160" class="mt-image-none" style="" /></span>]]></description>
         <link>http://www.mybdesign.com/blog/2009/11/000033.html</link>
         <guid>http://www.mybdesign.com/blog/2009/11/000033.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">In the Mood</category>
        
          <category domain="http://www.sixapart.com/ns/types#category">iPhone</category>
        
        
         <pubDate>Wed, 18 Nov 2009 00:13:43 +0900</pubDate>
      </item>
      
      <item>
         <title>In the Mood for iPhone 1.1.0がリリースされました。</title>
         <description><![CDATA[既報の通り、投稿機能を強化、フォーマット編集機能と地図表示機能を搭載した<a href="http://www.mybdesign.com/iphone/itm/">In the Mood for iPhone 1.1.0</a>がリリースされました。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="itm_screen4.jpg" src="http://www.mybdesign.com/blog/images/itm_screen4.jpg" width="482" height="230" class="mt-image-none" style="" /></span>

App Storeからダウンロードできます。

<a href="http://click.linksynergy.com/fs-bin/stat?id=4UUu6TRkrsk&offerid=94348&type=3&subid=0&tmpid=2192&RD_PARM1=http%253A%252F%252Fitunes.apple.com%252FWebObjects%252FMZStore.woa%252Fwa%252FviewSoftware%253Fid%253D324689831%2526mt%253D8%2526uo%253D6%2526partnerId%253D30"><img height="15" width="61" alt="In the Mood" src="http://ax.itunes.apple.com/images/badgeitunes61x15dark.gif" /></a>

次のバージョンでは、要望のあった自動投稿機能、Blip.fmへの対応の他、oAuthへの対応など盛り込んでいく予定です。]]></description>
         <link>http://www.mybdesign.com/blog/2009/10/000032.html</link>
         <guid>http://www.mybdesign.com/blog/2009/10/000032.html</guid>
        
          <category domain="http://www.sixapart.com/ns/types#category">In the Mood</category>
        
          <category domain="http://www.sixapart.com/ns/types#category">iPhone</category>
        
        
         <pubDate>Tue, 13 Oct 2009 23:23:31 +0900</pubDate>
      </item>
      
   </channel>
</rss>

