namespace 閉じ忘れエラー

Visual Studio 2010 で

At end of source : error 67: expected a “}”

なエラーが出て、なんだこれはと小一時間悩んだ結果、単純に cpp ファイルで namespace の閉じ忘れということが判明。
どのファイルでエラーが出てるのか表示してくれないし、もっとややこしいエラーなのかと思いました。

まあエラーの内容からしてそんな感じですよね・・・

Visual Studio 2010 でIntelliSence(インテリセンス)の無効化

Visual Studio 2010 でIntelliSence(インテリセンス)を完全に無効化する方法のメモ

オプション>テキストエディタ>C/C++(任意の言語)>IntelliSenceの無効化
をTrueにする
VisualAssistXを使用している場合は、『#includeのオートコンプリートの無効化』もTrueにしておくと、余計なVisualStudio側の処理が走らなくて良い。

staticなメンバ変数の初期化

Hoge.h

class Hoge {
public:
	static func();
private:
	static std::vector<int> m_vector;
	static std::bitset<16>  m_bitset;
	static int              m_array[16];
};

Hoge.cpp

Hoge::func()
{
	m_vector.clear();
	m_bitset.reset();
	m_array[0] = 0;
}

という風にしてしまうと、LNK2001の外部参照が未解決リンクエラーが出てしまいます。
staticなメンバ変数は、ヘッダ上では宣言しているだけなので、実体の確保はソース(cpp)側で行う必要があります。
Hoge.cppのfunc()の前に

std::vector<int>  Hoge::m_vector;
std::bitset<16>   Hoge::m_bitset;
int               Hoge::m_array[16];

を追記して、暗黙の初期化を行うようにすればリンクエラーは解消されます。

enchant.ui.MutableText を拡張してみる

enchant.jsの enchant.ui.MutableText を拡張してみました。
・フォントテクスチャをコンストラクタで指定できるように。(コンストラクタで座標指定は削除)
・スケール(scaleX scaleY)に対応。
参考までにペタリ。

var MyMutableText = enchant.Class.create(enchant.Sprite, {
	/*!
		コンストラクタ
		@param	fontTexture			テクスチャ
		@param	fontTextureUnitSize	テクスチャの1文字のサイズ
	*/
    initialize: function(fontTexture, fontTextureUnitSize) {
        enchant.Sprite.call(this, 0, 0);
        this.fontSize		= fontTextureUnitSize ? fontTextureUnitSize : 16;		// テクスチャの1文字サイズ
        this.widthItemNum	= 16;	// テクスチャの1列に何文字格納されてるか
        this.x = 0;
        this.y = 0;
        this.m_fontTexture	= fontTexture;
        this._imageAge = Number.MAX_VALUE;
        this.text = '';
        if (arguments[2]) {
            this.row = Math.floor(arguments[2] / this.fontSize);
        }
    },
    /**
     * ラベルの内容を書き換える関数
     * @param txt
     */
    setText: function(txt) {
        var i, x, y, wNum, charCode, charPos;
        var	fontDstWidth	= this.fontSize * this.scaleX;
        var	fontDstHeight	= this.fontSize * this.scaleY;
        this._text = txt;
        var newWidth;
        if (!this.returnLength) {
            this.width = Math.min(fontDstWidth * this._text.length, enchant.Game.instance.width);
        } else {
            this.width = Math.min(this.returnLength * fontDstWidth, enchant.Game.instance.width);
        }
        this.height = fontDstHeight * (Math.ceil(this._text.length / this.row) || 1);
        // if image is to small or was to big for a long time create new image
        if(!this.image || this.width > this.image.width || this.height > this.image.height || this._imageAge > 300) {
            this.image = new enchant.Surface(this.width, this.height);
            this._imageAge = 0;
        } else if(this.width < this.image.width || this.height < this.image.height) {
            this._imageAge++;
        } else {
            this._imageAge = 0;
        }
        this.image.context.clearRect(0, 0, this.width, this.height);
        for (i = 0; i < txt.length; i++) {
            charCode = txt.charCodeAt(i);
            if (charCode >= 32 && charCode <= 127) {
                charPos = charCode - 32;
            } else {
                charPos = 0;
            }
            x = charPos % this.widthItemNum;
            y = (charPos / this.widthItemNum) | 0;
            this.image.draw(	this.m_fontTexture,						// テクスチャ
                				x * this.fontSize, y * this.fontSize,	// 入力xy
                				this.fontSize, this.fontSize,			// 入力wh
				                (i % this.row) * fontDstWidth, ((i / this.row) | 0) * fontDstHeight,	// 出力xy
				                fontDstWidth, fontDstHeight	);			// 出力wh
        }
    },
    /**
     * ラベルの内容
     * @type {String}
     */
    text: {
        get: function() {
            return this._text;
        },
        set: function(txt) {
            this.setText(txt);
        }
    },
    /**
     * @type {Number}
     */
    row: {
        get: function() {
            return this.returnLength || this.width / this.fontSize;
        },
        set: function(row) {
            this.returnLength = row;
            this.text = this.text;
        }
    }
});

Xperia Z SO-02E 上でenchant.jsのタッチがうまくとれない件

っsうーん、Xperia Z SO-02E 上で enchant.js v0.71 のタッチがうまくとれない症状で悩み中。
1回しかタッチしていないのに何故か touchstart が2回反応してしまいます。
他の端末だと大丈夫だったので、端末固有の問題だとは思うのですが、原因不明。

・・・というかそれ以前にmonaca+enchant.jsの環境で、Monaca Debbuger でXperia Z上でプレビューすると基本的になんか動作がおかしいので、まずそれから原因探らないとダメなんですけどね汗

ただ、ビルドしてインストールするとちゃんと動作するので、Monaca Debuggerの不具合なのかもと思い中…

■追記■
enchant.jsのGitHubでまさに同じ問題が報告されていました。
https://github.com/wise9/enchant.js/issues/200
既に解決しているようなので、修正されているenchant.jsファイルをゲットしてきました。
ただ、修正された箇所を見るとわかりますが、enchant.jsを差し替えるだけではダメで、

enchant.ENV.MOUSE_ENABLED	= false;

をCore生成の前に呼ぶ必要があります。
マウスとタッチのイベントがかぶって通知されることがあるとか。
・・・やったー直った!

this.scene にハマる

var MyEntity = enchant.Class.create( enchant.Entity, {
	initialize: function(scene) {
		enchant.Entity.call( this );
		// シーンを保存
		this.scene	= scene;
		// シーンに追加
		scene.addChild( this );
		// この時点で、this.scene は scene じゃなくなっている
		// addChildした時点でthis.scene が上書かれる
	}
});

こんな感じで、やると、this.scene は上書かれてしまいます。
いやいや、sceneメンバが存在していたとは、盲点でした。
これで結構悩んでしまいました(汗
ライブラリ側とかち合わないように、頭に m_ つけたりするのが良いかもしれませんね。

それ以前に、クラス内のメンバにthisでアクセスしなければならない事を結構わすれて、ダイレクトに書いちゃったりするんですが・・・

Android開発環境の構築

2013/02/25時点の、ADTバンドル版を使用しないで、eclipse、Android SDK をインストールする手順をwikiにまとめました。

Android開発環境の構築 | ぎじゅつめも

ADTバンドル版はインストール等すごく簡単で楽チンだったのですが、なんだか挙動がアヤシイ?感じがして、やっぱり以前使用していた単体版のeclipseに戻すことにしました。
自分の環境だとADTバンドル版より安定して使用できます^^;

JDK のバージョンは 『6u41』
AndroidSDK のバージョンは 『r21.1』
eclipse は 『Eclipse 4.2 Juno Pleiades All in One』 の Java の Full Edition
…を使用しています。

Eclipse Orion 1.0 リリース

ブラウザで使えるクラウド型IDEでいいのないかなーと探していたところ、こんなニュースを発見。

Eclipse開発のブラウザIDE「Orion 1.0」登場

Orionチームは29日(米国時間)、Orionの最新版となる「Orion 1.0」を公開した。Orionはブラウザ上で動作するWebベースの統合開発環境。OrionチームはEclipse Foundationの支援のもと2011年初頭より開発をスタートさせたプロジェクトで、WebブラウザのみでWeb開発が行えるオープンソースの統合開発プラットフォームの提供を目的としている。

Orion 1.0は、6月に公開されたOrion 0.5以来のアップデートで初のメジャーリリースバージョン。Orion 1.0では外観の選択やカスタマイズ、エディタのルールカラーなどが設定できる新たなセッティングページやブラウザ内でRAWファイルを開ける機能、Gitとの親和性の向上、ブックマークの編集機能、プラグインの無効化などが実装された。

Orion 1.0はこちらより取得できる。もしくは専用サイト「Orionhub.org」でアカウントを作成することでも利用が可能。Orionチームでは4ヶ月ごとのリリースを目指しており、2013年2月にOrion 2.0の公開を目指している。

先日Cloud9とShiftEditを試してみたんですが、日本語の都合があまりよろしくないようなのです。
Orionは日本語いけるという情報を見かけたので、後で試してみます。