文档章节

Box2D新手入门

童年伊梦
 童年伊梦
发布于 2012/09/25 12:49
字数 1002
阅读 227
收藏 0

by Emanuele Feronato 译:童年

入门篇范例效果:

https://dl-web.dropbox.com/get/%E5%85%A5%E9%97%A8.swf?w=ea1c91c1

网速慢打不开的话走这里--下载链接:

https://www.dropbox.com/s/t2le0d4mjyqi74m/%E5%85%A5%E9%97%A8.swf

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import Box2D.Dynamics.*;
    import Box2D.Collision.*;
    import Box2D.Collision.Shapes.*;
    import Box2D.Common.Math.*;
    public class Main extends Sprite {
        public var world:b2World=new b2World(new b2Vec2(0,10.0),true);
        public var worldScale:int=30;
        public function Main():void {
            debugDraw();
            draw_box(250,300,500,100,false);
            draw_box(250,100,100,100,true);
            draw_circle(100,100,50,false);
            draw_circle(400,100,50,true);
            addEventListener(Event.ENTER_FRAME, update);
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                     
        public function draw_circle(px:Number, py:Number, r:Number, d:Boolean):void {
            var my_body:b2BodyDef= new b2BodyDef();
            my_body.position.Set(px/worldScale, py/worldScale);
            if (d) {
                my_body.type=b2Body.b2_dynamicBody;
            }
            var my_circle:b2CircleShape=new b2CircleShape(r/worldScale);
            var my_fixture:b2FixtureDef = new b2FixtureDef();
            my_fixture.shape=my_circle;
            var world_body:b2Body=world.CreateBody(my_body);
            world_body.CreateFixture(my_fixture);
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                     
        public function draw_box(px:Number,py:Number,w:Number,h:Number,d:Boolean):void {
            var my_body:b2BodyDef= new b2BodyDef();
            my_body.position.Set(px/worldScale, py/worldScale);
            if (d) {
                my_body.type=b2Body.b2_dynamicBody;
            }
            var my_box:b2PolygonShape = new b2PolygonShape();
            my_box.SetAsBox(w/2/worldScale, h/2/worldScale);
            var my_fixture:b2FixtureDef = new b2FixtureDef();
            my_fixture.shape=my_box;
            var world_body:b2Body=world.CreateBody(my_body);
            world_body.CreateFixture(my_fixture);
        }
        //debugDraw调试视图
        public function debugDraw():void {
            var debugDraw:b2DebugDraw = new b2DebugDraw();
            var debugSprite:Sprite = new Sprite();
            addChild(debugSprite);
            debugDraw.SetSprite(debugSprite);
            debugDraw.SetDrawScale(worldScale);
            debugDraw.SetFlags(b2DebugDraw.e_shapeBit);
            world.SetDebugDraw(debugDraw);
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                     
        public function update(e : Event):void {
            world.Step(1/30,10,10);
            world.ClearForces();
            world.DrawDebugData();
        }
    }
}

源码下载地址:http://115.com/file/dpjjkwfz#入门篇.rar

Box2D中有一些基本的对象,这里我们先做一个简要的定义,在随后的文档里会有更详细的描述。

  • 刚体(rigid body)

一块十分坚硬的物质,它上面的任何两点之间的距离都是完全不变的。它们就像钻石那样坚硬。在后面的讨论中,我们用物体(body)来代替刚体。

  • 形状(shape)

一块严格依附于物体(body)的 2D 碰撞几何结构(collision geometry)。形状具有摩擦(friction)和恢复(restitution)的材料性质。

  • 约束(constraint)

一个约束(constraint)就是消除物体自由度的物理连接。在 2D 中,一个物体有 3 个自由度。如果我们把一个物体钉在墙上(像摆锤那样),那我们就把它约束到了墙上。这样,此物体就只能绕着这个钉子旋转,所以这个约束消除了它 2 个自由度。

  • 接触约束(contact constraint)

一个防止刚体穿透,以及用于模拟摩擦(friction)和恢复(restitution)的特殊约束。你永远都不必创建一个接触约束,它们会自动被 Box2D 创建。

  • 关节(joint)

它是一种用于把两个或多个物体固定到一起的约束。Box2D 支持的关节类型有:旋转,棱柱,距离等等。关节可以支持限制(limits)和马达(motors)。

  • 关节限制(joint limit)

一个关节限制(joint limit)限定了一个关节的运动范围。例如人类的胳膊肘只能做某一范围角度的运动。

  • 关节马达(joint motor)

一个关节马达能依照关节的自由度来驱动所连接的物体。例如,你可以使用一个马达来驱动一个肘的旋转。

  • 世界(world)

一个物理世界就是物体,形状和约束相互作用的集合。Box2D 支持创建多个世界,但这通常是不必要的。

■■■■■■■■■创建一个世界■■■■■■■■■

var gravity:b2Vec2 = new b2Vec2(0,10);
var doSleep:Boolean = true;
var world:b2World = new b2World(gravity,doSleep);

在以前的版本中,需要我们创建一个包围盒,不过在最新的版本中,已经不再需要。默认有一个足够大的包围盒了。

■■■■■■■■■创建一个地面盒/动态物体■■■■■■■■■

1.定义一个物体(包含位置、类型等信息)

var boxBodyDef:b2BodyDef= new b2BodyDef();
boxBodyDef.position.Set(100/worldScale, 100/worldScale);
//boxBodyDef.type = b2Body.b2_dynamicBody;
//boxBodyDef.type = b2Body.b2_kinematicBody;
boxBodyDef.type = b2Body.b2_staticBody;

 2.使用世界对象创建物体

var boxBody:b2Body = world.CreatBody(boxBodyDef);

3.定义形状

var boxShape:b2PolygonShape = new b2PolygonShape();
//设置长宽,注意参数是长、宽的一半
boxShape.SetAsBox(width/2/worldScale, height/2/worldScale);

4.定义fixture

var boxFixtureDef:b2FixtureDef = new b2FixtureDef();
boxFixtureDef.density = 1;  //密度
boxFixtureDef.friction = 0.8;  //摩擦力
boxFixtureDef.restitution = 0.2; //恢复力(弹性)
//·····
boxFixtureDef.shape = boxShape;

5.使用刚体对象创建fixture

var boxFixture:b2Fixture = boxBody.CreatFixture(boxFixtureDef);

■■■■■■■■■模拟Box2D世界■■■■■■■■■

world.Step(dt,velocityIterations,positionIterations);
//dt:时间步 一般1/60-1/30,一般取1/30
//velocityIterations:速度约束求解器,一般为10
//positionIterations:位置约束求解器,一般为10

© 著作权归作者所有

童年伊梦
粉丝 1
博文 29
码字总数 21736
作品 0
浦东
私信 提问
Visual Studio 2012下Box2D开发环境设置

Cocos2d-x 3.x默认情况下采用的物理引擎是Chipmunk,如果我们要使用Box2D引擎,需要进行一些设置和调整,而且不同的开发平台下这些设置也有所不同。由于本书在此之前介绍的都是基于微软的Vis...

智捷课堂
2014/10/07
0
0
【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法

上一节讲述了粒子的相关问题,当然啦,不示弱,今天继续将物理系统给大家进行简单的介绍和讲述; 首先先介绍,如何在cocos2d中加入box2d开发lib包,因为一般使用cocos2d引擎进行开发游戏时,...

junwong
2012/03/02
1K
0
Gamvas Web 0.8.4 发布,JavaScript 游戏引擎

Gamvas Web 0.8.4 修复了很多 bug,同时引入对 Box2D 物理引擎支持的,增加新的游戏演示,展示如何通过用户的输入来控制物理对象。 Gamvas Web 是一个 JavaScript 游戏开发框架,上手快速,文...

oschina
2012/11/13
1K
1
使用Doxygen来生成Box2d的API文档

对于Doxygen以前只听别人说过,而现在使用它也是一个偶然,缘分吧。前两天看box2d的官方sdk中,发现他有用户手册却没有说明,只是留下了一个Doxygen的文件。事情告一段落,然后今天在看box2d...

阳666
2015/11/21
0
0
Box2d系列 – 如何在cocos2d-x中激活 debug draw(转)

本文的读者要求是, 熟悉cocos2d-x流程, 熟悉box2d的基本代码。 很久没写cocos2dx的东西了,最近比赛接近,做题太郁闷就练习下使用box2d,好歹也发时间看完了官方文档的。。 本来很想发时间...

睡到自然醒
2012/05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

搭建tftp服务

前言: 最近整理一些以前的学习笔记。 过去都是存储在本地,此次传到网络留待备用。 TFTP服务: TFTP:Trivial File Transfer Protocol 不重要文件传输协议 主要用来传送小文件,不支持认证和...

迷失De挣扎
今天
4
0
rest 的理解

rest:表现层状态转移。 什么是restful协议?https://en.wikipedia.org/wiki/Representational_state_transfer 使用restful的好处。 Rest是一种体系结构样式,他定义了一组用于创建web服务的...

xiaoxiao_go
今天
5
0
聊聊spring cloud的CachingSpringLoadBalancerFactory

序 本文主要研究一下spring cloud的CachingSpringLoadBalancerFactory CachingSpringLoadBalancerFactory spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/o......

go4it
昨天
4
0
一篇文章搞定——JDK8中新增的StampedLock

一、StampedLock类简介 StampedLock类,在JDK1.8时引入,是对读写锁ReentrantReadWriteLock的增强,该类提供了一些功能,优化了读锁、写锁的访问,同时使读写锁之间可以互相转换,更细粒度控...

须臾之余
昨天
5
0
Android Camera原理之CameraDeviceCallbacks回调模块

在讲解《Android Camera原理之openCamera模块(二)》一文的时候提到了CameraDeviceCallbacks回调,当时没有详细展开,本文我们详细展开讲解一下。 CameraDeviceCallbacks生成过程: 《Android...

天王盖地虎626
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部