[ cocos2d-html ] ブロック崩し -完成-

前回に引き続き、ブロック崩しの作成について、説明していきます。

ゲームオーバーや、残機設定等の細かな処理の追加となりますので
複数個所に渡って変更があります。
始めに最終のソースコードを記載いたします。
強調文字になっている箇所が今回の修正・追加対象となります。

  1. /*
  2. グローバル変数
  3. */
  4. //1Mを何pxで表現するか
  5. var PTM_RATIO = 32;
  6.  
  7. //cocos2d-xのlayer
  8. var layer = null;
  9.  
  10. //box2d の world
  11. var world = null;
  12.  
  13. //box2d関連
  14. var b2BodyDef = Box2D.Dynamics.b2BodyDef;
  15. var b2Body = Box2D.Dynamics.b2Body;
  16. var b2FixtureDef = Box2D.Dynamics.b2FixtureDef;
  17. var b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape;
  18. var b2Vec2 = Box2D.Common.Math.b2Vec2;
  19. var b2World = Box2D.Dynamics.b2World;
  20.  
  21. //画面上部の境界線
  22. var spr_disp_upper = null;
  23.  
  24. //画面下部の境界線
  25. var spr_disp_bottom = null;
  26.  
  27. //画面左側の境界線
  28. var spr_disp_left = null;
  29.  
  30. //画面右側の境界線
  31. var spr_disp_right = null;
  32. /*
  33. * 弾関連
  34. */
  35. var ball_moved   = false;
  36.  
  37. //弾の幅
  38. var BALL_WIDTH   = 5;
  39.  
  40. //弾の高さ
  41. var BALL_HEIGHT  = 5;
  42.  
  43. //弾のsprite
  44. var spr_ball    = null;
  45.  
  46. //弾の速度
  47. var ball_velocity = 8;
  48.  
  49. //弾の角度
  50. //右方向を0度とし、下方向を90度、左方向を180度、上方向を270度とする
  51. //すると、x座標は cos、Y座標は -sin で算出することが出来る
  52. var ball_angle   = 60.0 / 180;
  53.  
  54. //弾の速度(時速 5M)
  55. var BALL_VELOCITY = 5;
  56.  
  57. //弾のbody
  58. var body_ball   = null;
  59.  
  60. /*
  61. * バー関連
  62. */
  63. //バーのY座標位置
  64. var BAR_Y   = 20;
  65.  
  66. //バーの幅
  67. var BAR_WIDTH = 60;
  68.  
  69. //バーの高さ
  70. var BAR_HEIGHT = 4;
  71.  
  72. //バーのsprite
  73. var spr_bar  = null;
  74.  
  75. //バーのbody
  76. var body_bar  = null;
  77.  
  78. /*
  79. * ブロック関連
  80. */
  81. //ブロックの幅
  82. var BLOCK_WIDTH = 40;
  83.  
  84. //ブロックの高さ
  85. var BLOCK_HEIGHT = 20;
  86.  
  87. //ブロックのsprite
  88. var spr_block = new Array();
  89.  
  90. //ブロックのbody
  91. var body_block = new Array();
  92.  
  93. //ブロックが存在するかどうか
  94. var appear_block = new Array();
  95. /*
  96. *ゲーム用ステータス
  97. */
  98. var STAT_GAME_START = 1;
  99. var STAT_GAME_PLAY = 2;
  100. var STAT_GAME_END  = 3;
  101. var STAT_GAME_OVER = 4;
  102. var block_status = STAT_GAME_START;
  103.  
  104. //ブロック関連の残数
  105. var block_life   = 3;
  106. var block_stage   = 1;
  107. var block_count   = 0;
  108.  
  109. var overSprite;
  110. var clearSprite;
  111.  
  112. var Helloworld = cc.Layer.extend({
  113.  
  114.   init:function () {
  115.     this._super();
  116.     var size = cc.Director.getInstance().getWinSize();
  117.  
  118.     //box2d world生成
  119.     world = new b2World(new b2Vec2(0, 0), true);
  120.     world.SetContinuousPhysics(true);
  121.  
  122.     var fixDef = new b2FixtureDef;
  123.     fixDef.density = 1.0;
  124.  
  125.     //摩擦係数
  126.     fixDef.friction = 0;
  127.  
  128.     //反発係数
  129.     fixDef.restitution = 1;
  130.  
  131.     var bodyDef = new b2BodyDef;
  132.  
  133.     //create ground
  134.     bodyDef.type = b2Body.b2_staticBody;
  135.     fixDef.shape = new b2PolygonShape;
  136.  
  137.     //上下の境界線の幅と高さ設定
  138.     fixDef.shape.SetAsBox(320.0 / PTM_RATIO, 1 / PTM_RATIO);
  139.  
  140.     //upper
  141.     //ダミーでsprite設定
  142.     //表示は行わない
  143.     //CB関数用の変数となります
  144.     spr_disp_upper = cc.Sprite.create( “res/boll.png” );
  145.  
  146.     bodyDef.position.Set(320.0 / PTM_RATIO / 2, 380.0 / PTM_RATIO);
  147.     bodyDef.userData = spr_disp_upper;
  148.     world.CreateBody(bodyDef).CreateFixture(fixDef);
  149.  
  150.     //bottom
  151.     //ダミーでsprite設定
  152.     //表示は行わない
  153.     //CB関数用の変数となります
  154.     spr_disp_bottom = cc.Sprite.create( “res/boll.png” );
  155.  
  156.     bodyDef.position.Set(320.0 / PTM_RATIO / 2, -1);
  157.     bodyDef.userData = spr_disp_bottom;
  158.     world.CreateBody(bodyDef).CreateFixture(fixDef);
  159.  
  160.     //左右の境界線の幅と高さ設定
  161.     fixDef.shape.SetAsBox(1 / PTM_RATIO, 380.0 / PTM_RATIO);
  162.  
  163.     //left
  164.     //ダミーでsprite設定
  165.     //表示は行わない
  166.     //CB関数用の変数となります
  167.     spr_disp_left = cc.Sprite.create( “res/boll.png” );
  168.  
  169.     bodyDef.position.Set(0, 380.0 / PTM_RATIO / 2);
  170.     bodyDef.userData = spr_disp_left;
  171.     world.CreateBody(bodyDef).CreateFixture(fixDef);
  172.  
  173.     //right
  174.     //ダミーでsprite設定
  175.     //表示は行わない
  176.     //CB関数用の変数となります
  177.     spr_disp_right = cc.Sprite.create( “res/boll.png” );
  178.  
  179.     bodyDef.position.Set(320.0 / PTM_RATIO, 380.0 / PTM_RATIO / 2);
  180.     bodyDef.userData = spr_disp_right;
  181.     world.CreateBody(bodyDef).CreateFixture(fixDef);
  182.  
  183.     //ゲームオーバー
  184.     overSprite = cc.Sprite.create(“res/gameover.png”);
  185.     overSprite.setPosition(cc.p( size.width / 2, size.height / 2 ));
  186.     overSprite.setAnchorPoint(cc.p(0, 0));
  187.  
  188.     //ゲームクリア
  189.     clearSprite = cc.Sprite.create(“res/gameclear.png”);
  190.     clearSprite.setPosition(cc.p( size.width / 2, size.height / 2 ));
  191.     clearSprite.setAnchorPoint(cc.p(0, 0));
  192.  
  193.         //layerの生成
  194.         var lazyLayer = new cc.Layer.create();
  195.         this.addChild(lazyLayer);
  196.      
  197.         //背景spriteの生成
  198.         var sprite = cc.Sprite.create( “res/bg.png” );
  199.         sprite.setPosition(cc.p( size.width / 2, size.height / 2 ) );
  200.         sprite.setScale( 1.0 );
  201.         lazyLayer.addChild( sprite, 0 );
  202.      
  203.         //バーspriteの生成
  204.         spr_bar = cc.Sprite.create( “res/bar.png” );
  205.         spr_bar.setPosition( cc.p( size.width / 2 – 5, BAR_Y ) );
  206.         this.addChild( spr_bar, 0 );
  207.         body_bar = this.addNewSpriteWithCoords(spr_bar, cc.p( size.width / 2 – 5, BAR_Y ), BAR_WIDTH, BAR_HEIGHT, false);
  208.  
  209.      
  210.         //ボールspriteの生成
  211.         spr_ball = cc.Sprite.create( “res/boll.png” );
  212.         spr_ball.setPosition( cc.p( size.width / 2 – 5, BAR_Y + BAR_HEIGHT + BALL_HEIGHT ) );
  213.         this.addChild( spr_ball, 0 );
  214.      
  215.         //ブロックの生成
  216.         var h_size = 0;
  217.  
  218.         for( var i = 0; i < 5; i++ ) {
  219.             for( var j = 0; j < 8; j++ ) {
  220.                 spr_block[i * 8 + j] = cc.Sprite.create( “res/block_2.png” );
  221.                 spr_block[i * 8 + j].setPosition( cc.p( 20 + ( j * 40 ), 370 – h_size) );
  222.                 spr_block[i * 8 + j].setScale( 1.0 );
  223.                 this.addChild( spr_block[i * 8 + j], 0 );
  224.                 body_block[i * 8 + j] = this.addNewSpriteWithCoords(spr_block[i * 8 + j], cc.p( 20 + ( j * 40 ), 370 – h_size), BLOCK_WIDTH, BLOCK_HEIGHT, false);
  225.  
  226.         //ブロックが存在するかどうか
  227.         appear_block[i * 8 + j] = true;
  228.         block_count++;
  229.               
  230.       }
  231.       h_size += 20;
  232.   
  233.     }
  234.         
  235.     //タッチを有効にする
  236.     this.setTouchEnabled( true );
  237.  
  238.     //box2dを反映するため、スケジューリングする
  239.     this.scheduleUpdate();
  240.         
  241.         
  242.         
  243.         //衝突イベントを検知する
  244.     var listener = new Box2D.Dynamics.b2ContactListener;
  245.     listener.BeginContact = function (contact) {
  246.       var contactA = contact.GetFixtureA().GetBody().GetUserData();
  247.       var contactB = contact.GetFixtureB().GetBody().GetUserData();
  248.  
  249.       if (contactA == spr_disp_upper || contactB == spr_disp_upper) {
  250.         //上の壁
  251.       }
  252.       else if (contactA == spr_disp_bottom || contactB == spr_disp_bottom) {
  253.         setTimeout(function () {
  254.             //今のバーとボールを消す
  255.             layer.removeChild(spr_bar);
  256.             layer.removeChild(spr_ball);
  257.             world.DestroyBody(body_bar);
  258.             world.DestroyBody(body_ball);
  259.                
  260.             //再度、バーとボールを描画する
  261.             //バー画像を設定する
  262.             //sprite定義
  263.             spr_bar = cc.Sprite.create( “res/bar.png” );
  264.             spr_bar.setPosition( cc.p( size.width / 2 – 5, BAR_Y ) );
  265.             layer.addChild( spr_bar, 0 );
  266.             body_bar = layer.addNewSpriteWithCoords(spr_bar, cc.p( size.width / 2 – 5, BAR_Y ),BAR_WIDTH, BAR_HEIGHT, false);
  267.             //ボール画像を設定するEIGHT, false);
  268.             spr_ball = cc.Sprite.create( “res/boll.png” );
  269.             spr_ball.setPosition( cc.p( size.width / 2 – 5, BAR_Y + BAR_HEIGHT + BALL_HEIGHT ) );
  270.             layer.addChild( spr_ball, 0 );
  271.             
  272.             //ボールが動いていない状態にする
  273.             ball_moved = false;
  274.             
  275.             //タッチも一旦破棄する
  276.             layer.isMouseDown = false;
  277.             //gamestart対処 Start
  278.             //残機をマイナスする
  279.             block_life–;
  280.             if (block_life <= 0) {
  281.               //ゲームオーバー
  282.               block_status = STAT_GAME_OVER;
  283.                   
  284.               layer.addChild(overSprite);
  285.               var actionFadeIn = cc.FadeIn.create(0.5);
  286.               var actionDelay  = cc.DelayTime.create(1);
  287.               var actionFadeOut = cc.FadeOut.create(0.5);
  288.               var actionCb   = cc.CallFunc.create(function () {
  289.               layer.removeChild(overSprite);
  290.               
  291.               //残機を3に戻す
  292.               block_life = 3;
  293.               
  294.               //ブロック数初期化
  295.               block_count = 0;
  296.               
  297.               //ブロックを全消去して、再度配置し直す
  298.               //ブロックを表示する
  299.               var h_size = 0;
  300.               for( var i = 0; i < 5; i++ )
  301.               {
  302.                 for( var j = 0; j < 8; j++ )
  303.                 {
  304.                   //消去
  305.                   if (appear_block[i * 8 + j]) {
  306.                     layer.removeChild(spr_block[i * 8 + j]);
  307.                     world.DestroyBody(body_block[i * 8 + j]);;
  308.                     
  309.                   }
  310.                   //配置
  311.                   spr_block[i * 8 + j] = cc.Sprite.create( “res/block_2.png” );
  312.                   spr_block[i * 8 + j].setPosition( cc.p( 20 + ( j * 40 ), 370 – h_size) );
  313.                   spr_block[i * 8 + j].setScale( 0.5 );
  314.                   this.addChild( spr_block[i * 8 + j], 0 );
  315.                   body_block[i * 8 + j] = this.addNewSpriteWithCoords(spr_block[i * 8 + j], cc.p( 20 + ( j * 40 ), 370 – h_size), BLOCK_WIDTH, BLOCK_HEIGHT, false);
  316.                   appear_block[i * 8 + j] = true;
  317.                   block_count++;
  318.               
  319.                 }
  320.                 h_size += 20;
  321.                 
  322.               }
  323.             
  324.             }, layer);
  325.             var actionSeq   = cc.Sequence.create(actionFadeIn, actionDelay, actionFadeOut, actionCb);
  326.             var action    = cc.RepeatForever.create(actionSeq);
  327.           }
  328.         }, 1);
  329.       }
  330.       else if (contactA == spr_disp_left  || contactB == spr_disp_left) {
  331.         //左の壁
  332.       }
  333.       else if (contactA == spr_disp_right || contactB == spr_disp_right) {
  334.         //右の壁
  335.       }
  336.       else {
  337.         //その他はブロック
  338.         for (var i = 0; i < spr_block.length; i++) {
  339.           if (contactA == spr_block[i] || contactB == spr_block[i]) {
  340.             layer.removeChild(spr_block[i]);
  341.  
  342.             //gamestart対処 Start
  343.             //ブロックの数マイナス
  344.             appear_block[i] = false;
  345.             block_count–;
  346.  
  347.             //ブロックの数が0ならクリア
  348.             if (block_count <= 39) {
  349.               //今のバーとボールを消す
  350.               layer.removeChild(spr_ball);
  351.               world.DestroyBody(body_ball);
  352.  
  353.               //ボールが動いていない状態にする
  354.               ball_moved = false;
  355.  
  356.               //タッチも一旦破棄する
  357.               layer.isMouseDown = false;
  358.  
  359.               //クリア
  360.               block_status = STAT_GAME_END;
  361.  
  362.               layer.addChild(clearSprite);
  363.               var actionFadeIn = cc.FadeIn.create(0.5);
  364.               var actionDelay  = cc.DelayTime.create(1);
  365.               var actionFadeOut = cc.FadeOut.create(0.5);
  366.  
  367.               var actionSeq   = cc.Sequence.create(actionFadeIn, actionDelay, actionFadeOut);
  368.               var action    = cc.RepeatForever.create(actionSeq);
  369.  
  370.               clearSprite.runAction(action);
  371.             }
  372.             setTimeout(function () {
  373.               world.DestroyBody(body_block[i]);
  374.             }, 1);
  375.             break;
  376.           }
  377.         }
  378.       }
  379.       //跳ね返った後の速度を取得し、遅くなっていたら補正する
  380.       setTimeout(function () {
  381.         var b2Vec2 = body_ball.GetLinearVelocity();
  382.         var vect_x = b2Vec2.x;
  383.         var vect_y = b2Vec2.y;
  384.         if (vect_x * vect_x + vect_y * vect_y < (ball_velocity - 2) * (ball_velocity - 2)) {
  385.           //かなり遅くなっている
  386.           //補正する
  387.           var b2Vec2 = Box2D.Common.Math.b2Vec2;
  388.           var boost = false;
  389.           for (var i = 1; i <= 20; i++) {
  390.             if ((vect_x * (1 + 0.1 * i)) * (vect_x * (1 + 0.1 * i)) + (vect_y * (1 + 0.1 * i)) * (vect_y * (1 + 0.1 * i)) >= (ball_velocity – 2) * (ball_velocity – 2)) {
  391.               body_ball.SetLinearVelocity(new b2Vec2(vect_x * (1 + 0.1 * i), vect_y * (1 + 0.1 * i)));
  392.               boost = true;
  393.               break;
  394.             }
  395.           }
  396.           if (boost == false) {
  397.             body_ball.SetLinearVelocity(new b2Vec2(vect_x * (1 + 0.1 * 20), vect_y * (1 + 0.1 * 20)));
  398.           }
  399.         }
  400.       }, 100);
  401.     };
  402.     listener.EndContact = function (contact) {
  403.     };
  404.     world.SetContactListener(listener);
  405.     
  406.     //Spriteの生成
  407.     var startSprite  = cc.Sprite.create(“res/gamestart.png”);
  408.     startSprite.setPosition(cc.p( size.width / 2, size.height / 2 ));
  409.     layer.addChild(startSprite, 7);
  410.     
  411.     //フェードインの設定
  412.     var actionFadeIn = cc.FadeIn.create(0.5);
  413.     
  414.     //Delayの設定
  415.     var actionDelay  = cc.DelayTime.create(1);
  416.     
  417.     //フェードアウトの設定
  418.     var actionFadeOut = cc.FadeOut.create(0.5);
  419.     
  420.     //コールバックの設定
  421.     var actionCb   = cc.CallFunc.create(function () {
  422.       layer.removeChild(startSprite);
  423.       block_status = STAT_GAME_PLAY;
  424.       
  425.     },layer);
  426.     
  427.     //シーケンスの設定
  428.     var actionSeq   = cc.Sequence.create(actionFadeIn, actionDelay, actionFadeOut, actionCb);
  429.     
  430.     //アクション開始
  431.     startSprite.runAction(actionSeq);
  432.     
  433.     return true;
  434.   },
  435.  
  436.   addNewSpriteWithCoords:function (sprite, p, width, height, dynamic) {
  437.  
  438.     var bodyDef = new b2BodyDef();
  439.  
  440.     if (dynamic == true) {
  441.       bodyDef.type = b2Body.b2_dynamicBody;
  442.       bodyDef.position.Set(1.0 * p.x / PTM_RATIO, 1.0 * p.y / PTM_RATIO);
  443.       bodyDef.userData = sprite;
  444.     } else {
  445.       bodyDef.type = b2Body.b2_staticBody;
  446.       bodyDef.position.Set(1.0 * p.x / PTM_RATIO, 1.0 * p.y / PTM_RATIO);
  447.       bodyDef.userData = sprite;
  448.     }
  449.  
  450.     var body = world.CreateBody(bodyDef);
  451.  
  452.     var dynamicBox = new b2PolygonShape();
  453.     dynamicBox.SetAsBox(1.0 * width / PTM_RATIO / 2.0, 1.0 * height / PTM_RATIO / 2.0);
  454.  
  455.     //Define the dynamic body fixture.
  456.     var fixtureDef = new b2FixtureDef();
  457.     fixtureDef.shape = dynamicBox;
  458.     fixtureDef.density = 1.0;
  459.  
  460.     //摩擦係数
  461.     fixtureDef.friction = 0;
  462.  
  463.     //反発係数
  464.     fixtureDef.restitution = 1;
  465.  
  466.     //設定する
  467.     body.CreateFixture(fixtureDef);
  468.  
  469.     return body;
  470.   },
  471.  
  472. update:function (dt) {
  473.     var velocityIterations = 8;
  474.     var positionIterations = 1;
  475.     world.Step(dt, velocityIterations, positionIterations);
  476.  
  477.     for (var b = world.GetBodyList(); b; b = b.GetNext()) {
  478.       if (b.GetUserData() != null) {
  479.         var myActor = b.GetUserData();
  480.         myActor.setPosition(cc.p(b.GetPosition().x * PTM_RATIO, b.GetPosition().y * PTM_RATIO));
  481.         myActor.setRotation(-1 * cc.RADIANS_TO_DEGREES(b.GetAngle()));
  482.       }
  483.     }
  484.  
  485.   },
  486.  
  487.   onTouchesBegan:function (touches, event) {
  488.     //ゲーム開始アニメーション中はタッチ無効
  489.     if (block_status == STAT_GAME_START) {
  490.       return;
  491.     }
  492.     if (block_status == STAT_GAME_END) {
  493.       return;
  494.     }
  495.     if (block_status == STAT_GAME_OVER) {
  496.       return;
  497.     }
  498.   },
  499.   onTouchesMoved:function (touches, event) {
  500.     //ゲーム開始アニメーション中はタッチ無効
  501.     if (block_status == STAT_GAME_START) {
  502.       return;
  503.     }
  504.     if (block_status == STAT_GAME_END) {
  505.       return;
  506.     }
  507.     if (block_status == STAT_GAME_OVER) {
  508.       return;
  509.     }
  510.     var size = cc.Director.getInstance().getWinSize();
  511.     //タッチポイントの取得
  512.     var touch_point = touches[0].getLocation();
  513.     if(touch_point.x < BAR_WIDTH/2) {
  514.       spr_bar.setPosition(cc.p( BAR_WIDTH/2, BAR_Y));
  515.     }
  516.     else if(touch_point.x > (size.width – BAR_WIDTH/2)) {
  517.       spr_bar.setPosition(cc.p(size.width – BAR_WIDTH/2, BAR_Y));
  518.     }
  519.     else {
  520.       spr_bar.setPosition(cc.p(touch_point.x, BAR_Y));
  521.     }
  522.     //box2d側も動かす
  523.     body_bar.SetPosition(cc.p(spr_bar.getPositionX() / PTM_RATIO, spr_bar.getPositionY() / PTM_RATIO));
  524.   },
  525.   onTouchesEnded:function (touches, event) {
  526.     //ゲーム開始アニメーション中はタッチ無効
  527.     if (block_status == STAT_GAME_START) {
  528.       return;
  529.     }
  530.     if (block_status == STAT_GAME_END) {
  531.       return;
  532.     }
  533.     if (block_status == STAT_GAME_OVER) {
  534.       return;
  535.     }
  536.     if (ball_moved == false) {
  537.       var size = cc.Director.getInstance().getWinSize();
  538.       body_ball = this.addNewSpriteWithCoords(spr_ball, cc.p( size.width / 2 – 5, BAR_Y + BAR_HEIGHT / 2 + BALL_HEIGHT / 2 ), BALL_WIDTH, BALL_HEIGHT, true);
  539.       var b2Vec2 = Box2D.Common.Math.b2Vec2;
  540.       //弾の発射角度を調整 Start
  541.       var ball_angle_work = Math.random() * 40;
  542.       if (ball_angle_work < 20) {
  543.         ball_angle_work = -1 * ball_angle_work – 20;
  544.       } else {
  545.         ball_angle_work = ball_angle_work;
  546.       }
  547.       ball_angle = ball_angle_work / 180;
  548.       body_ball.SetLinearVelocity(new b2Vec2(-1 * ball_velocity * Math.sin(ball_angle), ball_velocity * Math.cos(ball_angle)));
  549.       ball_moved = true;
  550.     }
  551.   },
  552. });
  553.  
  554. var HelloWorldScene = cc.Scene.extend({
  555.   onEnter:function () {
  556.         this._super();
  557.         layer = new Helloworld();
  558.         layer.init();
  559.         this.addChild(layer);
  560.       
  561.   }
  562. });

おおまかな説明としましては
ゲームクリア・ゲームオーバーのスプライトを新たに定義し
衝突イベント検知部に処理を追加して、下の壁(下限)との衝突判定を検知した場合
残機を1ずつ減らし、if文によってゲーム続行か終了かを判定しています。

他には、ゲーム状態を保持する変数を定義して
ゲーム中以外はタッチを無効にしており
ゲームスタートのフェードアウトを行った後のスプライトを消去するタイミングにて
タッチを有効にしています。

一番大きな処理追加としましては以下になります。

  1. setTimeout(function () {
  2.   var b2Vec2 = body_ball.GetLinearVelocity();
  3.   var vect_x = b2Vec2.x;
  4.   var vect_y = b2Vec2.y;
  5.   if (vect_x * vect_x + vect_y * vect_y < (ball_velocity - 2) * (ball_velocity - 2)) {
  6.     //かなり遅くなっている
  7.     //補正する
  8.     var b2Vec2 = Box2D.Common.Math.b2Vec2;
  9.     var boost = false;
  10.     for (var i = 1; i <= 20; i++) {
  11.       if ((vect_x * (1 + 0.1 * i)) * (vect_x * (1 + 0.1 * i)) + (vect_y * (1 + 0.1 * i)) * (vect_y * (1 + 0.1 * i)) >= (ball_velocity – 2) * (ball_velocity – 2)) {
  12.         body_ball.SetLinearVelocity(new b2Vec2(vect_x * (1 + 0.1 * i), vect_y * (1 + 0.1 * i)));
  13.         boost = true;
  14.         break;
  15.       }
  16.     }
  17.     if (boost == false) {
  18.       body_ball.SetLinearVelocity(new b2Vec2(vect_x * (1 + 0.1 * 20), vect_y * (1 + 0.1 * 20)));
  19.     }
  20.   }
  21. }, 100);

使用するボールが異形だった場合、当たる場所によっては
衝突後にスピードが落ちてしまう可能性があります。

今回は、ブロック崩しということで
ボールの速度はある程度一定を保つことが望ましいです。
その為、この処理を記載して
ボールのスピードをコントロールしております。

以上で、ブロック崩しの作成は終了となります。

<次回以降の更新について>
次回は、cocos2d-xにて、JNIを使用したネイティブ連携処理(Android側)をご紹介します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*