thisizmonster

carGame game.js

Sep 15th, 2011
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var carGame = {};
  2. var car;
  3. var canvas;             // үндсэн канвас
  4. var ctx;                // canvas ийн 2d хэлбэрийг хадгална
  5. var canvasWidth;        // канвасын өргөн
  6. var canvasHeight;       // канвасын өндөр
  7. $(function() {
  8.   carGame.world = createWorld();             // world обьектыг үүсгэж байна
  9.   createGround();                            // газрыг үүсгэх
  10.   createObstacle();
  11.   carGame.car = createCarAt(50, 210);
  12.  
  13.  
  14.  
  15.   console.log("The world is created. ", carGame.world);   // Консол руу бичиж байна
  16.   canvas = document.getElementById('game');       // канвасыг id гаар нь дамжуулж авах
  17.   ctx = canvas.getContext('2d');                  // канвасын 2d хэлбэрийг авах
  18.   canvasWidth = parseInt(canvas.width);
  19.   canvasHeight = parseInt(canvas.height);
  20.   drawWorld(carGame.world, ctx);                  // дэлхийг үүсгэх
  21.   step();                       // цагийг ажиллуулах
  22. });
  23. function createObstacle() {
  24.   var boxSd = new b2BoxDef();
  25.   boxSd.density = 1.0;
  26.   boxSd.friction = 1.5;
  27.   boxSd.restitution = .4;
  28.   boxSd.extents.Set(80, 150);
  29.   // Тодорхойлсон биетээ бодитжуулах
  30.   var boxBd = new b2BodyDef();
  31.   boxBd.AddShape(boxSd);
  32.   boxBd.position.Set(400, 150);
  33.   carGame.world.CreateBody(boxBd);
  34. }
  35. function createWorld() {
  36.   var worldAABB = new b2AABB();         // b2AABB функц нь хоосон орон зайг тодорхойлж өгдөг.
  37.   worldAABB.minVertex.Set(-4000, -4000);    // зүүн дээрх өнцөг буюу left, top утга
  38.   worldAABB.maxVertex.Set(4000, 4000);      // баруун доорх өнцөг буюу right, bottom утга. Ингэснээр 8000x8000 хэмжээтэй талбай үүслээ
  39.  
  40.   // b2Vec2 функцаар тухайн обьектын татах хүчийг тодорхойлж өгдөг.
  41.   // Авах параметр нь 1x2 хэмжээс бүхий матрикс хэлбэртэй байдаг. Эгц доош нь 300 гийн таталт өгч байна.
  42.   var gravity = new b2Vec2(0, 300);
  43.  
  44.   // Физик обьект хэт их оруулах нь тоглоомын FPS д сөргөөр нөлөөлдэг. Хэдий чинээ ихийг оруулна төдий чинээ
  45.   // давталт, шалгалтууд gameloops д явагддаг. Үүнээс сэргийлэхийн тулд зарим обьектыг "унтуулах" буюу хөдөлгөөнгүй
  46.   // бэхэлж, түүнийгээ жагсаалтаас гаргадаг.
  47.   var doSleep = false;
  48.  
  49.   // b2World функцаар обьектыг үүсгэнэ. Үүнд хэмжээс, таталцал, унтаа эсэхийг оруулдаг.
  50.   var world = new b2World(worldAABB, gravity, doSleep);
  51.  
  52.   // обьектыг буцааж байна. 8р мөрийг харна уу.
  53.   return world;
  54. }
  55.  
  56. // Газрын гадаргуу үүсгэх. Уг гадаргыг үүсгэхгүй бол мэдээж бүх зүйлс browser аас тань халин доош унана.
  57. function createGround() {
  58.   // гадаргуугийн хэлбэрийг тодорхойлж байна.
  59.   var groundSd = new b2BoxDef();
  60.   groundSd.extents.Set(250, 25);
  61.   groundSd.restitution = 0.4;
  62.   // дээр тодорхойлсон хэлбэрээр гадаргууг үүсгэж байна. (Классаас Обьект үүсгэхтэй адил)
  63.   var groundBd = new b2BodyDef();
  64.   groundBd.AddShape(groundSd);       // хэлбэрээ өгөх
  65.   groundBd.position.Set(250, 370);   // байрлуулах координат
  66.   var body = carGame.world.CreateBody(groundBd);      // обьектыг дэлхийдээ хавсаргах
  67.  
  68.   return body;
  69. }
  70.  
  71. // Машиныг зурах
  72. function createCarAt(x, y) {
  73.   // Машины дөрвөлжин биетийг тодорхойлох
  74.   var boxSd = new b2BoxDef();
  75.   boxSd.density = 1.0;
  76.   boxSd.friction = 1.5;
  77.   boxSd.restitution = .4;
  78.   boxSd.extents.Set(40, 20);
  79.   // Тодорхойлсон биетээ бодитжуулах
  80.   var boxBd = new b2BodyDef();
  81.   boxBd.AddShape(boxSd);
  82.   boxBd.position.Set(x,y);
  83.   var carBody = carGame.world.CreateBody(boxBd);
  84.   // дугуйг зурах (функц нь доор байгаа)
  85.   var wheelBody1 = createWheel(carGame.world, x-25, y+20);
  86.   var wheelBody2 = createWheel(carGame.world, x+25, y+20);
  87.  
  88.   // b2RevoluteJointDef функцийг тусдаа үүсгэгдсэн обьектуудыг "эргүүлэгтэй" холбоход ашиглана.
  89.   // бусад төрлийн холболтыг http://www.box2d.org/manual.html#_Toc258082974 ээс үзнэ үү
  90.   var jointDef = new b2RevoluteJointDef();
  91.   jointDef.anchorPoint.Set(x-25, y+20);
  92.   jointDef.body1 = carBody;
  93.   jointDef.body2 = wheelBody1;
  94.   carGame.world.CreateJoint(jointDef);
  95.   // Баруун дугуй
  96.   var jointDef = new b2RevoluteJointDef();
  97.   jointDef.anchorPoint.Set(x+25, y+20);
  98.   jointDef.body1 = carBody;
  99.   jointDef.body2 = wheelBody2;
  100.   carGame.world.CreateJoint(jointDef);
  101.   return carBody;
  102. }
  103.  
  104. function createWheel(world, x, y) {
  105.   // Дугуйны дүрсийг тодорхойолох
  106.   var ballSd = new b2CircleDef();
  107.   ballSd.density = 1.0;        // нягтшил
  108.   ballSd.radius = 10;          // радиус
  109.   ballSd.restitution = 0.1;    // ойлт
  110.   ballSd.friction = 4.3;       // үрэлт
  111.   // Дугуйг бодьтжуулах
  112.   var ballBd = new b2BodyDef();
  113.   ballBd.AddShape(ballSd);
  114.   ballBd.position.Set(x,y);
  115.   return world.CreateBody(ballBd);  
  116. }
  117.  
  118. // Дэлхийг үүсгэх буюу обьектуудыг канвас руу зурах
  119. function drawWorld(world, context) {
  120.   for (var b = world.m_bodyList; b != null; b = b.m_next) {
  121.     for (var s = b.GetShapeList(); s != null; s = s.GetNext()) {
  122.       drawShape(s, context);
  123.     }
  124.   }
  125.  
  126. }
  127. function drawShape(shape, context) {
  128.   context.strokeStyle = '#003300';
  129.   context.beginPath();
  130.   switch (shape.m_type) {
  131.     case b2Shape.e_circleShape:
  132.      
  133.       var circle = shape;
  134.       var pos = circle.m_position;
  135.       var r = circle.m_radius;
  136.       var segments = 16.0;
  137.       var theta = 0.0;
  138.       var dtheta = 2.0 * Math.PI / segments;
  139.       context.moveTo(pos.x + r, pos.y);
  140.       for (var i = 0; i < segments; i++) {
  141.         var d = new b2Vec2(r * Math.cos(theta),
  142.           r * Math.sin(theta));
  143.         var v = b2Math.AddVV(pos, d);
  144.         context.lineTo(v.x, v.y);
  145.         theta += dtheta;
  146.       }
  147.       context.lineTo(pos.x + r, pos.y);
  148.       context.moveTo(pos.x, pos.y);
  149.       var ax = circle.m_R.col1;
  150.       var pos2 = new b2Vec2(pos.x + r * ax.x, pos.y + r * ax.y);
  151.       context.lineTo(pos2.x, pos2.y);
  152.       break;
  153.     case b2Shape.e_polyShape:
  154.       var poly = shape;
  155.       var tV = b2Math.AddVV(poly.m_position,
  156.         b2Math.b2MulMV(poly.m_R, poly.m_vertices[0]));
  157.       context.moveTo(tV.x, tV.y);
  158.       for (var i = 0; i < poly.m_vertexCount; i++) {
  159.         var v = b2Math.AddVV(poly.m_position,
  160.           b2Math.b2MulMV(poly.m_R, poly.m_vertices[i]));
  161.         context.lineTo(v.x, v.y);
  162.       }
  163.       context.lineTo(tV.x, tV.y);
  164.       break;
  165.   }
  166.   context.stroke();
  167. }
  168.  
  169. // Үндсэн цагийн механизм.
  170. function step() {
  171.   carGame.world.Step(1.0/60, 1);
  172.   // Канвасаа цэвэрлэх. Уг нь бол сайн код бичие гэвэл канвасаа бүхлээр нь цэвэрлэх ёсгүй.
  173.   // Харин үйлдэл хийгдэж өөрчлөгдөж буй обьект болгоны хувьд канвасаа цоолж зөвхөн тухайн хэсгийн үзэгдэх байдлыг
  174.   // санах ойруу хуулж, түүнийгээ буцаан гаргах маягаар ажилладаг.
  175.   ctx.clearRect(0, 0, canvasWidth, canvasHeight);  
  176.   // Ертөнцөө шинээр зурах
  177.   drawWorld(carGame.world, ctx);
  178.   setTimeout(step, 10);            // 10 миллсекунд
  179. }
  180.  
  181. // Товч даралтыг "чагнах" listener тавьж байна.
  182. $(document).keydown(function(e) {
  183.   switch(e.keyCode) {
  184.     case 88: // X товчны ASCII од
  185.       var force = new b2Vec2(10000000, 0);           // Баруун
  186.       carGame.car.ApplyForce                         // ApplyForce 2 параметр авдаг. Эхнийх нь хүч, 2 дахь нь чиглэл.
  187.       (force, carGame.car.GetCenterPosition());
  188.       break;
  189.     case 90: // z товчны ASCII од
  190.       var force = new b2Vec2(-10000000, 0);          // Зүүн
  191.       carGame.car.ApplyForce
  192.       (force, carGame.car.GetCenterPosition());
  193.       break;
  194.   }
  195. });
Advertisement
Add Comment
Please, Sign In to add comment