物理引擎

物理引擎:

motor2 基于Box2d的AS3(Player 10)刚体引擎

作者主页:http://lab.polygonal.de/motor_physics/

APE  最简单

http://www.cove.org/ape/

FOAM - 2D Rigid Body Physics Engine

http://code.google.com/p/foam-as3

glaze - 2D Rigid Body Dynamics & Game Engine for Actionsctipt 3

http://code.google.com/p/glaze/

Fisix Engine  收费的

http://www.fisixengine.com/default.asp

PopShapes

http://lab.andre-michelle.com/physics-engine/

Box2d 复杂,无api

http://box2dflash.sourceforge.net/        c++版

http://sourceforge.net/projects/box2d/    as版

http://wiki.slembcke.net/main/published/Chipmunk  基于box2d的c版,比box2d性能高

基于Box2d的游戏:

魔笔,只能在线玩(as)

http://www.miniclip.com/games/magic-pen/cn/magicpen.swf

怪物卡车,可下载玩,且有3d版的(as)

http://www.miniclip.com/games/monster-trucks-nitro/cn/

蜡笔物理学 (c++)

http://www.crayonphysics.com/

下载地址:http://www.kloonigames.com/blog/games/crayon

作者:http://www.kloonigames.com/blog/

       box2d的碰撞检测采用AABB(axially aligned bounding box)(Box2D.Collision.b2AABB类)这种最简单的方式,采用一个描述用的立方体或者球形体包裹住物体对象的整体(或者是主要部 分),之后根据包装盒的距离、位置等信息来计算是否发生碰撞.

      2D游戏中有许多图片都是方方正正的,所以我们不必把碰撞的范围画成一个圆的,而是画成一个方的。这个正方形,或者说是一个四边形和坐标轴是对齐的,所以运用数学上的一些方法,比如距离计算等还是比较方便的。这个检测方法就叫AABB碰撞检测,

       游戏中已经运用的非常广泛了,因为其速度快,效率高,计算起来非常方便,精确度也是可以忍受的。  做到这一步,许多游戏的需求都已经满足了。但是,总是 有人希望近一步优化,而且方法也是非常陈旧的:继续对物体的各个部分进行细分,对每个部件做AABB的矩形,那这个优化以后的系统就叫做OBB系统 (Box2D.Collision.b2OBB类)。

使用流程: 1.创建world

2.定义刚体,定义形状,添加到世界

3.world.step()模拟计算 

package com.mop{  
      import Box2D.Collision.Shapes.b2PolygonDef;  
      import Box2D.Collision.b2AABB;  
      import Box2D.Common.Math.b2Vec2;  
      import Box2D.Dynamics.b2Body;  
      import Box2D.Dynamics.b2BodyDef;  
      import Box2D.Dynamics.b2DebugDraw;  
      import Box2D.Dynamics.b2World;  
        
      import flash.display.Sprite;  
      import flash.events.Event;  
    
      public class BoxTest extends Sprite {  
            
          public var worldAABB:b2AABB = new b2AABB();  
          public var gravity:b2Vec2 = new b2Vec2(0,10);  //重力  
          public var doSleep:Boolean = true; //无互交的刚体不参与模拟计算 提高性能  
          public var world:b2World;  
            
          private var pixelsToMeter:Number = 30;//box2d中 1m = 30px  
    
    
          public function BoxTest() {  
              //包围体定义,物理世界模拟的范围  
              worldAABB.lowerBound.Set(-100,-100);  
              worldAABB.upperBound.Set(100,100);  
              //物理世界  
              world = new b2World(worldAABB,gravity,doSleep);  
              //刚体定义  
              var bodyDef:b2BodyDef = new b2BodyDef();  
              bodyDef.position.Set(8,11);//位置定义  
              bodyDef.userData = new PhysGround();  
              var half_groudwidth:Number = 30;//物体的一半宽,单位m  
              var half_grounheight:Number = 3;  
              bodyDef.userData.width =  pixelsToMeter*half_groudwidth*2;  
              bodyDef.userData.height = pixelsToMeter*half_grounheight*2;  
              addChild(bodyDef.userData);  
              //物理形定义  
              var boxDef:b2PolygonDef = new b2PolygonDef();  
              boxDef.SetAsBox(half_groudwidth,half_grounheight);  
              boxDef.density = 0; //密度为0,可漂浮  
              boxDef.friction = 0.3; //摩擦力  
              //根据刚体定义创建刚体实体  
              var body:b2Body = world.CreateBody(bodyDef);  
              //根据物理形定义设置刚体  
              body.CreateShape(boxDef);  
              //依据形计算质量  
              body.SetMassFromShapes();  
                
              //调试模式绘制  
              var dbgDraw:b2DebugDraw = new b2DebugDraw();  
              var dbgSprite:Sprite = new Sprite();  
              addChild(dbgSprite);  
              dbgDraw.m_sprite = dbgSprite;  
              dbgDraw.m_drawScale = 30.0;  
              dbgDraw.m_fillAlpha = 0.0;  
              dbgDraw.m_lineThickness = 1.0;  
              dbgDraw.m_drawFlags = 0xFFFFFFFF;  
              world.SetDebugDraw(dbgDraw);  
                
              //同理添加物体  
              for (var index:int = 0; index < 10; index++) {  
                  bodyDef = new b2BodyDef();  
                  bodyDef.position.x = Math.random() * 15 + 5;  
                  bodyDef.position.y = Math.random() * 10;  
                  var hW:Number = Math.random() + 0.5;  
                  var hH:Number = Math.random() + 0.5;  
    
                  boxDef = new b2PolygonDef();  
                  boxDef.SetAsBox(hW, hH);  
                  boxDef.density = 1.0;  
                  boxDef.friction = 0.5;  
                  boxDef.restitution = 0.2; //弹力  
                  bodyDef.userData = new PhysBox();  
                  bodyDef.userData.width = hW * 2 * pixelsToMeter;  
                  bodyDef.userData.height = hH * 2 * pixelsToMeter;  
                  body = world.CreateBody(bodyDef);  
                  body.CreateShape(boxDef);  
                    
                  body.SetMassFromShapes();  
                  addChild(bodyDef.userData);  
              }  
              addEventListener(Event.ENTER_FRAME, Update, false, 0, true);  
          }  
            
          public function Update(e:Event):void{  
              world.Step(1/30, 10);  
              for (var bb:b2Body = world.m_bodyList; bb; bb = bb.m_next){  
                  if (bb.m_userData is Sprite){  
                      bb.m_userData.x = bb.GetPosition().x * 30;  
                      bb.m_userData.y = bb.GetPosition().y * 30;  
                      bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);  
                  }  
              }  
          }  
            
            
      }  
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

javascript 算法初识

最近有空,想学习下算法。一直感觉它很高深的样子,尤其我数学又不好。 但我还是想学学看,万一能学到点东西呢,,, 先来了解下算法的定义:是指解题方案的准确而完整的...

1976
来自专栏量化投资与机器学习

【高能】用PyMC3进行贝叶斯统计分析(代码+实例)

问题类型1:参数估计 真实值是否等于X? 给出数据,对于参数,可能的值的概率分布是多少? 例子1:抛硬币问题 硬币扔了n次,正面朝上是h次。 参数问题 想知道...

94110
来自专栏落影的专栏

程序员算法基础——动态规划

1978
来自专栏软件工程师成长笔记

高德,百度,Google地图定位偏移以及坐标系转换

一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不...

1.2K3
来自专栏小樱的经验随笔

HDU 1847 Good Luck in CET-4 Everybody!(规律,博弈)

Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory L...

2808
来自专栏数据小魔方

ggplot2都有哪些使用不多但是却异常强大的图层函数

要说ggplot2中那些使用不多但是却功能强大的图层函数,我首先想到的就是geom_rect、geom_linerange、geom_segment、geom_...

2133
来自专栏小尘哥的专栏

能买几颗糖??

Q:又来买糖,兜里装了一块零一分,即(¥1.01),,糖果也涨价了,变成0.56元一个,问买一个之后兜里还剩多少钱?

1062
来自专栏数据结构与算法

CDQZ 0003:jubeeeeeat

总时间限制: 1000ms 内存限制: 256000kB描述 众所周知,LZF很喜欢打一个叫Jubeat的游戏。这是个音乐游戏,游戏界面是4×4的方阵,会根...

3246
来自专栏数据结构与算法

HDU 1847 Good Luck in CET-4 Everybody!(找规律版巴什博奕)

Problem Description 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和...

3658
来自专栏JackieZheng

Java豆瓣电影爬虫——使用Word2Vec分析电影短评数据

  在上篇实现了电影详情和短评数据的抓取。到目前为止,已经抓了2000多部电影电视以及20000多的短评数据。   数据本身没有规律和价值,需要通过分析提炼成知...

5108

扫码关注云+社区

领取腾讯云代金券