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 学习笔记--sample讲解
前言: 之前博文"台球游戏的核心算法和AI(1)" 中, 提到过想用HTML5+Box2d来编写实现一个台球游戏. 以此来对比感慨一下游戏物理引擎的巨大威力. 做为H5+box2d ...
- html5游戏开发-零基础开发《圣诞老人送礼物》小游戏
开言: 以前lufy前辈写过叫"html5游戏开发-零基础开发RPG游戏"的系列文章,在那里面我学习了他的引擎以及了解了游戏脚本.自从看了那几篇文章,我便对游戏开发有了基本的认识. ...
- java入门 慕路径,Java入门基础知识总结学习教程大全【必看经典】
类型的表达式,是循环条件,表达式3是党执行了一遍循环之后,修改控制循环的变量值. ??? for语句的执行过程是这样的:首先计算表达式1,完成必要的初始化工作:然后判断表达式2的值,如果表达式的值为t ...
- 提交表单自动刷新_Web自动化测试:元素的基础操作和浏览器基础操作
上一节,我们了解了如何定位元素,其实也有涉及对于元素的操作,这一节我们就详细的介绍一下对于元素的操作和对于浏览器的一些操作 一.对于元素的基础操作: clear():清除输入框内的文本 send_ke ...
- java mybatis基础
java mybatis基础 1.1 什么是mybatis? mybatis是一个优秀的持久层框架. 避免几乎所有的JDBC代码和手动设置参数以及获取结果集的过程. 可以使用简单的xml或者注解来配置 ...
- 【J2SE】学习基础
Java基础 语法基础 OO Exception Array 基础类 I/O Stream Collection/Generic Thread TCP/UDP GUI Meta Data Regula ...
- 【Linux系统】基础总结
我不太清楚运维部门具体是做什么的,就接触过一点点运维部门! 也就是是知道他们负责管理服务器,管理网络,管理项目部署 偶尔自己需要部署,不得不接触一些linux命令.简单总结一些基础 linux系统发展 ...
- 【Java 2 Platform Enterprise Edition】基础
问题1:为什么java是无关平台? 你之前用C或者C++写的源代码,编译好后,换一种操作系统,可能就执行不了了.因为新的操作系统不识别,你需要修改你的源码,并在新的操作系统上重新编译才能运行,比如Wi ...
- SpringCloud Alibaba微服务实战(一) - 基础环境搭建
说在前面 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来 ...
- Redis概述和基础
Redis 1.NoSQL NoSQL = Not Only SQL(不仅仅是SQL) 泛指非关系型数据库的,随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其是超大规模的 ...
最新文章
- MAVEN项目对象模型,原来找Bug也不用如此费时费事。
- Linux常用的50个命令
- spring-session用mysql实现session共享实践
- 【数据结构-排序】5.九种排序设计分析
- pool python 传参数_Python-爬虫-多线程、线程池模拟(urllib、requests、UserAgent、超时等)...
- [Swagger2]拓展:其他皮肤
- linux安装日志切割程序
- linux解压eclipse启动时无法找到jre环境的解决办法
- 蓝桥杯---简单的计算器
- 【QT源码】系列01
- 基于HTTP的QQ协议(转)
- 一步一步学会JDBC
- 英文数字字母听力模拟的简单实现
- 【眼底图像数据集】视杯 视盘分割
- leetcode之随心刷
- 亲测有效!解决文件名过长无法删除的情况
- 用P、V操作解决进程同步问题的解题步骤
- Java基于ssm的超市多商家系自提系统
- 跳出多层for循环的几种方式
- 高斯-克吕格投影与UTM投影
热门文章
- jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别
- leetcode - Anagrams
- 前端调用接口报错看不到报错响应时 console.dir
- spring-eureka 源码解读----为什么一个服务最多两分钟被其他服务感知
- 【iOS】获取应用程序本地路径
- 自己的 并查集 模板
- IE Developer ToolBar,这是IE用于调试页面的小工具
- 《2008胡润百富榜》前三名
- linux部署java命令
- linux基础命令---bzip2