Xcode5でSupported Interface Orientationsを指定する
Xcode4までは、プロジェクト情報のSummaryというところにSupported Interface Orientationがあり、端末の対応する向きを変えるにはそこを設定すればよかったのですが、Xcode5になって下記の場所になったようです。
昔は向きの絵があってその中から選べたのですが今回から単なる文字列に…なんか退化してないか?
後は、RootViewController.mmも下記のように変えるのは変わらず。
// Override to allow orientations other than the default portrait orientation. // This method is deprecated on ios6 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // modify to portrait // return UIInterfaceOrientationIsLandscape( interfaceOrientation ); return UIInterfaceOrientationIsPortrait(interfaceOrientation); } // For ios6, use supportedInterfaceOrientations & shouldAutorotate instead - (NSUInteger) supportedInterfaceOrientations{ #ifdef __IPHONE_6_0 // modify to portrait //return UIInterfaceOrientationMaskAllButUpsideDown; return UIInterfaceOrientationMaskPortrait; #endif }
listやvectorからランダムで要素を取得する
C++で配列からランダムに要素を取得してみました。
下記のサンプルではvector使ってますが別にlistでもいけるかと。
#include <iostream> #include <vector> #include <math.h> int main(int argc, const char * argv[]) { std::vector<int> testArray = {1,2,3}; cout << testArray[rand()%testArray.size()]; return 0; }あと、C++で書いたコードをコピペするときにHTMLシーケンスをエスケープする必要があったので、これは誰かツールでも作ってるんじゃないかと思ったらありました。
橋本商会 » クリップボードのテキストをHTMLエスケープするアプリ clip2htmlescape作った
さらに、Syntaxhighliger内の単語がはてなキーワードにひっかかって面倒だったので回避方法はないかと探していたらありましたw
はてなブログ(無料版)でキーワードリンクを回避する - Code Halation
cocos2d-xをC++で書いた場合とjavascriptで書いた場合のコード記述量比較例
cocos2d-x、練習のために同じプログラムをC++とjavascript bindingを使って書いています。
JSだと書くコード量減るなぁ…と実感したのでメモしてみます。cocosbuilderで定義されたCCLabelTTF変数(仮にlabelTextという変数名とする)にアクセスするのに必要なコードを比較。ccbiファイルを呼び出すところはそれほど変わらないので省略。
まずはJS側から。
var GameLayer = function(){}; GameLayer.prototype.onDidLoadFromCCB = function () { cc.log(this.labelText); }JSの場合これだけ!次にC++の場合。
// コンストラクタ GameLayer::GameLayer() : mScore(NULL) {} // デストラクタ GameLayer::~GameLayer() { CC_SAFE_RELEASE(mScore); } // 変数アクセス bool GameLayer::onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode) { CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "labelText", CCLabelTTF*, this->labelText); CC.Log(this->labelText); return false; }これはcppファイルの中身だけで、ヘッダーファイルも書かねばなりません。
#include "cocos2d.h" #include "cocos-ext.h" class GameLayer : public CCLayer , public CCBMemberVariableAssigner { CCLabelTTF* mScore; virtual bool onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode); public: GameLayer(); virtual ~GameLayer(); CCB_STATIC_NEW_AUTORELEASE_OBJECT_WITH_INIT_METHOD(GameLayer, create); };初期化やデストラクタ、cocosbuilderとcocos2d-xの変数の紐付けも記述する必要がある。JSB(javascript binding)はまだ関数の一部が使えなかったりBox2dもサポートされてなかったりと発展途上ですけど、さくっと作るならやっぱJSBだよなぁ…。
Androidでcocosbuilder連携した時にonTouchBeganが動かない
cocosbuilder側でTouch enabledにチェック入れてるのに、下記のコードが動かないなぁ…と思ってたら、どうやらAndroidの場合はcocosbuilder側のチェックがされていても、cocos2dx側でonTouchEnableとかを呼ばなきゃならんようです。
動かなかったコードは下記
var KotoappMain = function(){}; KotoappMain.prototype.onDidLoadFromCCB = function () { var node = this.rootNode; node.onTouchBegan = function( touch, event) { cc.log("on touch!!"); return true; }; return true; };で、こうしたら動きました。
var KotoappMain = function(){}; KotoappMain.prototype.onDidLoadFromCCB = function () { node.setTouchEnabled(true); node.setTouchMode(cc.TOUCH_ONE_BY_ONE); var node = this.rootNode; node.onTouchBegan = function( touch, event) { cc.log("on touch!!"); return true; }; return true; };3行目と4行目にtouch有効化関係の記述入れただけですね〜。 よく調べたらForumにもQ&Aありました。 Cocos2d-x | onTouchBegan doesn't work on Android
javascript bindingでcocosbuilderとcocos2dx連携
cocosbuilderからcocos2d-xのjavascript bindingsを利用する際の方法についてメモ。
まず、cocosbuilderの
- File -> new -> Interface File...
から、新しいccbファイルを作成する。このccbファイルがcocos2dxのcc.Sceneオブジェクトと同等になる。ここではKotoappMain.ccbというファイルを作成し、JSでも同名のオブジェクトからアクセスしてみます。
作成したKotoappMain.ccbをダブルクリックすると、右上にCode Connectionと書いてある部分がある。その中にあるJS ControllerにKotoappMainと記入する。
これでKotoappMainというオブジェクトからアクセス可能になる。次に
- File -> Project Settings...
にあるStart ccb file nameにKotoappMainと記述する。
cocosbuilderでpublishすると、main.jsが出力されるので、cocos2dxプロジェクトのResources/main.jsをこれに置き換えましょう。その中身を見るとこんな感じになっている。
// Autogenerated main.js file require("jsb.js"); function main() { cc.FileUtils.getInstance().loadFilenameLookup("fileLookup.plist"); //cc.Texture2D.setDefaultAlphaPixelFormat(6); var director = cc.Director.getInstance(); var scene = cc.BuilderReader.loadAsScene("KotoappMain"); var runningScene = director.getRunningScene(); if (runningScene === null) director.runWithScene(scene); else director.replaceScene(scene); } main();9行目のloadAsSceneで先程Start ccb file nameで指定したKotoappMainが記述される。ccbi拡張子を追加してKotoappMain.ccbiと記述しても動くようだ。jsb.jsファイル以外にもrequireの必要があるファイルはrequireしておく。publishして作成されたKotoappMain.ccbiファイルはmain.jsと同じフォルダに置いておきましょう。 次に、ccbiファイルがロードされた後の挙動は下記のように書く。
var KotoappMain = function(){}; KotoappMain.prototype.onDidLoadFromCCB = function () { cc.log("loaded!!"); };これでccbiファイルがロードされた時にcc.logが吐かれる。
オブジェクトのプロパティからランダムに選択する
こんな感じで作ってみた。
もっと良い書き方ないものか…
var selectRandomly = function(obj) { var result; var count = 0; for (var prop in obj ) if (Math.random() < 1/++count && obj.hasOwnProperty(prop)) result = prop; return obj[result]; };