首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

游戏开发中应用物理引擎box2d

2012-09-12 
游戏开发中使用物理引擎box2d本文基于JBox2d+canvas,后续提供NDK+openglEs版本;本文的主要目的是给大家介

游戏开发中使用物理引擎box2d

本文基于JBox2d+canvas,后续提供NDK+openglEs版本;

本文的主要目的是给大家介绍如何使用创建一个物理世界,本文为基本入门教程.

一、主函数:

主函数包括了Box2D的基本流程简单来说,一个Box2D程序的基本流程是由以下三个基本步骤构成的:

游戏开发中应用物理引擎box2d

01function step(){ 02??03????//计算多少秒之后的世界 04????var dt = 1/60; 05??06????//迭代次数,影响物体碰撞的计算精度,太高会导致速度过慢 07????var iterations = 10; 08??09????//计算dt秒之后世界中物体的位置 10????World.step(dt,iterations); 11??12????//绘制世界 13????drawWorld(); 14??15}五、绘制世界:一般情况下我们只利用box2d提供物理模拟,具体世界的绘制工作自己实现。具体绘制方式opengl,canvas,etc。01//绘制世界 02function drawWorld(){ 03??04????//绘制之前将上一帧的内容清除 05????context.clearRect(0, 0, canvasWidth, canvasHeight); 06????//遍历世界中的物体 07????for (var b = World.m_bodyList; b; b = b.m_next) { 08????????//遍历物体中的形状 09????????for (var s = b.GetShapeList(); s != null; s = s.GetNext()) 10????????{ 11????????????this.drawShape(s);? //绘制一个形状 12????????} 13????} 14??15} 16??17//绘制一个形状 18function drawShape(shape){ 19??20????context.strokeStyle = '#000';?????? //线形 21????context.beginPath(); 22????switch (shape.m_type) { 23????????case b2Shape.e_circleShape:{??? //如果是圆形,画圆 24????????????var circle = shape; 25????????????var r = circle.m_radius; 26????????????var pos = circle.m_position; 27????????????var pos2 = circle.m_R.col1.clone().scale(r).add(pos); 28????????????context.arc(pos.x, pos.y, r, 0, Math.PI * 2, false); 29????????????context.moveTo(pos.x, pos.y); 30????????????context.lineTo(pos2.x, pos2.y); 31????????????break; 32????????} 33????????case b2Shape.e_polyShape:{????? //如果是多边形,画多边形 34????????????var poly = shape; 35????????????var tV = b2Math.AddVV(poly.m_position, 36?????????????????b2Math.b2MulMV(poly.m_R, poly.m_vertices[0])); 37????????????context.moveTo(tV.x, tV.y); 38????????????for (var i = 0; i < poly.m_vertexCount; i++) { 39????????????????var v = b2Math.AddVV(poly.m_position, 40????????????????b2Math.b2MulMV(poly.m_R, poly.m_vertices[i])); 41????????????????context.lineTo(v.x, v.y); 42????????????} 43????????????context.lineTo(tV.x, tV.y); 44????????????break; 45????????} 46????} 47????context.stroke();?? //绘制 48??49}

热点排行