1. /*
  2. *グローバル変数
  3. */
  4. //1Mを何pxで表現するか
  5. var PTM_RATIO = 32;
  6. //cocos2d-xのlayer
  7. var layer = null;
  8. //box2d の world
  9. var world = null;
  10. //box2d関連
  11. var b2BodyDef = Box2D.Dynamics.b2BodyDef;
  12. var b2Body = Box2D.Dynamics.b2Body;
  13. var b2FixtureDef = Box2D.Dynamics.b2FixtureDef;
  14. var b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape;
  15. var b2Vec2 = Box2D.Common.Math.b2Vec2;
  16. var b2World = Box2D.Dynamics.b2World;
  17. //画面上部の境界線
  18. var spr_disp_upper = null;
  19. //画面下部の境界線
  20. var spr_disp_bottom = null;
  21. //画面左側の境界線
  22. var spr_disp_left = null;
  23. //画面右側の境界線
  24. var spr_disp_right = null;
  25. /*
  26. * 弾関連
  27. */
  28. var ball_moved   = false;
  29. //弾の幅
  30. var BALL_WIDTH   = 5;
  31. //弾の高さ
  32. var BALL_HEIGHT  = 5;
  33. //弾のsprite
  34. var spr_ball    = null;
  35. //弾の速度
  36. var ball_velocity = 8;
  37. //弾の角度
  38. //右方向を0度とし、下方向を90度、左方向を180度、上方向を270度とする
  39. //すると、x座標は cos、Y座標は -sin で算出することが出来る
  40. var ball_angle   = 60.0 / 180;
  41. //弾の速度(時速 5M)
  42. var BALL_VELOCITY = 5;
  43. //弾のbody
  44. var body_ball   = null;
  45. /*
  46. * バー関連
  47. */
  48. //バーのY座標位置
  49. var BAR_Y   = 20;
  50. //バーの幅
  51. var BAR_WIDTH = 60;
  52. //バーの高さ
  53. var BAR_HEIGHT = 4;
  54. //バーのsprite
  55. var spr_bar  = null;
  56. //バーのbody
  57. var body_bar  = null;
  58. /*
  59. * ブロック関連
  60. */
  61. //ブロックの幅
  62. var BLOCK_WIDTH = 40;
  63. //ブロックの高さ
  64. var BLOCK_HEIGHT = 20;
  65. //ブロックのsprite
  66. var spr_block = new Array();
  67. //ブロックのbody
  68. var body_block = new Array();
  69. //ブロックが存在するかどうか
  70. var appear_block = new Array();
  71. /*
  72. *ゲーム用ステータス
  73. */
  74. //ブロックの残数
  75. var block_count   = 0;
  76. var Helloworld = cc.Layer.extend({
  77.   init:function () {
  78.     this._super();
  79.     var size = cc.Director.getInstance().getWinSize();
  80.     //box2d world生成
  81.     world = new b2World(new b2Vec2(0, 0), true);
  82.     world.SetContinuousPhysics(true);
  83.     var fixDef = new b2FixtureDef;
  84.     fixDef.density = 1.0;
  85.     
  86.     //摩擦係数
  87.     fixDef.friction = 0;
  88.     //反発係数
  89.     fixDef.restitution = 1;
  90.     var bodyDef = new b2BodyDef;
  91.     //create ground
  92.     bodyDef.type = b2Body.b2_staticBody;
  93.     fixDef.shape = new b2PolygonShape;
  94.     //上下の境界線の幅と高さ設定
  95.     fixDef.shape.SetAsBox(320.0 / PTM_RATIO, 1 / PTM_RATIO);
  96.     //upper
  97.     //ダミーでsprite設定
  98.     //表示は行わない
  99.     //CB関数用の変数となります
  100.     spr_disp_upper = cc.Sprite.create( “res/boll.png” );
  101.     bodyDef.position.Set(320.0 / PTM_RATIO / 2, 380.0 / PTM_RATIO);
  102.     bodyDef.userData = spr_disp_upper;
  103.     world.CreateBody(bodyDef).CreateFixture(fixDef);
  104.     //bottom
  105.     //ダミーでsprite設定
  106.     //表示は行わない
  107.     //CB関数用の変数となります
  108.     spr_disp_bottom = cc.Sprite.create( “res/boll.png” );
  109.     bodyDef.position.Set(320.0 / PTM_RATIO / 2, -1);
  110.     bodyDef.userData = spr_disp_bottom;
  111.     world.CreateBody(bodyDef).CreateFixture(fixDef);
  112.     //左右の境界線の幅と高さ設定
  113.     fixDef.shape.SetAsBox(1 / PTM_RATIO, 380.0 / PTM_RATIO);
  114.     //left
  115.     //ダミーでsprite設定
  116.     //表示は行わない
  117.     //CB関数用の変数となります
  118.     spr_disp_left = cc.Sprite.create( “res/boll.png” );
  119.     bodyDef.position.Set(0, 380.0 / PTM_RATIO / 2);
  120.     bodyDef.userData = spr_disp_left;
  121.     world.CreateBody(bodyDef).CreateFixture(fixDef);
  122.     //right
  123.     //ダミーでsprite設定
  124.     //表示は行わない
  125.     //CB関数用の変数となります
  126.     spr_disp_right = cc.Sprite.create( “res/boll.png” );
  127.     bodyDef.position.Set(320.0 / PTM_RATIO, 380.0 / PTM_RATIO / 2);
  128.     bodyDef.userData = spr_disp_right;
  129.     world.CreateBody(bodyDef).CreateFixture(fixDef);
  130.     //layerの生成
  131.     var lazyLayer = new cc.Layer.create();
  132.     this.addChild(lazyLayer);
  133.  
  134.     //背景spriteの生成
  135.     var sprite = cc.Sprite.create( “res/bg.png” );
  136.     sprite.setPosition(cc.p( size.width / 2, size.height / 2 ) );
  137.     sprite.setScale( 1.0 );
  138.     lazyLayer.addChild( sprite, 0 );
  139.  
  140.     //バーspriteの生成
  141.     spr_bar = cc.Sprite.create( “res/bar.png” );
  142.     spr_bar.setPosition( cc.p( size.width / 2 – 5, BAR_Y ) );
  143.     this.addChild( spr_bar, 0 );
  144.     body_bar = this.addNewSpriteWithCoords(spr_bar, cc.p( size.width / 2 – 5, BAR_Y ), BAR_WIDTH, BAR_HEIGHT, false);
  145.     //ボールspriteの生成
  146.     spr_ball = cc.Sprite.create( “res/boll.png” );
  147.     spr_ball.setPosition( cc.p( size.width / 2 – 5, BAR_Y + BAR_HEIGHT + BALL_HEIGHT ) );
  148.     this.addChild( spr_ball, 0 );
  149.  
  150.     //ブロックの生成
  151.     var h_size = 0;
  152.  
  153.     for( var i = 0; i < 5; i++ ){
  154.       for( var j = 0; j < 8; j++ ){
  155.         spr_block[i * 8 + j] = cc.Sprite.create( “res/block_2.png” );
  156.         spr_block[i * 8 + j].setPosition( cc.p( 20 + ( j * 40 ), 370 – h_size) );
  157.         spr_block[i * 8 + j].setScale( 1.0 );
  158.         this.addChild( spr_block[i * 8 + j], 0 );
  159.         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);
  160.         //ブロックが存在するかどうか
  161.         appear_block[i * 8 + j] = true;
  162.         block_count++;
  163.       }
  164.       h_size += 20;
  165.     }
  166.     
  167.     //タッチを有効にする
  168.     this.setTouchEnabled( true );
  169.     //box2dを反映するため、スケジューリングする
  170.     this.scheduleUpdate();
  171.     
  172.     //衝突イベントを検知する
  173.     var listener = new Box2D.Dynamics.b2ContactListener;
  174.     listener.BeginContact = function (contact) {
  175.       var contactA = contact.GetFixtureA().GetBody().GetUserData();
  176.       var contactB = contact.GetFixtureB().GetBody().GetUserData();
  177.       
  178.       if (contactA == spr_disp_upper || contactB == spr_disp_upper) {
  179.         //上の壁
  180.       }
  181.       else if (contactA == spr_disp_bottom || contactB == spr_disp_bottom) {
  182. //下の壁
  183.       }
  184.       else if (contactA == spr_disp_left  || contactB == spr_disp_left) {
  185.         //左の壁
  186.       }
  187.       else if (contactA == spr_disp_right || contactB == spr_disp_right) {
  188.         //右の壁
  189.       }
  190.       else {
  191.         //その他はブロック
  192.         for (var i = 0; i < spr_block.length; i++) {
  193.           if (contactA == spr_block[i] || contactB == spr_block[i]) {
  194.               layer.removeChild(spr_block[i]);
  195.               //gamestart対処 Start
  196.               //ブロックの数マイナス
  197.               appear_block[i] = false;
  198.               block_count–;
  199.             //破壊する
  200.             //layer.removeChild(spr_block[i]);
  201.             setTimeout(function () {world.DestroyBody(body_block[i]);}, 1);
  202.             break;
  203.           }
  204.         }
  205.       }
  206.     };
  207.     listener.EndContact = function (contact) {
  208.     };
  209.     world.SetContactListener(listener);
  210.     
  211.     //Spriteの生成
  212.     var startSprite  = cc.Sprite.create(“res/gamestart.png”);
  213.     startSprite.setPosition(cc.p( size.width / 2, size.height / 2 ));
  214.     layer.addChild(startSprite, 7);
  215.  
  216.     //フェードインの設定
  217.     var actionFadeIn = cc.FadeIn.create(0.5);
  218.  
  219.     //Delayの設定
  220.     var actionDelay  = cc.DelayTime.create(1);
  221.  
  222.     //フェードアウトの設定
  223.     var actionFadeOut = cc.FadeOut.create(0.5);
  224.  
  225.     //コールバックの設定
  226.     var actionCb   = cc.CallFunc.create(function () { 
  227.       layer.removeChild(startSprite);
  228.     },layer);
  229.  
  230.     //シーケンスの設定
  231.     var actionSeq   = cc.Sequence.create(actionFadeIn, actionDelay, actionFadeOut, actionCb);
  232.  
  233.     //アクション開始
  234.     startSprite.runAction(actionSeq);
  235.     
  236.     return true;
  237.   },
  238.   addNewSpriteWithCoords:function (sprite, p, width, height, dynamic) {
  239.     var bodyDef = new b2BodyDef();
  240.     if (dynamic == true) {
  241.       bodyDef.type = b2Body.b2_dynamicBody;
  242.       bodyDef.position.Set(1.0 * p.x / PTM_RATIO, 1.0 * p.y / PTM_RATIO);
  243.       bodyDef.userData = sprite;
  244.     } else {
  245.       bodyDef.type = b2Body.b2_staticBody;
  246.       bodyDef.position.Set(1.0 * p.x / PTM_RATIO, 1.0 * p.y / PTM_RATIO);
  247.       bodyDef.userData = sprite;
  248.     }
  249.     var body = world.CreateBody(bodyDef);
  250.     var dynamicBox = new b2PolygonShape();
  251.     dynamicBox.SetAsBox(1.0 * width / PTM_RATIO / 2.0, 1.0 * height / PTM_RATIO / 2.0);
  252.     //Define the dynamic body fixture.
  253.     var fixtureDef = new b2FixtureDef();
  254.     fixtureDef.shape = dynamicBox;
  255.     fixtureDef.density = 1.0;
  256.     
  257.     //摩擦係数
  258.     fixtureDef.friction = 0;
  259.     
  260.     //反発係数
  261.     fixtureDef.restitution = 1;
  262.     //設定する
  263.     body.CreateFixture(fixtureDef);
  264.     
  265.     return body;
  266.   },
  267.   update:function (dt) {
  268.     var velocityIterations = 8;
  269.     var positionIterations = 1;
  270.     world.Step(dt, velocityIterations, positionIterations);
  271.     for (var b = world.GetBodyList(); b; b = b.GetNext()) {
  272.       if (b.GetUserData() != null) {
  273.         var myActor = b.GetUserData();
  274.         myActor.setPosition(cc.p(b.GetPosition().x * PTM_RATIO, b.GetPosition().y * PTM_RATIO));
  275.         myActor.setRotation(-1 * cc.RADIANS_TO_DEGREES(b.GetAngle()));
  276.       }
  277.     }
  278.   },
  279.   onTouchesBegan:function (touches, event) {
  280.     console.log(“onTouchesBegan”);
  281.   },
  282.   onTouchesMoved:function (touches, event) {    
  283. var size = cc.Director.getInstance().getWinSize();
  284. //タッチポイントの取得
  285. var touch_point = touches[0].getLocation();
  286. if(touch_point.x < BAR_WIDTH/2){
  287.   spr_bar.setPosition(cc.p( BAR_WIDTH/2, BAR_Y));
  288. }
  289. else if(touch_point.x > (size.width – BAR_WIDTH/2)){
  290.   spr_bar.setPosition(cc.p(size.width – BAR_WIDTH/2, BAR_Y));
  291. }
  292. else{
  293.   spr_bar.setPosition(cc.p(touch_point.x, BAR_Y));
  294. }
  295.     //box2d側も動かす
  296.     body_bar.SetPosition(cc.p(spr_bar.getPositionX() / PTM_RATIO, spr_bar.getPositionY() / PTM_RATIO));
  297.   },
  298.   onTouchesEnded:function (touches, event) {
  299.    if (ball_moved == false) {
  300.      var size = cc.Director.getInstance().getWinSize();
  301.      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);
  302.      var b2Vec2 = Box2D.Common.Math.b2Vec2;
  303.      //弾の発射角度を調整 Start
  304.      var ball_angle_work = Math.random() * 40;
  305.      if (ball_angle_work < 20) {
  306.        ball_angle_work = -1 * ball_angle_work – 20;
  307.      } else {
  308.        ball_angle_work = ball_angle_work;
  309.      }
  310.     ball_angle = ball_angle_work / 180;
  311.      body_ball.SetLinearVelocity(new b2Vec2(-1 * ball_velocity * Math.sin(ball_angle), ball_velocity * Math.cos(ball_angle)));
  312. ball_moved = true;
  313. }
  314.   },
  315. });
  316.  
  317. var HelloWorldScene = cc.Scene.extend({
  318.   onEnter:function () {
  319.     this._super();
  320.     layer = new Helloworld();
  321.     layer.init();
  322.     this.addChild(layer);
  323.   }
  324. });