前回に引き続き、ブロック崩しの作成について、説明していきます。
今回は、「バーを移動させる処理」の実装についてです。
バーを移動させるためにはいくつか方法がございますが
当記事のブロック崩しでは、cocos2d-htmlに用意されている
タッチイベントを使用し処理を行っていくことにします。
下記が、今回使用するタッチイベントのコールバック関数です。
・onTouchesBegan(touches, event)
→タッチされたとき
・onTouchesMoved(touches, event)
→ドラッグ操作中
・onTouchesEnded(touches, event)
→指が離れたとき
まずは、タッチを有効にしたいタイミングの箇所に次の処理を追加します。
this.setTouchEnabled( true );
次に、以下をinitの下に追加します。
※現段階では、ログを出力するだけの処理です。
onTouchesBegan:function (touches, event) {
console.log("onTouchesBegan");
},
onTouchesMoved:function (touches, event) {
console.log("onTouchesMoved");
},
onTouchesEnded:function (touches, event) {
console.log("onTouchesEnded");
},
上記までを行うと、タッチが使用できるようになります。
ブラウザで動作を確認します。
Firefoxの場合はメニューバーから
「ツール」→「Web開発」→「開発ツールを表示」
の手順でwebコンソールを表示することが出来ます。

コンソールメニューの「ロギング」をONにして
ブロック崩し画面内を適当にクリック又は、ドラッグしてみましょう。
各Touch関数内に記載している console.logの内容が表示されるのが確認出来ます。

これでタッチに関する処理の最低限の実装が終わりました。
次に、ドラッグ動作でバーを移動させる処理を追加します。
TouchesMoved関数内に以下を記載します。
//タッチポイントの取得
var touch_point = touches[0].getLocation();
//バーを移動する
spr_bar.setPosition(cc.p(touch_point.x, BAR_Y));
Move関数が呼ばれる度にsetPositionでバーのspriteの座標を変更しています。
touches[0].getLocation()によりタッチポイントを取得することができ
上記内容は、x座標をMove時に取得した場所・y座標を固定(バーの初期配置時の高さ)にしていることにより
水平移動を実現しています。
しかし、今の状態では単純にタッチしている箇所のx座標を指定しているだけなので
ドラッグしたままマウスカーソルを画面外まで持っていくと、バー本体も消えてしまいます。
ブロック崩しとしてバーが消えてしまうのは良くないので
バーの移動限界値をそれぞれ画面の両端になるよう処理の追加が必要になります。
その一例が以下になります。
※先ほどのバー移動処理の修正ver
var size = cc.Director.getInstance().getWinSize();
//タッチポイントの取得
var touch_point = touches[0].getLocation();
if(touch_point.x < BAR_WIDTH/2){
spr_bar.setPosition(cc.p( BAR_WIDTH/2, BAR_Y));
}
else if(touch_point.x > (size.width - BAR_WIDTH/2)){
spr_bar.setPosition(cc.p(size.width - BAR_WIDTH/2, BAR_Y));
}
else{
spr_bar.setPosition(cc.p(touch_point.x, BAR_Y));
}
バーを配置する際、アンカーポイントの変更は行っていないので
Default値である中心が設定されています。
その為
x座標が"バーの半分の値より小さい時"及び、"画面の最大サイズからバーの半分の値を引いた座標より大きい時"
にはそれ以上移動しないよう、if文によって処理を分岐させています。
今回の処理を全て追加したソースコード以下に記載します。
/**
*ブロック関連
*/
//ブロックのsprite
var spr_block = new Array();
/**
* 弾関連
*/
//弾の幅
var BALL_WIDTH = 5;
//弾の高さ
var BALL_HEIGHT = 5;
//弾のsprite
var spr_ball = null;
/**
*バー関連
*/
//バーのY座標位置
var BAR_Y = 20;
//バーの幅
var BAR_WIDTH = 60;
//バーの高さ
var BAR_HEIGHT = 4;
//バーのsprite
var spr_bar = null;
var Helloworld = cc.Layer.extend({
init:function () {
this._super();
var size = cc.Director.getInstance().getWinSize();
//layerの生成
var lazyLayer = new cc.Layer.create();
this.addChild(lazyLayer);
//背景spriteの生成
var sprite = cc.Sprite.create( "res/bg.png" );
sprite.setPosition(cc.p( size.width / 2, size.height / 2 ) );
sprite.setScale( 1.0 );
lazyLayer.addChild( sprite, 0 );
//バーspriteの生成
spr_bar = cc.Sprite.create( "res/bar.png" );
spr_bar.setPosition( cc.p( size.width / 2 - 5, BAR_Y ) );
this.addChild( spr_bar, 0 );
//ボールspriteの生成
spr_ball = cc.Sprite.create( "res/boll.png" );
spr_ball.setPosition( cc.p( size.width / 2 - 5, BAR_Y + BAR_HEIGHT + BALL_HEIGHT ) );
this.addChild( spr_ball, 0 );
//ブロックの生成
var h_size = 0;
for( var i = 0; i < 5; i++ ){
for( var j = 0; j < 8; j++ ){
spr_block[i * 8 + j] = cc.Sprite.create( "res/block_2.png" );
spr_block[i * 8 + j].setPosition( cc.p( 20 + ( j * 40 ), 370 - h_size) );
spr_block[i * 8 + j].setScale( 1.0 );
this.addChild( spr_block[i * 8 + j], 0 );
}
h_size += 20;
}
//Spriteの生成
var startSprite = cc.Sprite.create("res/gamestart.png");
startSprite.setPosition(cc.p( size.width / 2, size.height / 2 ));
layer.addChild(startSprite, 7);
//フェードインの設定
var actionFadeIn = cc.FadeIn.create(0.5);
//Delayの設定
var actionDelay = cc.DelayTime.create(1);
//フェードアウトの設定
var actionFadeOut = cc.FadeOut.create(0.5);
//コールバックの設定
var actionCb = cc.CallFunc.create(function () {
layer.removeChild(startSprite);
},layer);
//シーケンスの設定
var actionSeq = cc.Sequence.create(actionFadeIn, actionDelay, actionFadeOut, actionCb);
//アクション開始
startSprite.runAction(actionSeq);
//タッチを有効にする
this.setTouchEnabled( true );
return true;
},
onTouchesBegan:function (touches, event) {
console.log("onTouchesBegan");
},
onTouchesMoved:function (touches, event) {
console.log("onTouchesMoved");
var size = cc.Director.getInstance().getWinSize();
//タッチポイントの取得
var touch_point = touches[0].getLocation();
if(touch_point.x < BAR_WIDTH/2){
spr_bar.setPosition(cc.p( BAR_WIDTH/2, BAR_Y));
}
else if(touch_point.x > (size.width - BAR_WIDTH/2)){
spr_bar.setPosition(cc.p(size.width - BAR_WIDTH/2, BAR_Y));
}
else{
spr_bar.setPosition(cc.p(touch_point.x, BAR_Y));
}
},
onTouchesEnded:function (touches, event) {
console.log("onTouchesEnded");
},
});
var HelloWorldScene = cc.Scene.extend({
onEnter:function () {
this._super();
layer = new Helloworld();
layer.init();
this.addChild(layer);
}
});
以上でタッチ処理の追加及び、バーの移動実装は終了です。
<次回以降の更新について>
次回からは、物理エンジンを使用したボールの移動やその他アクションを順次、実装していきたいと思います。