新作、連続ドアアクション「キックザドア」をリリースしました。



iTunesArtwork@2xsc2_480_jp

MohcitukiGamesの第二弾連続ドアアクション「キックザドア」をリリースしました。

タッチで左のゲージを止めてドアを開けて行くゲームになります。

点数を獲得して行けば、いろんな足を選べるようになります。

10回連続で赤いところで止めるとフィーバーモード!バンバン連打してください!

ドアを開ければ開けるほどゲージのスピードは上がります。

あるコツをつかめば高得点を狙えるようになりますが・・・、

それは自分で発見してくださいね。

コツをつかんだら誰かにコツを教えないでお勧めすると、

気付くまでの反応とその後の気持ちよさを共有して楽しめます!

(これも面白いですwww体験者談)

MagicTrace     android

 

コラボアプリ「背面とび」(iOS/android)をリリースしました!


昨日アプリ「背面とび」をリリースしました。

sc1_35jpsc2_35jp

appleandroid

だれでも手軽に遊べるカジュアルゲームです。
僕を知ってる人は思ったと思いますが・・・明らかに僕のセンスでは出来ないデザインです。

そう、デザインは僕ではないんです。
もちつきゲームズと言う名前で尊敬する桑木さんと作ったコラボアプリなのです!

桑木さんのセンスを損なわないようにがんばる次第です!

本日はなまるマーケットにて「漫画パンチ」が紹介されました。(放送後のまとめ)


いやー放送されてましたねー。

http://www.tbs.co.jp/hanamaru/opening/20130510.html

本日書くことは今後テレビ放送で紹介してもらった経緯等のまとめです。テレビ放送に採用されたいなーとか、採用されるかもしれない人のためになればいいかなと。あと、番組を見れなかった上原パズル(テトリry)、上原の冒険(11日まで無料公開中!急いでゲッツ)で有名な上原さん(@UeharaLabo)へ送りますw。

はなまるマーケットの関係者の方に何か不都合がないように書いていきます。不都合有りましたらすぐ変更します。

  • Eメールは突然に

時は遡って今週水曜日(5/8)一見のメールが来てました。

—————————————————————

メールアドレス:〜〜〜〜〜〜@携帯のアドレス

タイトル:TBSテレビはなまるマーケットの●●と申します。

本文:

〜〜〜〜

iPhone5のアプリ、漫画パンチを明日のはなまるマーケットにて紹介させていただきたいと思い連絡させていただきました。

本日中に連絡をとらせていただきたいのですが、・・・

〜〜〜〜

電話番号:〜〜〜〜〜

—————————————————————

え?wんーっと・・・HP作ってから英語の変なメールとかも来るし、ツイッターやってて変な方から怪しげなDMが来たことも有ったのでそう簡単には信じらんないんなぁ。

などと思ってとりあえず、アドレスと電話番号を調べてTBSの方なのか調べました。変なメールアドレスだとここで引っかかって幸せになるツボを売られる的な話が出るのですが特に出てこず。

えー、これどうしたもんだろ?自分のアプリってそんなに知名度があるわけじゃないし、こちら側からTBS様の方にアピールをかけたわけでもない。そんな幸運そうそうないないwww。

「テレビにアプリを紹介してもらった経験のある方に質問です。事前に連絡ってありました・・・?」ってツイッターで呟いて経験の有る方に質問してみたら、アルパカにいさんで有名なココソラの@GREEN60357931さんやぐんま観光特使こと、ぐんまの野望で有名な@RucKyGAMESさんが反応してくれました!

@GREEN60357931「ある場合もあれば、ない場合もありますね。」

@RucKyGAMES「番組によってあったり無かったり系!」

うーん、なるほど・・・。でも連絡してみないことにはわからないか・・・。ってことで、連絡先の方に184をつけて恐る恐る電話してみました。(TBS様疑っててごめんなさい。臆病者でして・・・。)

「ぷるぷる・・・・はい、はなまるマーケットです。」うぉ?!いやいや、これで信用するっていうのも、セキュアじゃないぞ!口では言えるしー。とはいえ、実際ここからどう騙されるんだよwとか思いつつ、●●さんとお話しようとしました。が、どうやらお忙しいらしく、現在電話中らしい。

んー。忙しくて携帯で連絡してたということか。いよいよ本物じゃないのかと確信し始めました。

とりあえず、メールにて返信いたします。という形で切ってメールを送って返信を待つ。

すると返信が。「再度電話にて連絡を頂きたいです」とのこと。

早速電話。要約するとこんな感じの会話内容でした。

・ストレス発散のツールとして小さいコーナーで紹介したいのですが、よろしいでしょうか?

・対応機種はiPhone5でいいですか?

・番組で実際に使ってもらう事になりますがよろしいですか?

自分の答えはもちろん「紹介してください!と言うかありがとうございます!ぜひぜひ使ってください!」

  • 電話を終えてテレビで紹介されるための考察

うーん考察するに、今回TVの放送に拾われた理由は・・・

①ストレス発散のアプリとしての機能が番組の紹介の趣旨に合っていた。

②実際に画面で弄るアプリよりも演者の方が振って動かす絵というのがTV的に映えるのではないか?

 

ですかね。テレビ出演を狙うに当たって、

①を実現するためには、番組の趣旨に合っているっていう所を狙って出来る訳がないので、「何でもいいからオンリーワンの特徴を持っている」ってのが条件な気がします。一応自由に音を設定できるボクササイズアプリという点ではオンリーワンですし・・・。

②を実現するためには、これも「番組が特にアプリを紹介する番組では無い」と言う点が大きく、狙って出来る訳がない部分だと思います。絵が映えるのは確かなのかもしれないですが、逆にちょっとした時間を利用できる電車とかでは出来ないので、お家にいる奥様には需要の有って親和性が高いのかもしれないです。

なんてことを考えながら録画予約をして、

かっちゃん「すげー!アッコさんiPhone振っただけでぶっ壊した!www」

的な妄想をしながら当日を迎えました。※アッコさんははままるマーケットには出ません。

  • 当日の8:30分ごろ(上原さんのために詳しく書いてます)

8:30ボケーと見ていたら冒頭からiPhoneがチラチラ。いきなり来るのか!?

TBSアナウンサー山内あゆさん「モヤモヤする方にスカッとするものを用意しました」

まずは、スカッとノートなる破るためのノートの紹介。オモロイアイディアだなー。奥様方の普段言えない事を書いて破ることを想定して作られたのかwこれもバッチリ番組の趣旨に合っている。スコット・ノートンが元ネタじゃないのか?と言う疑問は年齢がバレるので秘密。

山内あゆさん「次にスマートフォン、アイホンのアプリなのですが・・・無料アプリで・・・」

おお!ktkr!

山内あゆさん「手に持ってパンチをするとスカッとしますよ、という漫画パンチと言う無料のアプリなんですが・・・岡江さんこれを持ってパンチしてみましょう。」

うまくなるかなぁ・・・

岡江久美子さん「はい、「ぶおん!」」

勝俣州和さん「おおーいいパンチ」

岡江久美子さん「気持ちいい」

勝俣州和さん「ピストルみたいな音がなる!すげー」

アッコさんスゲー的なコメントありがとうございます!いやー嬉しいなぁ・・・

勝俣州和さん「嫌いな人に向かってやるとおもしろいかもww」

薬丸裕英さん「あと、怪しいコメントの時にはこれを使って・・・(口元にiPhoneを寄せて)「ばきゅーん!」www」

一同「wwwwwwwwwwww」

勝俣州和さん「子供に戻ってみんなやってるわwww」

山内あゆさん「両手でやるとなおさらパンチ感が増しますよー」

勝俣州和さん「(両手にiPhoneを持って)「ぶおん」「・・・」「ばきゅーん」「・・・」」

勝俣州和さん「ぐあーーーストレスがたまるーーーwwww」

一同「wwwwwwwwwwww」

てな具合でした。いやー良いコメントしていただいて、すごい嬉しいです。

勝俣さんの最後の両手パンチがうまく入ってなかったのはきっと左のアイホンの設定が右用になっていたのかもしれないですね。そういう場合、引くタイミングで音がなってしまいます。まぁこれは生の面白さですよね。

広告を押してしまった可能性を考えましたが、どうやらそうではないのも後で見て確認出来ました。

あ、ちなみに広告を触ってしまう件に関しては次のアップデートで治す予定です。パンチ画面だけ広告が無くなるボタンを採用する予定です。

  • 反響と今後の展望

アプリのアップデートからもう3ヶ月位たっているので(android版を作るためのcocos2dx勉強のためしばらくお待ちください。)勢いはほぼ無い状態なので、ほぼTVの影響だけの純粋な力を感じる事となるだろう。と考えていたのですが、結果

現在、ヘルスケア/フィットネス/トップ無料iPhone 20位

どんだけーwwwすごい影響力です。うーん今まで宣伝でききらなかった層にTVによって宣伝出来たのが大きいのかもしれないですが、すごい破壊力です。

広告のインプレッション数も今まで見たこと無い数字に・・・。

うーんこの勢いで自分の開発者としての知名度が上がっているので、「乗るしか無い このビックウエーブに」的な感じで頑張ろうとおもいます。iPhoneソフトだけに。

さて今後の展望をしばらく書いてないのですが、

「漫画パンチのアップデート」

・広告しまうボタン採用

・その他バグfix(大きい機能追加を行うかも)

「cocos2dx使用の新作ゲームアプリ」

・残件:音素材の調整とテスト

双方とも同時リリースできたら良いなと思ってますが、おそらく新作ゲームのアンドロイド版リリース後漫画パンチのアップデートで行こうかなと思ってます。

漫画パンチのandroido化、ゲーム要素追加についてはこの新作ゲームの経験を元に進めようと思っています。

よっしゃーモチベ満タンだぁ!

【#TechBuzz】第6回Shinjuku.cocos2d-x 〜少人数ハンズオン勉強会〜 cocos2d-xとネイティブ間の連携方法 懇親会やります〜!に行って来ました。


【#TechBuzz】第6回Shinjuku.cocos2d-x 〜少人数ハンズオン勉強会〜 cocos2d-xとネイティブ間の連携方法 懇親会やります〜!に行って来ました。

イベント詳細:http://atnd.org/events/36796
勉強会スライド:http://www.slideshare.net/doraemonsss/20130314-cocos2d-x

講師は「日本cocos2d-xユーザ会」代表:清水友晶(株式会社TKS2)さんです。毎度ありがとうございます。

●まとめ

  • 各OSの機能をフルに使おうとするとどうやっても各OS毎に実装が必要になる。
  • cocos2dx(C++)とiOS(objective-c)は、ソースファイルをmm形式にする事でC++とObjective-cを混在することができるため、比較的安易にOS機能の記述が可能。
  • cocos2dx(C++)とandroid(Java)は、JNIを利用してやり取りする。iOSとの連携に比べるとソースが多く、ちょっと複雑。
  • 実際に上記2つはソースを追うことで確認できる。
  • これらは自分でも実装可能なのでOS毎で実装したいことがあったら実装してみようぜ。

●個人的な感想

  • ソースを追うことでcocos2dxが頑張って両方に対応している健気な姿を勉強するのが主な内容でした。ありがとうcocos2dx。
  • cocos2dxでも最終的にはObjective-Cを扱うので、objective-cを勉強しておいて損はなかったと思いました。
  • まぁ、OS毎に実装すべきものが出るまではなんとなくわかっておけばいいかな・・・。と思ったらすぐにこの知識はすぐ役に立つのであった。※明日書く記事につづく。
  • 懇親会もあったのですが、技術的な勉強会の後なので、技術的な話をする方が多かった気がします。
  • 会社でアプリを作っててアプリの中の一部を担当しているという方がいて、個人で出してアプリ作成の全体像を知りたいというお話を聞きました。なるほど、個人開発はそういう点では非常にいい経験をしているのだと思ったらちょっと嬉しくなりました。

cocos2d-xをインストールしていじってみた。その3


なにげにandroid端末を手に入れたので今まで手を出せなかったcocos2dxのandroid対応が可能に。
IS03-android2.2、古い端末だからテストには持って来いなのかな?
早速がおまるさんのHPをトレースするよ!基本的にそこでハマった事等を載せますね。

●cocos2d-x環境構築〜Androidテンプレート起動までその1
http://gaomar.blog.fc2.com/blog-entry-3.html

eclipseもインストールしてないからそこからだなー。
ふむふむAndroidSDK、NDKいれて・・・ふむふむ

>次に対象とするAndroidのバージョンをIDで指定します。
>Android2.2以上を要求しますので、「5」を入力してください。
AndroidSDKをインストールするときに、Android2.2か2.3ぐらい古いのを選んだほうがいいようです。
以下のURLにあるように、まだまだ古いVerを使っている人が多いです。2.2と2.3とで50%を超えます。
http://developer.android.com/intl/ja/about/dashboards/index.html

新しいOSのSDKで作ってGooglePlayに載せると、それ以下のOSではDLできなくなるらしいので、なるべくなら古いOSで行くのがベストっぽいです。
ただ、verによって使える機能が変わるので、そこは作るアプリの機能を考えながら決めたほうがよさそうです。

おお実行できた!
じゃぁ次へ。

●cocos2d-x環境構築〜Androidテンプレート起動までその2
http://gaomar.blog.fc2.com/blog-entry-4.html

>■Android.mkファイルの編集
ここのソースはWindowsのソースのようです。MACのEclipseの人はコピペした後に「¥」を
逆スラッシュ「\」に変える必要があります。

>「build_native.sh」を実行しましょう。
このファイルは/GaomarTest/proj.androidの直下にあるファイルです。

よーし、縦画面対応もOKだ!

●ここまででの所感
ん・・・これって結局iOSでデバックしてそのソースをぶち込んでビルドすれば基本的にはいけるのか!
cocos2dx便利だ!もっと面倒なのかと思ってた。
面倒なのは、OSによる違いが大きく出る部分になるんですかね。
ゲームセンターやらツイッターやら広告やら各解像度対応等など・・・。
cocos2dxのクラスの使い方もそれほどわかってないけど、そこはもう調べながら行くしか無いですよね。

現在、勉強の成果としてカジュアルゲーム作成中です。がおまるさん、ありがとうございます!

【#TechBuzz】第5回Shinjuku.cocos2d-x 〜少人数ハンズオン勉強会〜 かんたんなゲームをつくってみよう! (2/21)に行って来ました!


●cocos2dxとcocosBilderの連携を勉強。勉強内容は以下のURL。
講師は清水 友晶さんです。cocos2dxを調べると清水さんのスライドが出てきます。
めちゃ勉強になるので他のスライドも必見!
・今回のスライド
 http://www.slideshare.net/doraemonsss/cocos2dxcocosbuilder
・絵素材
 http://tks2.net/nyanrun/images.zip
・cocos2dxプロジェクトとcocosBilderのプロジェクト
 http://tks2.net/nyanrun/nyanrun.zip 

●個人的にな感想
・途中までは行きましたが、まだまだCocosBilderの使い方が把握できてない。
 あとでまた勉強し直そう。
・スライドがあるので復習できるのが有難い。
・ちょっとcocosBilderとlevelhelperの違いを直接TKS2の清水さんに聞きました。
 ーcocosBilder
 ・タダ
ーLevelHelper
 ・有料
 ・Bos2dとの連携、SpriteHelperとの連携が強力
 ・バグが多少有る。
・古いMACはちょっと恥ずかしいw
・古いMACのビルドは遅いw
・今回のようなハンズオンは周りの人と協力しあって進めるのが吉。
 お互いにわからないところを保管できる。
・お隣さんとは名刺交換なり、握手なりして仲良く始めましょう!
・次回のハンズオンは早いうちに席に座っておとなりさんと名刺交換しておこう。
・清水さんに、「cocosBilderのプロジェクトも欲しいです」
 という話をしたら上記にURLに置いてくださいました!
 ソースがブルドックに見えるほど眺めさせて頂きます!

LevelHelperとCocos2dXの勉強 その1


さて、今新作の作成に取り掛かっているのですが、勉強しながら進めています。ちょっと勉強しながらということで、最初のソフトはより簡単なゲームにしていく方針です。

いろいろ問題が発生しながらだとは思いますが、それも含めて生暖かく見てくださったら有難いです。

現状目指しているソフトはBox2機能は使わない方針でいます。それでも、LevelHelperとSpriteHelper(今後LHとSHと表記します)の以下の機能は損なわれなさそうです。

  • 各部品をGUIベースで配置できる機能
  • 画像をまとめて管理してメモリの節約に役立つ機能
  • 各アニメーションを管理できる機能
  • 各部品を簡単にコード上から扱える機能

Box2dを使ったものであれば、なおさら威力は発揮できるものだと思います。

英語が苦手でcocos2d-xもBox2dもわかってないので、テンプレートでついてくるソース特にHelloWorldScene.cppをいじったり、じっくり眺めてみました。勘違いや、ツッコミどころ満載の可能性ありますが、突っ込んだり無視したりしてくださいw

 

//
//  HelloWorldScene.cpp
//  2dx_1
//
//  Created by hira on 2013/02/13.
//  Copyright __MyCompanyName__ 2013年. All rights reserved.
//
#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"

using namespace cocos2d;
using namespace CocosDenshion;

#define PTM_RATIO 32

enum {
    kTagParentNode = 1,
};

PhysicsSprite::PhysicsSprite()
: m_pBody(NULL)
{

}

void PhysicsSprite::setPhysicsBody(b2Body * body)
{
    m_pBody = body;
}

// this method will only get called if the sprite is batched.
// return YES if the physics values (angles, position ) changed
// If you return NO, then nodeToParentTransform won't be called.
bool PhysicsSprite::isDirty(void)
{
    return true;
}

//部品(b2Body)の座標行列を返すみたいです。
CCAffineTransform PhysicsSprite::nodeToParentTransform(void)
{
    //部品のポジションを取得
    b2Vec2 pos  = m_pBody->GetPosition();

    //座標をメートル単位に変換
    float x = pos.x * PTM_RATIO;
    float y = pos.y * PTM_RATIO;

    if ( isIgnoreAnchorPointForPosition() ) {
        x += m_obAnchorPointInPoints.x;
        y += m_obAnchorPointInPoints.y;
    }

    // 部品のラジアンで角度を取得します。
    float radians = m_pBody->GetAngle();
    float c = cosf(radians);
    float s = sinf(radians);

    //回転を計算
    if( ! m_obAnchorPointInPoints.equals(CCPointZero) ){
        x += c*-m_obAnchorPointInPoints.x + -s*-m_obAnchorPointInPoints.y;
        y += s*-m_obAnchorPointInPoints.x + c*-m_obAnchorPointInPoints.y;
    }

    // 回転角度と座標をまとめたm_sTransformを作成
    m_sTransform = CCAffineTransformMake( c,  s,
        -s,    c,
        x,    y );

    return m_sTransform;
}

HelloWorld::HelloWorld()
{
    //タッチを有効にする
    setTouchEnabled( true );
    //加速度を有効にする
    setAccelerometerEnabled( true );

    //CCDirectorクラスはシングルトンクラスになっていて常に1つ。
    //以下は画面サイズを取得するという意味になる。
    CCSize s = CCDirector::sharedDirector()->getWinSize();
    // 物理法則初期化
    this->initPhysics();

    //A~Dのパーツが定義されている画像を読み込む
    CCSpriteBatchNode *parent = CCSpriteBatchNode::create("blocks.png", 100);
    m_pSpriteTexture = parent->getTexture();

    addChild(parent, 0, kTagParentNode);

    //スプライトを追加している。最初のブロックを出しているのはここ。
    addNewSpriteAtPosition(ccp(s.width/2, s.height/2));

    //ラベルを定義
    CCLabelTTF *label = CCLabelTTF::create("Tap screen", "Marker Felt", 32);
    addChild(label, 0);
    label->setColor(ccc3(0,0,255));
    label->setPosition(ccp( s.width/2, s.height-50));

    //このNode(CCLaryはCCNodeを継承している)の描画時(1FPS毎)にUpdateを呼ぶようにする。
    scheduleUpdate();
}

HelloWorld::~HelloWorld()
{
    delete world;
    world = NULL;

    //delete m_debugDraw;
}

void HelloWorld::initPhysics()
{
    //ウインドウのサイズを取得
    CCSize s = CCDirector::sharedDirector()->getWinSize();

    //b2Vec2は2次元ベクトルのクラスらしい。別に2次元への趣味の方向性とかそういう意味ではないだからね!
    //確認するために月面の重力-1.66当たりに変更するといいかも。やってみよう。
    b2Vec2 gravity;
    //gravity.Set(0.0f, -10.0f);
    gravity.Set(0.0f, -1.622);

    //物理空間を上記の重力で作成
    world = new b2World(gravity);

    //動きが止まった物 体について、計算を省略するようになる。
    world->SetAllowSleeping(true);

    //オブジェクトの衝突判定をする時にすり抜けないように調整して計算する。
    world->SetContinuousPhysics(true);

//     m_debugDraw = new GLESDebugDraw( PTM_RATIO );
//     world->SetDebugDraw(m_debugDraw);

    uint32 flags = 0;
    flags += b2Draw::e_shapeBit;
    //        flags += b2Draw::e_jointBit;
    //        flags += b2Draw::e_aabbBit;
    //        flags += b2Draw::e_pairBit;
    //        flags += b2Draw::e_centerOfMassBit;
    //m_debugDraw->SetFlags(flags);

    // 地面の始まりの点を設定しているらしい。とりあえずパラメータを弄っておく
    b2BodyDef groundBodyDef;
    //groundBodyDef.position.Set(0, 0); // bottom-left corner
    groundBodyDef.position.Set(1.0F, 2.0F);

    // 地面を定義
    b2Body* groundBody = world->CreateBody(&groundBodyDef);
    // 地面の形の定義(直線の当たり判定定義)
    //参考:http://hamken100.blogspot.jp/2012/03/cocos2dbox2d.html
    b2EdgeShape groundBox;

    //参考:http://obc-fight.blogspot.jp/2013/02/cocos2d-Box2D-Basic.html
    //以下の部分は上記を参照、どうやらメートルの単位で箱の線を定義しているらしい。
    // bottom①
    groundBox.Set(b2Vec2(0,0), b2Vec2(s.width/PTM_RATIO,0));
    groundBody->CreateFixture(&groundBox,0);

    // top②
    groundBox.Set(b2Vec2(0,s.height/PTM_RATIO), b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO));
    groundBody->CreateFixture(&groundBox,0);

    // left③
    groundBox.Set(b2Vec2(0,s.height/PTM_RATIO), b2Vec2(0,0));
    groundBody->CreateFixture(&groundBox,0);

    // right④
    groundBox.Set(b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO), b2Vec2(s.width/PTM_RATIO,0));
    groundBody->CreateFixture(&groundBox,0);

    //        ②
    // ---------------
    // |             |
    //③|             |④
    // |             |
    // ---------------
    //        ①

}

void HelloWorld::draw()
{
    //
    // IMPORTANT:
    // This is only for debug purposes
    // It is recommend to disable it
    //
    CCLayer::draw();

    ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );

    kmGLPushMatrix();

    world->DrawDebugData();

    kmGLPopMatrix();
}

void HelloWorld::addNewSpriteAtPosition(CCPoint p)
{
    CCLOG("Add sprite %0.2f x %02.f",p.x,p.y);

    //タグから画像を取得
    CCNode* parent = getChildByTag(kTagParentNode);

    //先ほど読み込んだ画像からパーツをランダムに選んで表示する
    //CCRANDOM_0_1は0から1までのランダムな数値(float)を返すマクロなので、0と1を二分の一で出している。
    int idx = (CCRANDOM_0_1() > .5 ? 0:1);
    int idy = (CCRANDOM_0_1() > .5 ? 0:1);
    PhysicsSprite *sprite = new PhysicsSprite();
    //座標指定
    sprite->initWithTexture(m_pSpriteTexture, CCRectMake(32 * idx,32 * idy,32,32));
    sprite->autorelease();

    parent->addChild(sprite);
    //指定した場所に設置
    sprite->setPosition( CCPointMake( p.x, p.y) );

    //Box2Dで動的(静的にすると中に浮かぶのかな?)なオブジェクトとして設定。メートル単位で座標を指定
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);

    b2Body *body = world->CreateBody(&bodyDef);

    // 縦横1メートルのボックス(スプライトは縦横32ピクセルなので)として設定される。
    // SetAsBoxのパラメーターはボックスの中心から辺までの距離を指定するので、
    // 0.5メートルは一辺が1メートルという意味になる。らしい
    //参考:http://jp.evergizmo.com/2011/12/23/
    b2PolygonShape dynamicBox;
    dynamicBox.SetAsBox(.5f, .5f);

    // 属性の定義。密度、摩擦、反発などを設定する。
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &dynamicBox;
    //密度
    fixtureDef.density = 1.0f;
    //摩擦
    fixtureDef.friction = 0.3f;
    //反発は定義されてなかったので、ちょっといじってみる。
    fixtureDef.restitution = 0.8f;
    body->CreateFixture(&fixtureDef);
    //スプライトとBox2Dの動的オブジェクトを結びつける
    sprite->setPhysicsBody(body);
}

//一定時間ごとに呼ばれる。
void HelloWorld::update(float dt)
{
    //フレームを計算して描画するにはいろんな方法があるとか何とか。以下のURLで勉強してくれとのことです。
    //http://gafferongames.com/game-physics/fix-your-timestep/

    int velocityIterations = 8;
    int positionIterations = 1;

    // Instruct the world to perform a single step of simulation. It is
    // generally best to keep the time step and iterations fixed.
    world->Step(dt, velocityIterations, positionIterations);

    //世界に配置されている部品を全部見て回ってる。
    for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
    {
        //部品に関連づいているスプライトに対しても物理的な動きを与える。
        //今のところそんな部品はないので、動いていない。
        //キャラクターに張り付いているラベルとか、ゲージとか使うときに使用するようだ
        //参考:http://www.haphands.com/sw_flash/tech/box2d/box2d_09.html
        if (b->GetUserData() != NULL) {
            //Synchronize the AtlasSprites position and rotation with the corresponding body
            CCSprite* myActor = (CCSprite*)b->GetUserData();
            //部品の座標をスプライトの座標として設定
            myActor->setPosition( CCPointMake( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO) );
            //部品の回転角度をスプライトの回転角度として設定
            myActor->setRotation( -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()) );
        }
    }
}
//タッチした時の動作
void HelloWorld::ccTouchesEnded(CCSet* touches, CCEvent* event)
{
    //Add a new body/atlas sprite at the touched location
    CCSetIterator it;
    CCTouch* touch;
    //複数タッチ(ホントはタッチを離す動作)されても大丈夫なようになっている。タッチされた点をイテレータに格納して
    //インクリメントしているようだ
    for( it = touches->begin(); it != touches->end(); it++) 
    {
        touch = (CCTouch*)(*it);

        if(!touch)
            break;

        CCPoint location = touch->getLocationInView();

        location = CCDirector::sharedDirector()->convertToGL(location);
        //タッチされた点にスプライトを追加
        addNewSpriteAtPosition( location );
    }
}
//シーンを作ってレイヤーを追加。ちなみにこのHelloWorld自体はCCLayerを継承しているので、厳密にはsceneではない
//と思ったりする。staticだから、どこからでも呼べるよー。
CCScene* HelloWorld::scene()
{
    // sceneはオートリリースされるらしい。
    CCScene *scene = CCScene::create();

    // sceneに結びつくレイヤーを作成。このレイヤーこそがHellowWorld。
    CCLayer* layer = new HelloWorld();
    scene->addChild(layer);
    //え?なんでリリースしてんの?って思って調べたのですが、
    //どうやらCCLayerはCCObjectを継承しているっぽいです。
    //で、このCCObjectはobjective-cのratinやreleaseのようなメモリ管理のためのメソッドを実装しているっぽいです。
    //あとは参照数を管理して勝手にメモリから消えてくれる。
    layer->release();

    return scene;
}

結果、おお月面でスーパーボールを落としたような動きだ!

スクリーンショット 2013-02-20 0.16.07

静止画なのでわかりづらいですが、

  • 部品は反発するからスーパーボール的な動き
  • 月面的なホワンホワンとした重力
  • 見えない壁の外(画面左部、下部)に部品を作ると地面がないのでどこかへ消えていく
  • 見えない壁が画面外に有るため、右側の見えない領域にも部品が行く

な感じになってます。ふー。多少は理解できた気がします。今日はこの辺で。次回はLevelHelperとの連携をやってみようかなと。

またがおまるさんにお世話になるブログが始まるよ!

LevelHelperとSpriteHelperを動かして試してみた。(失敗例です。)の続報 その2


さて、LevelHelperでエクセプションはLevelHelper-PROを使用することで回避することが可能というところまででした。

LevelHelper-PROは試用期間があります。(LevelHelperをお試ししたい人はおすすめ。)使用期間を超えて使用するには、ライセンスが必要です。

ライセンスは、HPのContactにLevelHelperPROを使用したい旨を伝えて、返信して来るであろうメールにLevelHelperとSpriteHelperの明細書(アップルからメールで来るアプリの購入内容)のスクリーンショットを取って送信してください。

HPのContact:http://www.gamedevhelper.com/contact/

明細書は日本語のままだったのですが、問題なかったようです。

LevelHelperPROとSpriteHelperPROのライセンスファイルが添付されてくるので、ファイルをクリックするだけで自動認証してくれます。

さてLevelHelperPROとSpriteHelperPROですが、PRO付きじゃないものに比べて機能が増えてます。ベータ版と考えたほうがいいと思いますので、現状で問題が起こったとか、ベータ版の機能を使いたいと言う人以外はアップグレードしないほうが良いと思います。

この場を借りて拙い英語よりも日本語でいいます。Bogdanさんありがとうございました!

LevelHelperとSpriteHelperを動かして試してみた。(失敗例です。)の続報


LevelHelperの件をメールしたら、速攻返信が!早くてびっくり。

内容はヴァーチャルマシンでやってないか?という話でした。

違うよーと先ほどメールしたら、今度は速攻アップデートでバグ修正完了したから確認してくれと返信がwはやいw早すぎる。

メールによるとLevelHelperProにて修正済みとか。公式のDLページから落とせます。

が、ライセンスキーが必要らしいです。これはBogdanさんに購入したAppID(Eメールアドレス)をメールで送るともらえるらしい?です。※勘違いして無ければw

ともかく、AppIDを送信してライセンスーもらったら、またLevelHelperを使用して行きますね。

Bogdanさんありがとうございます!