Monacaバックエンド

ちょっとしたゲームでもオンラインランキングあったほうが燃えますよね~。

ということでちゃちゃっとランキングの実現性を調査。
Monaca+html+enchant.jsな環境だとフリーで使えそうなランキングサービスはなさそうだったので、自作で作らないといけないのかな~とか思っていたところ、MonacaバックエンドというMonaca直々のサービスを発見しました。
http://docs.monaca.mobi/ja/learning/backend/

Monacaのサイトは結構見てましたけどいままで全然気付かなかった・・・でも7/16にリリースって書いてあるから、つい先日リリースされたんですかね。
ちょっとゲームのランキングに使うのは想定されてない感じもしますけど、これはなんだか良さそう!
近いうちにテストしてみます。

しかしこれも無料で使っていいんですかね。
なんとすばらしいMonaca環境・・・!

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でアクセスしなければならない事を結構わすれて、ダイレクトに書いちゃったりするんですが・・・

アプリを作って3000円!Monaca×nendアプリ開発キャンペーン

アプリを作って3000円!Monaca×nendアプリ開発キャンペーン | http://blog.asial.co.jp/1182

ちょうど何日か前、Monacaという、コーディングから最終ビルドまで全てブラウザ上で完結できるすばらしい無料サービスを発見して、これはいい!ということで、ちょっとしたAndroidゲームを制作しているところでした。

そんなところに、なんと良いタイミングでこのキャンペーン・・・!

Monacaの開発、運営を手がけているアシアルさんのブログでMonaca環境でnendを表示するエントリがあったので、広告もnendに決めたところでした。

自分はhtmlやJavascriptの知識はあまりありませんが、まあJavascriptならなんとかなるだろうとenchant.jsというお手軽なゲーム制作ライブラリを使用することにしました。

そんなこんなで、環境は monaca + html5 + enchant.js + nend で決定。

htmlやJavascriptに苦労しつつも現状なんとかゲームの大まかなシーンの流れとnendで広告表示のレイアウトまでうまくいきました。
htmlが理解しきれていないのでhtml+enchant.js+nendの環境で、広告とゲーム画面両方をきれいに表示させるのになかなか苦労しました。

この辺りは、自分の理解が深まった頃にでも、まとめて記事にしたいなと思っています。