thisizmonster

game.js

Sep 16th, 2011
302
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var carGame = {
  2.   STATE_STARTING_SCREEN : 1,
  3.   STATE_PLAYING : 2,
  4.   STATE_GAMEOVER_SCREEN : 3,
  5.   state : 0,
  6.   fuel: 0,
  7.   fuelMax: 0,
  8.   currentLevel: 0
  9. };
  10.  
  11. carGame.levels = new Array();  // Лэвэл буюу үеүүдийг хадгалах
  12. carGame.levels[0] = [{
  13.   "type":"car",
  14.   "x":50,
  15.   "y":210,
  16.   "fuel":12
  17. },
  18. {
  19.   "type":"box",
  20.   "x":250,
  21.   "y":270,
  22.   "width":250,
  23.   "height":25,
  24.   "rotation":0
  25. },
  26. {
  27.   "type":"box",
  28.   "x":500,
  29.   "y":250,
  30.   "width":65,
  31.   "height":15,
  32.   "rotation":-10
  33. },
  34. {
  35.   "type":"box",
  36.   "x":600,
  37.   "y":225,
  38.   "width":80,
  39.   "height":15,
  40.   "rotation":-20
  41. },
  42. {
  43.   "type":"box",
  44.   "x":950,
  45.   "y":225,
  46.   "width":80,
  47.   "height":15,
  48.   "rotation":20
  49. },
  50. {
  51.   "type":"box",
  52.   "x":1100,
  53.   "y":250,
  54.   "width":100,
  55.   "height":15,
  56.   "rotation":0
  57. },
  58. {
  59.   "type":"win",
  60.   "x":1200,
  61.   "y":215,
  62.   "width":15,
  63.   "height":25,
  64.   "rotation":0
  65. }];
  66.  
  67. carGame.levels[1] = [{
  68.   "type":"car",
  69.   "x":50,
  70.   "y":310,
  71.   "fuel":20
  72. },
  73. {
  74.   "type":"box",
  75.   "x":250,
  76.   "y":370,
  77.   "width":250,
  78.   "height":25,
  79.   "rotation":0
  80. },
  81. {
  82.   "type":"box",
  83.   "x":500,
  84.   "y":350,
  85.   "width":65,
  86.   "height":15,
  87.   "rotation":-10
  88. },
  89. {
  90.   "type":"box",
  91.   "x":600,
  92.   "y":325,
  93.   "width":80,
  94.   "height":15,
  95.   "rotation":-20
  96. },
  97. {
  98.   "type":"box",
  99.   "x":666,
  100.   "y":285,
  101.   "width":80,
  102.   "height":15,
  103.   "rotation":-32
  104. },
  105. {
  106.   "type":"box",
  107.   "x":950,
  108.   "y":225,
  109.   "width":80,
  110.   "height":15,
  111.   "rotation":15
  112. },
  113. {
  114.   "type":"box",
  115.   "x":1100,
  116.   "y":250,
  117.   "width":100,
  118.   "height":15,
  119.   "rotation":0
  120. },
  121. {
  122.   "type":"win",
  123.   "x":1200,
  124.   "y":215,
  125.   "width":15,
  126.   "height":25,
  127.   "rotation":0
  128. }];
  129.  
  130. carGame.levels[2] = [{
  131.   "type":"car",
  132.   "x":50,
  133.   "y":310,
  134.   "fuel":50
  135. },
  136. {
  137.   "type":"box",
  138.   "x":150,
  139.   "y":370,
  140.   "width":150,
  141.   "height":25,
  142.   "rotation":0
  143. },
  144. {
  145.   "type":"box",
  146.   "x":300,
  147.   "y":356,
  148.   "width":25,
  149.   "height":15,
  150.   "rotation":-10
  151. },
  152. {
  153.   "type":"box",
  154.   "x":500,
  155.   "y":350,
  156.   "width":65,
  157.   "height":15,
  158.   "rotation":-10
  159. },
  160. {
  161.   "type":"box",
  162.   "x":600,
  163.   "y":325,
  164.   "width":80,
  165.   "height":15,
  166.   "rotation":-20
  167. },
  168. {
  169.   "type":"box",
  170.   "x":666,
  171.   "y":285,
  172.   "width":80,
  173.   "height":15,
  174.   "rotation":-32
  175. },
  176. {
  177.   "type":"box",
  178.   "x":950,
  179.   "y":225,
  180.   "width":80,
  181.   "height":15,
  182.   "rotation":10
  183. },
  184. {
  185.   "type":"box",
  186.   "x":1100,
  187.   "y":250,
  188.   "width":100,
  189.   "height":15,
  190.   "rotation":0
  191. },
  192. {
  193.   "type":"win",
  194.   "x":1200,
  195.   "y":215,
  196.   "width":15,
  197.   "height":25,
  198.   "rotation":0
  199. }];
  200.  
  201. carGame.levels[3] = [{
  202.   "type":"car",
  203.   "x":50,
  204.   "y":210,
  205.   "fuel":20
  206. },
  207. {
  208.   "type":"box",
  209.   "x":100,
  210.   "y":270,
  211.   "width":190,
  212.   "height":15,
  213.   "rotation":20
  214. },
  215. {
  216.   "type":"box",
  217.   "x":380,
  218.   "y":320,
  219.   "width":100,
  220.   "height":15,
  221.   "rotation":-10
  222. },
  223. {
  224.   "type":"box",
  225.   "x":666,
  226.   "y":285,
  227.   "width":80,
  228.   "height":15,
  229.   "rotation":-32
  230. },
  231. {
  232.   "type":"box",
  233.   "x":950,
  234.   "y":295,
  235.   "width":80,
  236.   "height":15,
  237.   "rotation":20
  238. },
  239. {
  240.   "type":"box",
  241.   "x":1100,
  242.   "y":310,
  243.   "width":100,
  244.   "height":15,
  245.   "rotation":0
  246. },
  247. {
  248.   "type":"win",
  249.   "x":1200,
  250.   "y":275,
  251.   "width":15,
  252.   "height":25,
  253.   "rotation":0
  254. }];
  255.  
  256. carGame.levels[4] = [{
  257.   "type":"car",
  258.   "x":50,
  259.   "y":210,
  260.   "fuel":20
  261. },
  262. {
  263.   "type":"box",
  264.   "x":100,
  265.   "y":270,
  266.   "width":190,
  267.   "height":15,
  268.   "rotation":20
  269. },
  270. {
  271.   "type":"box",
  272.   "x":380,
  273.   "y":320,
  274.   "width":100,
  275.   "height":15,
  276.   "rotation":-10
  277. },
  278. {
  279.   "type":"box",
  280.   "x":686,
  281.   "y":285,
  282.   "width":80,
  283.   "height":15,
  284.   "rotation":-32
  285. },
  286. {
  287.   "type":"box",
  288.   "x":250,
  289.   "y":495,
  290.   "width":80,
  291.   "height":15,
  292.   "rotation":40
  293. },
  294. {
  295.   "type":"box",
  296.   "x":500,
  297.   "y":540,
  298.   "width":200,
  299.   "height":15,
  300.   "rotation":0
  301. },
  302. {
  303.   "type":"win",
  304.   "x":220,
  305.   "y":425,
  306.   "width":15,
  307.   "height":25,
  308.   "rotation":23
  309. }];
  310.  
  311. var car;                // машины обьект
  312. var canvas;             // үндсэн канвас
  313. var ctx;                // canvas ийн 2d хэлбэрийг хадгална
  314. var canvasWidth;        // канвасын өргөн
  315. var canvasHeight;       // канвасын өндөр
  316. $(function() {
  317.   carGame.state = carGame.STATE_STARTING_SCREEN;
  318.    
  319.   $('#game').click(function(){
  320.     if (carGame.state == carGame.STATE_STARTING_SCREEN)
  321.     {
  322.      
  323.       carGame.state = carGame.STATE_PLAYING;
  324.  
  325.      
  326.       restartGame(carGame.currentLevel);
  327.            
  328.             step();
  329.     }              
  330.   });
  331.  
  332.   console.log("The world is created. ", carGame.world);   // Консол руу бичиж байна
  333.   canvas = document.getElementById('game');       // канвасыг id гаар нь дамжуулж авах
  334.   ctx = canvas.getContext('2d');                  // канвасын 2d хэлбэрийг авах
  335.   canvasWidth = parseInt(canvas.width);
  336.   canvasHeight = parseInt(canvas.height);
  337.   drawWorld(carGame.world, ctx);                  // дэлхийг үүсгэх
  338.   step();                       // цагийг ажиллуулах
  339. });
  340. function createWorld() {
  341.   var worldAABB = new b2AABB();         // b2AABB функц нь хоосон орон зайг тодорхойлж өгдөг.
  342.   worldAABB.minVertex.Set(-4000, -4000);    // зүүн дээрх өнцөг буюу left, top утга
  343.   worldAABB.maxVertex.Set(4000, 4000);      // баруун доорх өнцөг буюу right, bottom утга. Ингэснээр 8000x8000 хэмжээтэй талбай үүслээ
  344.  
  345.   // b2Vec2 функцаар тухайн обьектын татах хүчийг тодорхойлж өгдөг.
  346.   // Авах параметр нь 1x2 хэмжээс бүхий матрикс хэлбэртэй байдаг. Эгц доош нь 300 гийн таталт өгч байна.
  347.   var gravity = new b2Vec2(0, 300);
  348.  
  349.   // Физик обьект хэт их оруулах нь тоглоомын FPS д сөргөөр нөлөөлдэг. Хэдий чинээ ихийг оруулна төдий чинээ
  350.   // давталт, шалгалтууд gameloops д явагддаг. Үүнээс сэргийлэхийн тулд зарим обьектыг "унтуулах" буюу хөдөлгөөнгүй
  351.   // бэхэлж, түүнийгээ жагсаалтаас гаргадаг.
  352.   var doSleep = false;
  353.  
  354.   // b2World функцаар обьектыг үүсгэнэ. Үүнд хэмжээс, таталцал, унтаа эсэхийг оруулдаг.
  355.   var world = new b2World(worldAABB, gravity, doSleep);
  356.  
  357.   // обьектыг буцааж байна. 8р мөрийг харна уу.
  358.   return world;
  359. }
  360.  
  361. // Гадаргуу зурах функц.
  362. function createGround(x, y, width, height, rotation, type) {
  363.   // дүрсний тодорхойлолт
  364.   var groundSd = new b2BoxDef();
  365.   groundSd.extents.Set(width, height);
  366.   groundSd.restitution = 0.4;
  367.   if (type == "win") {
  368.     groundSd.userData = document.getElementById('flag');
  369.   }
  370.   // Тодорхойлсон дүрсээ биетжүүлэх
  371.   var groundBd = new b2BodyDef();
  372.   groundBd.AddShape(groundSd);
  373.   groundBd.position.Set(x, y);
  374.   groundBd.rotation = rotation * Math.PI / 180;   // Энд өгөгдөх rotation ийг радиан аар өгдөгийг анхаараарай
  375.   var body = carGame.world.CreateBody(groundBd);
  376.   return body;
  377. }
  378.  
  379. // Машиныг зурах
  380. function createCarAt(x, y) {
  381.   // Машины дөрвөлжин биетийг тодорхойлох
  382.   var boxSd = new b2BoxDef();
  383.   boxSd.density = 1.0;
  384.   boxSd.friction = 1.5;
  385.   boxSd.restitution = .4;
  386.   boxSd.extents.Set(40, 20);
  387.   boxSd.userData = document.getElementById('bus');
  388.   // Тодорхойлсон биетээ бодитжуулах
  389.   var boxBd = new b2BodyDef();
  390.   boxBd.AddShape(boxSd);
  391.   boxBd.position.Set(x,y);
  392.   var carBody = carGame.world.CreateBody(boxBd);
  393.   // дугуйг зурах (функц нь доор байгаа)
  394.   var wheelBody1 = createWheel(carGame.world, x-25, y+20);
  395.   var wheelBody2 = createWheel(carGame.world, x+25, y+20);
  396.  
  397.   // b2RevoluteJointDef функцийг тусдаа үүсгэгдсэн обьектуудыг "эргүүлэгтэй" холбоход ашиглана.
  398.   // бусад төрлийн холболтыг http://www.box2d.org/manual.html#_Toc258082974 ээс үзнэ үү
  399.   var jointDef = new b2RevoluteJointDef();
  400.   jointDef.anchorPoint.Set(x-25, y+20);
  401.   jointDef.body1 = carBody;
  402.   jointDef.body2 = wheelBody1;
  403.   carGame.world.CreateJoint(jointDef);
  404.   // Баруун дугуй
  405.   var jointDef = new b2RevoluteJointDef();
  406.   jointDef.anchorPoint.Set(x+25, y+20);
  407.   jointDef.body1 = carBody;
  408.   jointDef.body2 = wheelBody2;
  409.   carGame.world.CreateJoint(jointDef);
  410.   return carBody;
  411. }
  412.  
  413. function createWheel(world, x, y) {
  414.   // Дугуйны дүрсийг тодорхойолох
  415.   var ballSd = new b2CircleDef();
  416.   ballSd.density = 1.0;        // нягтшил
  417.   ballSd.radius = 10;          // радиус
  418.   ballSd.restitution = 0.1;    // ойлт
  419.   ballSd.friction = 4.3;       // үрэлт
  420.   ballSd.userData = document.getElementById('wheel');
  421.   // Дугуйг бодьтжуулах
  422.   var ballBd = new b2BodyDef();
  423.   ballBd.AddShape(ballSd);
  424.   ballBd.position.Set(x,y);
  425.   return world.CreateBody(ballBd);  
  426. }
  427.  
  428. // Дэлхийг үүсгэх буюу обьектуудыг канвас руу зурах
  429. function drawWorld(world, context) {
  430.   for (var b = world.m_bodyList; b != null; b = b.m_next) {
  431.     for (var s = b.GetShapeList(); s != null; s = s.GetNext()) {
  432.       if (s.GetUserData() != undefined) {
  433.         // UserData д зургийг хадгалсан
  434.         var img = s.GetUserData();
  435.         // зураг бүрийн өндөр өргөнийг тооцож обьектод наах
  436.         var x = s.GetPosition().x;
  437.         var y = s.GetPosition().y;
  438.         var topleftX = - $(img).width()/2;
  439.         var topleftY = - $(img).height()/2;
  440.         context.save();
  441.         context.translate(x,y);
  442.         context.rotate(s.GetBody().GetRotation());
  443.         context.drawImage(img, topleftX, topleftY);
  444.         context.restore();
  445.       } else {
  446.         drawShape(s, context);
  447.       }
  448.     }
  449.   }  
  450. }
  451. function drawShape(shape, context) {
  452.   context.strokeStyle = '#00aa00';
  453.   context.beginPath();
  454.   switch (shape.m_type) {
  455.     case b2Shape.e_circleShape:
  456.      
  457.       var circle = shape;
  458.       var pos = circle.m_position;
  459.       var r = circle.m_radius;
  460.       var segments = 16.0;
  461.       var theta = 0.0;
  462.       var dtheta = 2.0 * Math.PI / segments;
  463.       context.moveTo(pos.x + r, pos.y);
  464.       for (var i = 0; i < segments; i++) {
  465.         var d = new b2Vec2(r * Math.cos(theta),
  466.           r * Math.sin(theta));
  467.         var v = b2Math.AddVV(pos, d);
  468.         context.lineTo(v.x, v.y);
  469.         theta += dtheta;
  470.       }
  471.       context.lineTo(pos.x + r, pos.y);
  472.       context.moveTo(pos.x, pos.y);
  473.       var ax = circle.m_R.col1;
  474.       var pos2 = new b2Vec2(pos.x + r * ax.x, pos.y + r * ax.y);
  475.       context.lineTo(pos2.x, pos2.y);
  476.       break;
  477.     case b2Shape.e_polyShape:
  478.       var poly = shape;
  479.       var tV = b2Math.AddVV(poly.m_position,
  480.         b2Math.b2MulMV(poly.m_R, poly.m_vertices[0]));
  481.       context.moveTo(tV.x, tV.y);
  482.       for (var i = 0; i < poly.m_vertexCount; i++) {
  483.         var v = b2Math.AddVV(poly.m_position,
  484.           b2Math.b2MulMV(poly.m_R, poly.m_vertices[i]));
  485.         context.lineTo(v.x, v.y);
  486.       }
  487.       context.lineTo(tV.x, tV.y);
  488.       break;
  489.   }
  490.   context.stroke();
  491. }
  492.  
  493. // Үндсэн цагийн механизм.
  494. function step() {
  495.   carGame.world.Step(1.0/60, 1);
  496.   // Канвасаа цэвэрлэх. Уг нь бол сайн код бичие гэвэл канвасаа бүхлээр нь цэвэрлэх ёсгүй.
  497.   // Харин үйлдэл хийгдэж өөрчлөгдөж буй обьект болгоны хувьд канвасаа цоолж зөвхөн тухайн хэсгийн үзэгдэх байдлыг
  498.   // санах ойруу хуулж, түүнийгээ буцаан гаргах маягаар ажилладаг.
  499.   ctx.clearRect(0, 0, canvasWidth, canvasHeight);  
  500.   // Ертөнцөө шинээр зурах
  501.   drawWorld(carGame.world, ctx);
  502.   setTimeout(step, 10);            // 10 миллсекунд
  503.  
  504.   // Ялах нөхцөлийг шалгах
  505.   // box2d сан нь 2 биет обьектын огтлолцол буюу collide ийг автоматаар бүртгэж contact list рүү хийдэг
  506.   // уг лист рүү хандахдаа GetContactList(), заагчыг шилжүүлэхдээ GetNext()
  507.   for (var cn = carGame.world.GetContactList(); cn != null; cn = cn.GetNext()) {
  508.     var body1 = cn.GetShape1().GetBody();
  509.     var body2 = cn.GetShape2().GetBody();
  510.     if ((body1 == carGame.car && body2 == carGame.gamewinWall) ||(body2 == carGame.car && body1 == carGame.gamewinWall)) {
  511.       console.log("Баяр хүргэе!");
  512.       if (carGame.currentLevel < 4) {
  513.         restartGame(carGame.currentLevel+1);
  514.       } else {
  515.         // Дууссан дэлгэц үзүүлэх
  516.         $('#game').removeClass().addClass('gamebg_won');
  517.                
  518.         // Физик ертөнцийг дуусгах
  519.         carGame.world = createWorld();
  520.                
  521.       }
  522.     }
  523.   }
  524. }
  525.  
  526. // Товч даралтыг "чагнах" listener тавьж байна.
  527. $(document).keydown(function(e) {
  528.   switch(e.keyCode) {
  529.     case 88: // x товчны ASCII код
  530.       if (carGame.fuel > 0){
  531.         var force = new b2Vec2(10000000, 0);      // ApplyForce 2 параметр авдаг. Эхнийх нь хүч, 2 дахь нь чиглэл.
  532.         carGame.car.ApplyForce(force, carGame.car.GetCenterPosition());           // Баруун
  533.         carGame.fuel--;
  534.         $(".fuel-value").width(carGame.fuel/carGame.fuelMax * 100 +'%');
  535.       }
  536.       break;
  537.     case 90: // z товчны ASCII код
  538.       if (carGame.fuel > 0) {
  539.         var force = new b2Vec2(-10000000, 0);            // Зүүн
  540.         carGame.car.ApplyForce(force, carGame.car.GetCenterPosition());
  541.         carGame.fuel--;
  542.         $(".fuel-value").width(carGame.fuel/carGame.fuelMax * 100 +'%');                   
  543.       }
  544.       break;
  545.     case 82: // r товчны ASCII код
  546.       restartGame(carGame.currentLevel);
  547.       break;
  548.   }
  549. });
  550.  
  551. function restartGame(level) {  
  552.   // тухайн lvl ийн мэдээлэлийг хэвлэх
  553.   $("#level").html("Level " + (level+1));
  554.   carGame.currentLevel = level;
  555.   $('#game').removeClass().addClass('gamebg_level'+level);
  556.   // world обьектыг үүсгэж байна
  557.   carGame.world = createWorld();
  558.   // Үсэргэх тавцан зурах, Үүнийг шууд polygon зурж хийсэн бол хялбар байх байсан
  559.   // Гэхдээ 1т би өмнө нь зурж үзээгүй, 2т бэлэн үүсгэсэн shape ээ ашиглахын тулд тус тусад нь дөрвөлжинүүдээр үүсгэлээ.
  560.   for(var i=0;i<carGame.levels[level].length;i++) {
  561.     var obj = carGame.levels[level][i];
  562.        
  563.     if (obj.type == "car") {
  564.       carGame.car = createCarAt(obj.x,obj.y);
  565.       carGame.fuel = obj.fuel;
  566.       carGame.fuelMax = obj.fuel;
  567.       $(".fuel-value").width('100%');
  568.       continue;
  569.     }
  570.        
  571.     var groundBody = createGround(obj.x, obj.y, obj.width, obj.height, obj.rotation, obj.type);
  572.        
  573.     if (obj.type == "win") {
  574.       carGame.gamewinWall = groundBody;
  575.     }  
  576.   }
  577. }
Advertisement
Add Comment
Please, Sign In to add comment