Nape是除Box2D之外的又一个2D物理模拟引擎,有 Luca Deltodesco 用 Haxe语言 编写的。Nape引擎还提供了AS3版的SWC库,供Flash开发使用,这也是本次教程要讲的重点。 点击下载Nape的AS3版SWC类库 。

Nape不仅比Box2D运行速度要快,而且更节省内存,有更完善的回调系统、几何算法功能和 在线文档 (这些优势是官方介绍的,拉登大叔还没有亲测过)。

Nape的整体结构和思想跟Box2D是大体一致的,如果你没有学过Box2D,可以从认识Box2D世界开始,但这不是学习Nape必须的。如果你熟悉Box2D,恭喜你,有了Box2D的基础,掌握Nape只需要几分钟的时间。好了闲话少说,下面我详细了解一下,一个基本的Nape应用的创建过程。

一、Nape空间Space
Nape的Space类为整个Nape系统构建了一个模拟环境,就像我们生活的地球,是任何Nape应用所必须的也是核心的元素。

                  可以理解成Box2D中的b2World类

另外,既然是物理模拟引擎,肯定少不了重力。Nape中的重力用一个Vec2向量对象表示,所以创建一个Space空间的代码如下:

   //1.创建一个基本的Nape空间
//声明空间重力
var gravity:Vec2 = new Vec2(0, 400);
space = new Space(gravity);

空间创建好后,好要进行模拟,这一点通过space.step()函数来实现。在Flash的ENTER_FRAME时间处理器重,调用space.step()方法,Nape引擎会自动计算进行物理模拟。

step()函数中有三个参数,它们 功能分别如下:

  • deltatime:前后两次模拟计算间隔的时间,这个时间越短,碰撞检测越精确,不过模拟运行速度也越慢,通常为1/60。
  • velocityIterations:碰撞过程中速度模拟计算的迭代次数,通常情况下这个数值超过10就能模拟真实的碰撞效果了。
  • positionIterations:碰撞过程中物体坐标模拟计算的迭代次数,默认为10。
  //Nape空间模拟
space.step(1 / 60, 30);

刚体的创建主要分为三个部分:

  • 创建一个Body对象,并指定它的类型和坐标。刚体的类型由BodyType中的常量指定,包括BodyType.STATIC、DYNAMIC和KINEMATIC三种类型;坐标是一个Vec2类型的变量。
  • 创建刚体的形状shape,可以接收的形状有两种Cirle和Polygon,后者通过指定不同的顶点来创建任何非圆形的形状。
  • 指定刚体所存在的空间,即第一部分提到的空间。
  • 举例说明如下:

       //        a.创建一个Body对象,并指定它的类型和坐标
    var body:Body = new Body(BodyType.DYNAMIC, new Vec2(mouseX, mouseY));
    //        b.创建刚体的形状shape,可以接收的形状有两种Cirle和Polygon,后者通过指定不同的顶点来创建任何非圆形的形状。
    var shape:Polygon = new Polygon(Polygon.box(Math.random()*30+30,Math.random()*30+30));
    body.shapes.add(shape);
    //        c.指定刚体所存在的空间,即第一部分提到的空间。
    body.space = space;

    三、Nape模拟调试视图
    空间和刚体创建好后,舞台上任然是什么都看不见的,因为刚体并不是可视对象。这时候我们需要创建一个ShapeDebug对象,这个ShapeDebug对象会遍历所有的刚体,并通过Flash绘图API把它们绘制到一个DisplayObject上,然后通过ShapeDebug.display获取这个DisplayObject,并添加到舞台上,即可看见所有的刚体对象。

    可以理解成Box2D中的b2DebugDraw对象
    

    ShapeDebug的构造函数中有三个参数,前两个表示DisplayObject的宽和高,第三个是刚体绘制的颜色,可以保存默认不变。
    然后我们要分别调用ShapeDebug的clear()、flush()和draw()方法,分别清除视图、优化显示图像和绘制Nape空间。

    ShapeDebug使用方法举例说明如下:

       //3.创建模拟视图
    debug = new ShapeDebug(400, 200);
    addChild(debug.display);
    private function loop(e:Event):void
    {
    //Nape空间模拟
    space.step(1 / 60, 30);
    //清除视图
    debug.clear();
    //优化显示图像
    debug.flush();
    //绘制空间
    debug.draw(space);
    }

    四、简单的Nape示例
    到这里,一个简单Nape示例所需的内容,我们就学完了,下面是一个简单的示例,点击鼠标创建一个矩形刚体

    package
    {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import nape.geom.Vec2;
    import nape.phys.*;
    import nape.shape.Polygon;
    import nape.space.Space;
    import nape.util.ShapeDebug;
    /**
    * ...
    * @author ladeng6666
    */
    public class HelloNape extends Sprite
    {
    private var space:Space;
    private var debug:ShapeDebug;
    public function HelloNape()
    {
    //1.创建一个基本的Nape空间
    //声明空间重力
    var gravity:Vec2 = new Vec2(0, 400);
    space = new Space(gravity);
    //2.创建静态的Nape刚体
    //        a.创建一个Body对象,并指定它的类型和坐标
    var body:Body = new Body(BodyType.STATIC, new Vec2(stage.stageWidth/2, stage.stageHeight-10));
    //        b.创建刚体的形状shape,可以接收的形状有两种Cirle和Polygon,后者通过指定不同的顶点来创建任何非圆形的形状。
    var shape:Polygon = new Polygon(Polygon.box(stage.stageWidth, 10));
    body.shapes.add(shape);
    //        c.指定刚体所存在的空间,即第一部分提到的空间。
    body.space = space;
    //3.创建模拟视图
    debug = new ShapeDebug(400, 200);
    addChild(debug.display);
    //4.在ENTER_FRAME事件处理器中进行Nape模拟
    addEventListener(Event.ENTER_FRAME, loop);
    stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseEventHandler);
    }
    private function mouseEventHandler(e:MouseEvent):void
    {
    //        a.创建一个Body对象,并指定它的类型和坐标
    var body:Body = new Body(BodyType.DYNAMIC, new Vec2(mouseX, mouseY));
    //        b.创建刚体的形状shape,可以接收的形状有两种Cirle和Polygon,后者通过指定不同的顶点来创建任何非圆形的形状。
    var shape:Polygon = new Polygon(Polygon.box(Math.random()*30+30,Math.random()*30+30));
    body.shapes.add(shape);
    //        c.指定刚体所存在的空间,即第一部分提到的空间。
    body.space = space;
    }
    private function loop(e:Event):void
    {
    //Nape空间模拟
    space.step(1 / 60, 30);
    //清除视图
    debug.clear();
    //优化显示图像
    debug.flush();
    //绘制空间
    debug.draw(space);
    }
    }
    }

    文章转自http://bbs.9ria.com/thread-169648-1-1.html

【Nape教程】认识Nape空间相关推荐

  1. 【Nape教程】Nape刚体碰撞检测

    Nape帮我们实现了物理碰撞模拟,通过Nape我们可以实现各种游戏模型.但是就像我在 Box2D碰撞检测 里讲的一样,只是碰撞是不够的,我还喜欢碰撞后的物体可以消失.变小等等,按照游戏需求执行任何需要 ...

  2. python基础教程:名称空间与作用域

    函数内部的函数只能在函数内部调用,不能在函数外部调用,通过接下来的学习你将会知道为什么会出现这种情况. def f1():def f2():print('from f2')f2()f2() # Nam ...

  3. 华强北AirPods洛达1562A固件升级教程,带空间音频(艾创力+东莞豪锐)

    Hello 大家好,这里是 niceyoo,我是你们的小源. 今天分享的是洛达1562A的固件升级教程.其实一直不想写这篇,主要是怕出现问题,​怎么讲呢?本身刷机这件事是有风险的,就跟手机系统刷机一样 ...

  4. Python-EEG工具库MNE中文教程(10)-信号空间投影SSP数学原理

    目录 projector(投影)和投影背景 案例解释投影原理 导入工具库 什么是projector(投影)? 计算正交平面 使用SVD计算投影矩阵 本分享为脑机学习者Rose整理发表于公众号:脑机接口 ...

  5. PostGIS教程十:空间连接

    目录 一.连接和汇总 二.高级连接 三.空间连接练习 空间连接(spatial joins)是空间数据库的主要组成部分,它们允许你使用空间关系作为连接键(join key)来连接来自不同数据表的信息. ...

  6. ArcGIS教程:欧氏距离 (空间分析)

    摘要 计算每个像元到最近源的欧氏距离. 插图 用法 输入源数据可以是要素类或栅格. 当输入源数据是栅格时,源像元集包括具有有效值的源栅格中的所有像元.具有 NoData 值的像元不包括在源集内.值 0 ...

  7. ArcGIS教程:检查空间自相关和方向变化

    通过探索数据,您将能够更好地了解测量值之间的空间自相关.这种了解有助于在选择空间预测模型时做出更好的决策. 空间自相关 可通过检查不同的采样位置对来探索数据的空间自相关.通过测量两个位置间的距离并绘制 ...

  8. arcgis中欧氏距离操作_ArcGIS教程:欧氏距离 (空间分析)

    用法 输入源数据可以是要素类或栅格. 当输入源数据是栅格时,源像元集包括具有有效值的源栅格中的所有像元.具有 NoData 值的像元不包括在源集内.值 0 将被视为合法的源.使用提取工具可轻松地创建源 ...

  9. ARFoundation入门教程11-地理空间和云锚点的配置

    托管和解析云锚点必须授权您的应用调用 ARCore Cloud Anchor API.授权包括使用API密钥授权和无密钥授权,区别是: 使用API密钥授权托管和解析最多24小时(1天)的云锚点. 使用 ...

最新文章

  1. ASP.NET Core 1.0 使用 MySQL for EF Core 1.0 (.NET Core 1.0)
  2. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | ActivityThread 源码分析 )
  3. sparkStreaming+kafka SparkException: java.nio.channels.ClosedChannelException异常报错
  4. .NET开发框架(三)-高可用服务器端设计
  5. 重磅来袭 | 移动云城市峰会分论坛暨移动云TeaTalk青岛站 即将开启
  6. 28 数组中出现次数超过一半的数字
  7. ajax对象的属性和方法
  8. 左右两个列表框项之间的添加、移除、上下移动
  9. DreamWeaver CS3中的SPRY的自定义验证
  10. php获取字段中的第几个数字_php提取字符串中的数字
  11. 联想教学用计算机,联想多媒体电子教室解决方案
  12. 硬件-1-打印机爱普生L3153墨仓式一体机
  13. SLAM专题(8)卡尔曼滤波和扩展卡尔曼滤波 原理与应用
  14. 神州数码web登录方式
  15. 软件方法(下)分析和设计第8章连载[20210816更新]分析 之 分析类图——知识篇
  16. Python集合运算
  17. 怎么用python读取excel图_如何用Python读取Excel中图片?
  18. 新产品、新特性、新生态丨一文回顾openGauss峰会云和恩墨分论坛150分钟的精彩...
  19. 物联网轻量级开发方案:在K3s部署Shifu,实现云边端闭环
  20. 数据中心机房监控室效果图

热门文章

  1. 快牙网传——推送通知
  2. 零基础go还是python_零基础学习Python的经验之谈
  3. 编程达人教你如何快速掌握一门编程语言
  4. Dlink DIR-615L 和水星(mercury) MW300R桥接方法!
  5. 查找目录下大小超过10M的文件
  6. Primeng CascadeSelect UI显示BUG解决方案
  7. 2.10 zio入门——总结
  8. 解决three.js渲染gltf 模型与gltfViewer网站效果不一致问题 krpano发黑问题 three.js gltf模型渲染发黑问题
  9. 超级马里奥(待完善)
  10. DevOps自动化测试的原则和实践