2013年10月9日水曜日

XCode5.0アップグレードとKobold2d2.0.4のリンクエラー

XCode4.5からXCode5.0にアップグレードして、今まで開発していたKobold2d 2.0.4の
プロジェクトをビルドしました。すると、リンクエラーが発生しました。
libGoogleAdMobAds.aが見当たらないというようなエラーでした。
最新のAdMobのSDKをグーグルからダウンロードして設定しなおしても、解決しませんでした。元のプロジェクトに戻して、AdMobが関係していそうなビルド設定をいきあたりばったりで修正しビルドを繰り返しました。そして、以下のような設定の変更でやっとビルドが通りました。

Build Setings → User_Defined のリスト中にLINK_WITH_ADDMOBという項目があります。
ダブルクォテーション (") で囲まれていますが、これを外します。

この " を削除して、
"$(KKLIBROOT)/GoogleAdMobAdsSDK/libGoogleAdMobAds.a"
下のようにします。
$(KKLIBROOT)/GoogleAdMobAdsSDK/libGoogleAdMobAds.a

これで無事リンクエラーは無くなりました。
メモは取ってないのですが、このリンクエラーの前にKobold2d内のソースに関係するエラーがチラホラ出ていました。
現在も"_OBJC_CLASS_$_CCAsyncObject"がないというようなエラーが発生中です。
Cocos2DExtentionでのエラーですので、使用していなければ、発生しないようです。


2013年3月8日金曜日

iBooksとDynabook

やっと、日本公開になりましたが、iBooks Authorが縦書き対応していないとか、大体が、Pagesも縦書き対応してないじゃないか、クラリスに戻せ!とかいう批判の声もあるようです。

大手出版社からも、かつての売れ筋を電子書籍化して様子見をしようという感じです。
流通ピラミッドの頂点を取り損なったガッカリ感もあるのでしょう。

電子書籍の「書籍」にこだわらずに、アランケイのDynabookに通じるひとつのアプリケーションとして、今後は開発していく必要があるのではないでしょうか。

MacBook 2008 Late にMountain Lionをインストールして出た外部モニターの不具合

MacBook 2008 Lateには、SnowLeopardをインストールしていましたが、iOS6の開発のためにやむを得ず、MountainLionにアップデートしました。
不具合が出たのは、外部モニター(MITSUBISHI RDT195S)で、サードパーティーの変換コネクターを使って、D-Sub15pinで繋いでいます。
10年近く前のもので、液晶自体はまだ大丈夫ですが、調整用のボタン類が、度重なった引っ越しでガタガタです。セロハンテープで止めています。

ダウンロードとインストールで、半日くらい費やし、さて、やっと起動、ログイン画面が出たところで、それが発生しました。
ドラクエのルーラのような画面効果が、「アップルも、シャレたことやるねえ」と思ったものの、Finderでもシャレた効果が続きまして、「あー同期が取れてない」…

1280x1024では、60Hzでも75Hzでも同期が取れず、やむなく1184x870にしました。
昔使っていたe-Macの17inch相当の解像度です。
当時を懐かしく思いながら、使っております。

-------------------------------------------------------------------------------------------------------------------
後日談:DVI変換コネクターを使うと、1280x1024で設定できました。

2012年9月30日日曜日

CocosBuilder2.1Beta2のリソースファイル設定での注意点

プロジェクトフォルダの下に"Resources/hoge"というように階層化してフォルダを作成し、その"hoge"フォルダの中に、"hoge.png"というスプライトの画像ファイルを置きます。CocosBuilderのシーンには、"hoge.png"がCCSpriteとして貼付けられているとします。
 そして、CocosBuilderの"Project Settings"で以下のように"Flatten paths when publishing"を非選択にします。






デバッグ実行すると、ccbiファイル読み込み時に、コンソールには以下のようなcocos2dの警告メッセージがでます。

-[CCFileUtils fullPathFromRelativePath:resolutionType:] : cocos2d: Warning: File not found: hoge/hoge.png

階層化したフォルダの下に置いたリソースファイルが見つからないというものです。
そこで、以下のように"Flatten paths when publishing"を選択にすると、無事に"hoge.png"を読み込んでくれます。








デフォルトでは選択状態になっているようですが、うっかり非選択にしてしまい、半日ほど悩んでしまいました。

2012年9月29日土曜日

CocosBuilder2.1Beta2で指定したCCSpriteのインスタンスを取得する方法

CocosBuilderで、シーンを作成したときに貼付けたスプライトなどに対して、コード上で処理を行いたい場合は、そのスプライトのインタンスを取得する必要があります。その場合の作業手順です。

以下のように、CocosBuilderでCCLayerとして設定したルートノードのクラス名を"hoge"とします。


以下のように、hogeクラスのメンバ変数とするために"Doc root var"を選択します。そして、取得したいCCSpriteを選択しインスタンス名を入力します。


ccbを保存し、ccbiファイルを"Publish"でXCodeのプロジェクト内に保存します。

XCodeで、CocosBuilderで設定したクラス名とサフィックスが同じファイル名になるようにして、"hoge.h"と"hoge.m"を追加作成します。
そして、以下のように"hoge.h"でCCLayerからの継承クラスに変更します。

@interface hoge  : CCLayer

"hoge.h"で"CCSprite *hogeSprite;"を宣言します。

以下のようにして、ccbiファイル読み込むと、自動的にhogeはインスタンス化され、
(この場合では、nodeという名前で参照されます。CCNodeではなくCCLayerでキャストする必要があると思います。) hogeSpriteは、このときにメンバ変数としてインスタンス化されています。

CCNode *node = [CCBReader nodeGraphFromFile:file];

また、"hoge.m"で、デリゲートメソッドとして"- (void) didLoadFromCCB"を実装すると、
ccbiファイル読み込み終了時に呼び出されますので、"hogeSprite"に対しての処理を行うことができます。

2012年9月26日水曜日

Kobold2D2.0.3とCocosBuilder2.1Beta2を併用するときの注意点

Kobold2Dは、ARC対応なのですが、CocosBuilderのライブラリは、ARCに対応していません。よって、以下のようにXCodeの設定の Build Phases でコンパイル時の設定が必要です。
















関連するファイルに、-fno-objc-arc をオプションに追加します。

参考: http://www.zero4racer.com/blog/334#comment-168

次に、CCScrollView.m で matrix.h が見つからないというエラーが発生しますので、以下のように宣言部分を変更します。

//#import "matrix.h" #import "kazmath/GL/matrix.h"

参考: http://www.cocos2d-iphone.org/forum/topic/38786


2012年9月21日金曜日

enchant.jsのLabelにHTMLを載せる


enchant.jsのLabelには、HTMLタグを使用したテキストをtextプロパティに設定できます。
それならばhtmlファイルごと読み込ませて、ついでにCSSまで適用できないものかなと考えました。
Labelのtextプロパティを以下のようにして、

label.text = '<div id="contentsBox" style="width:100%; height:100%;"></div>';

そして、JQueryで以下のように、contentsBox に hoge.html を読み込ませています。

$('#contentsBox').load('./pages/hoge.html',function(response, status, xhr)

ここで、CSSを以下のように入れていたのですが、CSSが適用されませんでした。
再度これらの読み込み処理を行うと、なぜか適用されるのですが、タイミング的なものなのでしょうか?

label.text = '<div id="contentsBox" style="width:100%; height:100%;"><link rel="stylesheet" href="./pages/hoge.css"></div>';

そこで、htmlの読み込みが成功したときに、以下のようにJQueryを使用して挿入するようにしてみました。

$('<link rel="stylesheet" href="./pages/hoge.css">').appendTo("head");

Label生成した後にすぐに scene.addChild(label); で子として追加としていますが、
これは、JQueryからLabelのtextに、コードを流し込む時にSceneの子の状態になってないと、
Label内部での更新が動作しないようだったからです。enchant.jsのソースを見た訳ではないので、
はっきりとはいえないのですが。

以下、参考ソースです。作成中のソースから少し変えただけですので見にくいのですが。

    var label = new Label();
    scene.addChild(label);
    label.visible = false;
    label.color = "#000";
    label.backgroundColor = "#FFF";
    label.text = '<div id="contentsBox" style="width:100%; height:100%;"></div>';
    $('#contentsBox').load('./pages/hoge.html',function(response, status, xhr){
          if (status == "error") {
            var msg = "Load Error!!";
            $("#error").html(msg + xhr.status + " " + xhr.statusText);
        }else{
            console.log('---Load Complete!!---');
            $('<link rel="stylesheet" href="./pages/hoge.css">').appendTo("head");
            label.visible = true;
            label.addEventListener('touchend',function(e){
                scene.removeChild(this);
            });
            return;
        }
    });

ちなみにたいしたことではありませんが、htmlファイルやcssファイル、それに含まれる画像ファイルは、
実行しているスクリプトファイルから見ての相対パスなんですよね。
情けないのですが、つい何回も間違えてしまいましたので、自分への戒めもかねて。