このページの本文へ

Facebook APIでソーシャルなブロック崩しを作ろう

2012年06月13日 11時00分更新

萩原伸悟/jAction

  • この記事をはてなブックマークに追加
本文印刷

●2. ログインが完了したらthis.onLoginを実行する

 ログインが完了した上で次の処理へ進むため、ログイン完了時のイベントを登録します。var fc = new FacebookClass(***APP ID*** , true , true); の後に以下を追加します。


fc.addEventListener("onLogin", this);

 ログイン処理が完了したらfcのonLoginが発生し、this(ここではMain=function()の中を指しています)のonLoginが実行されます。


●3. フレンドの画像を取得する(this.onLogin内)

 次に、ログイン完了後のonLoginにフレンド画像を取得する処理を書きます。fc.addEventListener("onLogin", this);の次に以下を追加します。


this.onLogin = function(){
 fc.removeEventListener("onLogin", this);
 fc.getPictureArray(15);
};

 function内の1行目fc.removeEventListener("onLogin", this);で前に登録したリスナーを解除します。2行目のfc.getPictureArray(15); でフレンドの画像をランダムに15枚取得します。Facebook.jsにGraph APIの処理が内包されているので、わずかこれだけで情報を取得できます。

 たとえば、ここでfc.getFriendDataとすれば、FacebookのFQLを利用してフレンドの写真や名前などのさまざまな情報を一括取得できます。また、


fc.share('シェアのタイトル名' , 'リンク先URL' , 'アイコンのURL' , 'デフォルトで入っているメッセージ文字列');

とすれば、リンクをシェアできます。詳細は、jAction公式サイトのFacebookClassのページを参照してください。


●4. 画像が取得されたらthis.onGetPictureを実行する

 画像の取得が完了した後で次の処理を進めるため、画像の取得完了時のイベントを登録します。fc.getPictureArray(15);の後に以下を追加します。


fc.addEventListener("onGetPicture", this);

 画像の取得が完了したらfcのonGetPictureイベントが発生し、thisのonGetPictureメソッドが実行されます。


●5. 画像が1枚以上あればthis.onInitを実行する(this.onGetPicture内)

 Facebookから画像取得完了後に実行されるthis.onGetPictureを作成します。取得された画像が1枚以上あれば、this.onInit()を実行し、画像がない場合はゲームができないのでアラートを表示します。

 this.onLogin = function(){}の後に以下を追加します。


this.onGetPicture = function(){
 fc.removeEventListener("onGetPicture", this);
 if(fc.pictureSelectArray.length <= 0){
 alert("フレンド情報が見つかりませんでした");
 }else{
 this.onInit();
 console.log(fc.pictureSelectArray);
 }
};

 function内の1行目fc.removeEventListener("onGetPicture", this);で前に登録したリスナーを解除します。2行目のif文内のfc.pictureSelectArrayは取得した画像が格納された配列ですので、取得されたしフレンドの画像が1枚以上であればthis.onInitを実行します。

 取得した結果を確認できるように、if文の中にconsole.log()で、取得された画像の配列をデバッグコンソールに表示させます。


console.log(fc.pictureSelectArray);

 デバッグコンソールは、Google Chromeであればメニューの「ウィンドウ」⇒「Developer Tool」で表示できます。ログのURLをクリックするとフレンドの画像が表示されます。

写真3.png
Google Chromeの開発者ツール

 ここまでのMain.jsをまとめると以下のようになります。

■Main.js


Main = function()
{
 EventDispatcher.initialize(this);
 
 var boxObject = new ja.BoxClass(20,20,"#000000"); //ブロックを崩すボールを描画します。
 boxObject.x = 150; //ブロックを位置を指定します。
 boxObject.y = 200;
 var barObj = new ja.BoxClass(100,15,"#000000"); //自分の指で動かすを描画します。
 barObj.x = 110; //バーを位置を指定します。
 barObj.y = 350;
 
 var xinc = 15; //フレームごとにボールを動かすx方向のピクセル数です。
 var yinc = 15; //フレームごとにボールを動かすy方向のピクセル数です。
 
 /***追加部分***/
 /*
  * facebookクラス
  */
 var fc = new FacebookClass('388251564532700' , true , true); //FaceBookアプリID , cookie , oauth
 fc.addEventListener("onLogin", this); //ログイン完了のリスナーを登録します
 
 //ログインが完了すると呼ばれます
 this.onLogin = function()
 {
  fc.removeEventListener("onLogin", this); //ログイン完了のリスナーを解除します
  fc.getPictureArray(15); //ランダムでフレンドの画像を15枚取得します
  fc.addEventListener("onGetPicture", this); //画像取得完了のリスナーを登録します
 };
 
 //画像取得が完了すると呼ばれます
 this.onGetPicture = function()
 {
  fc.removeEventListener("onGetPicture", this); //画像取得完了のリスナーを解除します
  if(fc.pictureSelectArray.length <= 0)
  {
   alert("フレンド情報が見つかりませんでした");
  }
  else
  {
   console.log(fc.pictureSelectArray);
   this.onInit(); //フレンドの写真が一枚以上あれば呼ばれます
  }
 };
 /***追加部分***/
  
 //このゲームで使用する画像の準備をします。
 ja.imageUnitObj.addEventListener("onLoad", this); //imageObjがonLoadされたらthisのonLoadを実行します。
 ja.imageUnitObj.load(["Image/Bg.png""Image/block.png"]); //画像を読み込みます。
 
 var blockContainer = new ja.Container(); //表示させるブロックをまとめておくオブジェクトを生成します。
 
 //ポイントを表示させる文字列を生成します。
 var point = 0;
 var scoreObj = new ja.TextClass();
 scoreObj.text = point + "ポイント";
 scoreObj.y = 100;
 scoreObj.x = 10;
 
 //画像が読み込み終わったあとに以下が実行されます。
 this.onLoad = function()
 {
  window.scrollTo(0, 1); //アドレスバーを消します。
  
  ja.imageUnitObj.removeEventListener("onLoad", this); //onLoadは既に呼ばれたのでリスナーを解除します。
  ja.stage.addChild(ja.imageUnitObj["Bg"]); //読み込んでおいた画像を表示させます。
  ja.stage.addChild(boxObject); //ボールを表示させます。
  ja.stage.addChild(barObj); //バーを表示させます。
  ja.stage.addChild(blockContainer); //ブロックをまとめておくオブジェクトを表示します。
  ja.stage.addChild(scoreObj); 
  //ブロックを表示させます。
  var x = 10;
  for(var i = 0 ; i < 5 ; i++)
  {
   var y = 0;
   for(var j = 0 ; j < 3 ; j++)
   {
    var block = new ja.ImageClass(ja.imageUnitObj["block"]); //ブロックを生成します。
    block.x = x;
    block.y = y;
    blockContainer.addChild(block); //ブロックを表示させます。
    y += block.h + 10; //Y方向に表示位置をずらします。
   }
   x += block.w + 10; //X方向に表示位置をずらします。
  }
  
  //タッチしたときの命令を追加します。
  ja.imageUnitObj["Bg"].addEventListener("touchUp", this);
  ja.imageUnitObj["Bg"].addEventListener("touchMove", this);
 }
 
 //touchUpは画面から指が離れた瞬間に呼ばれます。
 this.touchUp = function()
 {
  ja.imageUnitObj["Bg"].removeEventListener("touchUp", this);
    
  boxObject.addEventListener("onEnterFrame" , this); //タッチが離れた瞬間にゲームをスタートさせます。
 }
 
 //バーを動かします。
 this.touchMove = function(e)
 {
  barObj.x = e.touch_x - 50;
 }
 
 //ゲームスタート後、1秒間に10回この命令が呼ばれます。
 this.onEnterFrame = function(){
  //毎回のそれぞれの増加量を設定します。
  boxObject.x += xinc;
  boxObject.y += yinc;
  
  //当たり判定を使ってブロックを崩します。
  for(var i = 0 ; i < blockContainer.numChildren() ; i++) //blockContainerに残っているブロックの数だけ処理を繰り返します。
  {
   var blockObj = blockContainer.getChildAt(i); //blockContainerからブロックをひとつ指定します。
   if(ja.hitObj.intersect(boxObject,blockObj)) //ボールとブロックが衝突しているかを判定します。
   {
    boxObject.y = blockObj.y + boxObject.h + 1;
    point = point + 10; //ポイントを増加させます。
    scoreObj.text = point + "ポイント";
    blockContainer.removeChildAt(i); //ブロックを取り除きます。
    yinc = -yinc; //方向を反転させます。
    break;
   }
  }
  
  //当たり判定を使ってボールをバーで跳ね返らせます。
  if(ja.hitObj.intersect(boxObject , barObj))
  {
   boxObject.y = barObj.y - boxObject.h - 1; //一度衝突したら完全にバーとボールを離します。
   yinc = -yinc; //方向を反転させます。
  }
  
  //ボールが壁に衝突したときに方向を変化させます。
  if(boxObject.x >= 300)
  {
   boxObject.x = 300;
   xinc = -xinc;
  }
  else if(boxObject.x <= 0)
  {
   boxObject.x = 0;
   xinc = -xinc;
  }
  
  if(boxObject.y <= 0)
  {
   boxObject.y = 0;
   yinc = -yinc;
  }
  else if(boxObject.y > 480)
  {
   var txtObj = new ja.TextClass();
   txtObj.text = "GAME OVER";
   txtObj.y = 240;
   txtObj.x = 100;
   var txtObj2 = new ja.TextClass();
   txtObj2.text = "リロードしてください";
   txtObj2.y = 290;
   txtObj2.x = 70;
   ja.stage.addChild(txtObj);
   ja.stage.addChild(txtObj2);
   boxObject.removeEventListener("onEnterFrame" , this);
  }
 }
}

 単純に画像を表示するプログラムであれば、取得した画像URLをDOMに挿入すれば表示できますが、今回はゲーム画面を描画しているCanvas内で画像を利用するので、次のステップでCanvas内に読み込みます。

Web Professionalトップページバナー

この記事の編集者は以下の記事をオススメしています

ASCII.jp会員サービス 週刊Web Professional登録

Webディレクター江口明日香が行く