box2dweb基础
简介
大名鼎鼎的物理引擎box2d基本上大家都听说过,网上有两个javascript版本的box2d库,一个时box2djs,已经停止维护,一个是box2dweb。下面就来介绍一下box2dweb的基本信息。
一 包,类介绍
BOX2D.Collision>>>碰撞,冲击包;
b2AABB AABB坐标
b2OBB OBB坐标
b2ContactID 接触ID
b2ContactPoint 接触点
b2ManifoldPoint 繁殖点 BOX2D.Collision.Shapes>>>碰撞形状形变包;
b2CircleShape 圆外形.
b2EdgeChainDef边缘图形.
b2MassData 质量运算器.
b2PolygonShape 凸多边形.
b2Shape 图形基类. BOX2D.Common >>>通用包;
b2Color 调试绘图颜色.
b2Settings 全局设置 BOX2D.Common.Math>>>通用数学包;
b2Mat22 2*2 矩阵
b2Mat33 3*3 矩阵
b2Sweep 碰撞描述.
b2Vec2 向量(x ,y).
b2Vec3 向量(x, y z).
b2XForm 坐标转换,平移或旋转
BOX2D.Dynamics>>>动态包;
b2Body 刚体或叫物体.
b2BodyDef 刚体定义.
b2ContactFilter 继承这个类用来获取过滤碰撞
b2ContactListener 继承这个类用来获取碰撞结果,根据这个判断游戏逻辑或声音处理. 你也可以获取碰撞在时间步后,时间步会有一个碰撞列表.然而你也有可能漏掉一些碰撞,因为在一个时间步内有多个子步.你应该尽量提高碰撞回调方法的效率,因为在每个时间步内有诸多回调.
b2FilterData 碰撞过滤数据
b2DebugDraw 调试绘图,用于调试.
b2DestructionListener 关节或外形销毁时处理方法
b2FixtureDef 材质定义类
b2Fixture材质类
b2World 物理世界 Box2D.Dynamics.Contacts>>>碰撞管理包
b2Contact 管理两个外形接触.
b2ContactEdge 接触边用来连接多个物体和接触到一个接触表(物体是一个节点而接触相当于一个接触边)
b2ContactResult 记录接触结果 BOX2D.Dynamics.Joints>>>动态关节包;
b2DistanceJoint 距离连接
b2DistanceJointDef 距离连接定义.
b2GearJoint 齿轮连接.
b2GearJointDef 齿轮连接定义.
b2Joint 连接基类.
b2JointDef 连接定义基类.
b2JointEdge 用于组合刚体或连接到一起.刚体相当于节点,而连接相当于边
b2MouseJoint 鼠标连接.
b2MouseJointDef 鼠标连接定义.
b2PrismaticJoint 移动连接.
b2PrismaticJointDef 移动连接定义.
b2PulleyJoint 滑轮连接.
b2PulleyJointDef 滑轮连接定义.
b2RevoluteJoint 旋转连接.
b2RevoluteJointDef 旋转连接定义.
二 创建世界
var world = new b2World( gravity, doSleep);
上面这段代码就创建了一个box2d的世界(Box2D.Dynamics.b2World),所有的box2d中的物体都依托于这个世界存在。下面详细介绍:
gravity 定义了世界的重力 也是一个2d向量(Box2D.Common.Math.b2Vec2(x,y)),其中x是水平方向重力,正为右,负为左;y是垂直方向重力,正为下,负为上。
var gravity=new b2Vec2(0,300);
doSleep 一个布尔值变量,设定了当物体停止移动时是否允许物体休眠。一个休眠中的物体不需要任何模拟。
常用的方法:
CreateBody(b2BodyDef);//*所有世界中的物体都必须由本方法创建
DestoryBody(b2Body);
ClearForces();
GetBodyList();
GetBodyCount();
GetJointCount();
GetJointList();
IsLocked();
SetDebugDraw(b2DebugDraw);
Step(dt, velocityIterations, positionIterations);
上面我们就创建了一个box2d的世界。下面让我们来看如何向这个世界中添加物体。
三 创建物体、刚体
1 首先要创建一个物体定义
var bodydef=new b2BodyDef();
// 物体类型定义,基本上常用的有两种定义:b2_staticBody 静态物体; .b2_dynimacBod动态物体
bodydef.type= b2Body.b2_staticBody;
//定义物体位置。也可以这样 bodydef.position.x=10; bodydef.position.y=10;
bodydef.position.Set(x,y);
//定义用户自己的数据
bodydef.userData=*;
2 其次要定义一个材质定义
var fixDef = new b2FixtureDef();
fixDef.density = 1.0; // desity 密度,如果密度为0或者null,该物体则为一个静止对象
fixDef.friction = 0.5; //摩擦力(0~1)
fixDef.restitution = 0.2;// 弹性(0~1)
3 为材质定义添加一个形状
b2PolygonShape多边形;b2CircleSharp圆形设置该材质形状的大小;b2PolygonShape对应着SetAsBox(halfWidth,halfHeight)方法设置半长半宽,值//得注意的是Box2d中的单位//是米,一米是30像素,如果自定义多边形可以使用一个SetAsArray(vertexArray,vertexCount),其中vertexArray为顶点矢量(b2Vec2)数组,vertexCount为顶点数,最多8个。b2CircleSharp对应的设置属性为SetRadius(radius);
fixDef.sharp=new b2PolygonShape();
fixDef.sharp.SetAsBox(100/30,20/30);
fixDef.sharp=new b2CircleShape(60/30);
fixDef.sharp=new b2CircleShape();
fixDef.sharp.SetRadius(100/30);
fixDef.shape.SetAsArray([new b2Vec2(0,0),
new b2Vec2(2,0),
new b2Vec2(3,1.5),
new b2Vec2(2,3),
new b2Vec2(0,3),
new b2Vec2(-1,1.5)],6);
4 根据物体定义,材质定义创建物体
var body=world.CreateBody(bodydef);
body.CreateFixture(fixDef);
其他一些属性
body.ApplyForce(force, point); //添加一个外力,force一个b2Vec2的向量代表外力,point一个b2Vec2的向量代表物体的着力点。
body.SetMassFromShapes();//根据形状计算质量
四 调试
实现一个基于html5的canvas对象的2d上下文的调试实例,并利用SetDebugDraw方法将其赋予一个世界。
var debugDraw = new b2DebugDraw();
debugDraw.SetSprite(document.getElementById("canvas").getContext("2d"));
debugDraw.SetDrawScale(30.0);
debugDraw.SetFillAlpha(0.3);
debugDraw.SetLineThickness(1.0);
debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);
world.SetDebugDraw(debugDraw);
五 世界更新
一切都准备好了,我们要让所有对象模拟运动。其实他也是通过侦听帧频率而不断刷新实现的,把上面那两个参数传入世界对象的Step方法中即可,
同时我们需要遍历世界中的一切对象,并对每个对象的坐标和角度进行更新。
function update() {
world.Step(
1/60//帧率
,10//速率
, 10//position iterations
);
world.DrawDebugData();//绘制调试数据
world.ClearForces();//绘制完毕后清除外力
}; //循环更新和绘制世界
setInteval(update,1000 / 60);
box2dweb基础的更多相关文章
- box2dweb之关节joint(连接器)
1 概述 前篇基础文章看完后基本上就应该对box2dweb能上手了,下面来介绍一下box2dweb非常重要的一个概念,关节(joint)也有叫连接器的,总之是一个意思.下面是关节详细的类库说明: BO ...
- box2dweb 学习笔记--sample讲解
前言: 之前博文"台球游戏的核心算法和AI(1)" 中, 提到过想用HTML5+Box2d来编写实现一个台球游戏. 以此来对比感慨一下游戏物理引擎的巨大威力. 做为H5+box2d ...
- html5游戏开发-零基础开发《圣诞老人送礼物》小游戏
开言: 以前lufy前辈写过叫“ HTML5游戏开发-零基础开发RPG游戏”的系列文章,在那里面我学习了他的引擎以及了解了游戏脚本.自从看了那几篇文章,我便对游戏开发有了基本的认识.今天我也以零基础为 ...
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- node-webkit 环境搭建与基础demo
首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Golang, 以17个简短代码片段,切底弄懂 channel 基础
(原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- HTTPS 互联网世界的安全基础
近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...
随机推荐
- 用Editplus开发HTML
准备工作 设置Editplus默认的打开浏览器为系统默认浏览器 取消Editplus的临时缓存文件 ☆ 设置不生成临时文件 这里的临时文件,指的是.bak文件,当你在Editplus下修改任意一个文件 ...
- 清橙 A1206 小Z的袜子(莫队算法)
A1206. 小Z的袜子 时间限制:1.0s 内存限制:512.0MB 总提交次数:1357 AC次数:406 平均分:46.75 将本题分享到: 查看未格式化的试题 ...
- 【转】SVN环境搭建教程
http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html http://www.cnblogs.com/xiaobaihom ...
- DS实验题 Dijkstra算法
参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...
- Redis 笔记与总结4 set 和 zset 类型
(一)set 类型 set 是集合是 string 类型的无序集合. set 元素最大可以包含(2 的 32 次方)个元素.set 的是通过 hash table 实现的,所以添加.删除和查找的复杂度 ...
- json+mvc
返回JsonResult序列化的Json对象 public class MyController : Controller { // 必须返回ActionResult类型 public ...
- mysql数据库‘复制’的办法
mysql数据库‘复制’的办法 2006-01-17 10:36:00 标签:Mysql SQL 数据库 休闲 职场 >mysqldump wap -u root -ppassword --ad ...
- BS架构与CS架构的区别(最全)
C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势. ...
- 面向对象之abstract
1.abstract class,抽象类不能被实例化,只能被继承:抽象类中可以包含非抽象方法 2.abstract method();抽象方法只能在抽象类中进行声明,并且没有方法体,非抽象继承子类中必 ...
- 冒泡排序与插入排序(C#实现)
本人应届生面试,发现被问了2次关于排序的算法.当时竟然没写出来!!!好吧,可能是用库函数多了,很久没搞算法了,在纸上写没感觉吧. 今天花了1个多小时写了下冒泡排序与插入排序(C#实现),并写了注释和小 ...