已阅读5页,还剩79页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
HOME ABOUT Box2D 2 1a Tutorial Part 1 Posted by Allan Bishop on Wednesday July 14 2010 View Comments Physics engines are arguably one of the most engaging elements in interactive media Not only do they add visual realism but they also allow a greater interactive experience The Flash platform has a multitude of physics engine libraries available but the one I will be focusing on is Box2D 2 1a arguably the most powerful and feature rich physics engine of them all A little background info Box2D is the brainchild of Erin Catto Blizzard s Principle Software Engineer Box2D is in fact written in C but such is its popularity it spawned many ports with ActionScript 3 being no exception In charge of the manual porting to ActionScript 3 has been BorisTheBrave who has kept up with Erin s updates With the release of 2 1 emerged a new port created by Jesse Sternberg who leveraged Alchemy to generate AS3 code from the C version He has also made a framework WCK to allow developers to create Box2D objects by using the Flash IDE to layout the various elements However for now I will be focusing on BorisTheBrave s port which you can download from here Box2D can be fairly intimidating to begin developing with due to its sheer scale so we are going to ease into it I have based my following tutorial heavily on Box2D manual s Hello World tutorial the major changes being all the code examples are written in AS3 and a few minor creative liberties that I have taken Make sure you are familiar with the following definitions from the Box2D manual shape A 2D geometrical object such as a circle or polygon rigid body A chunk of matter that is so strong that the distance between any two bits of matter on the chunk is completely constant They are hard like a diamond In the following discussion we use body interchangeably with rigid body fixture A fixture binds a shape to a body and adds material properties such as density friction and restitution world A physics world is a collection of bodies fixtures and constraints that interact together Box2D supports the creation of multiple worlds but this is usually not necessary or desirable To help visualize the relationship between the classes I have created this chart Lets start coding 1 Create the world The first parameter is a 2D vector that defines the world s gravity The second parameter is a Boolean to allow bodies to sleep This is an optimization so that the physics engine does not needlessly process objects in the world that are not moving 01 package 02 03 import Box2D Dynamics b2World 04 import Box2D Common Math b2Vec2 05 import Box2D Dynamics b2BodyDef 06 import Box2D Dynamics b2Body 07 import Box2D Collision Shapes b2PolygonShape 08 import Box2D Dynamics b2Fixture 09 import Box2D Dynamics b2FixtureDef 10 import flash display MovieClip 11 import Box2D Dynamics b2DebugDraw 12 import flash display Sprite 13 import flash events Event 14 15 public class HelloWorld extends MovieClip 16 17 18 private const PIXELS TO METRE int 30 19 private const SWF HALF WIDTH int 400 20 private const SWF HEIGHT int 600 21 private var world b2World 22 23 public function HelloWorld 24 25 26 world new b2World new b2Vec2 0 10 true 2 Create the ground box definition In Box2D the units of measurement are in Metres We specify a ratio of pixels to metres this value is up to you Additionally the objects in Box2D have a origin that is in the centre of the object Since the SWF in my example is 800 600 and the ground box will be 800 pixels wide to match I set the X position to half that and convert to metres 1 var groundBodyDef b2BodyDef new b2BodyDef 2 3 groundBodyDef position Set SWF HALF WIDTH PIXELS TO METRE 4 SWF HEIGHT PIXELS TO METRE 20 PIXELS TO METRE 3 Here we can see the factory design pattern being used to create the body 1 var groundBody b2Body world CreateBody groundBodyDef 4 Now we create our shape 1 var groundBox b2PolygonShape new b2PolygonShape 2 groundBox SetAsBox SWF HALF WIDTH PIXELS TO METRE 20 PIXELS TO METRE 5 We can set various properties when we create the fixture 1 var groundFixtureDef b2FixtureDef new b2FixtureDef 2 groundFixtureDef shape groundBox 3 groundFixtureDef density 1 4 groundFixtureDef friction 1 5 groundBody CreateFixture groundFixtureDef The following code runs through steps 1 5 again as we make a small box to place in this world 01 var bodyDef b2BodyDef new b2BodyDef 02 bodyDef type b2Body b2 dynamicBody 03 bodyDef position Set SWF HALF WIDTH PIXELS TO METRE 4 04 var body b2Body world CreateBody bodyDef 05 06 var dynamicBox b2PolygonShape new b2PolygonShape 07 dynamicBox SetAsBox 1 1 08 09 var fixtureDef b2FixtureDef new b2FixtureDef 10 fixtureDef shape dynamicBox 11 fixtureDef density 1 12 fixtureDef friction 0 3 13 14 body CreateFixture fixtureDef 6 This part I added you won t find it on the HelloWorld tutorial from the Box2D tutorial This piece of code allows us to see the world we have created rather than just trace statements 01 var debugSprite Sprite new Sprite 02 addChild debugSprite 03 var debugDraw b2DebugDraw new b2DebugDraw 04 debugDraw SetSprite debugSprite 05 debugDraw SetDrawScale PIXELS TO METRE 06 debugDraw SetLineThickness 1 0 07 debugDraw SetAlpha 1 08 debugDraw SetFillAlpha 0 4 09 debugDraw SetFlags b2DebugDraw e shapeBit 10 world SetDebugDraw debugDraw 7 Now we need to give this world some life and let it run An ENTER FRAME event listener will do the job 1 addEventListener Event ENTER FRAME update 2 8 To update the world we call the step function Step accepts three parameters The first being the timestep Box2D manual recommends 1 60 seconds I find it best to set it to the SWF framerate so in this case 1 30 The next two parameters are the velocityIterations and positionIteration with 10 being the suggested count for each Fewer iterations boosts performances but comes at the cost of accuracy 1 public function update e Event void 2 3 var timeStep Number 1 30 4 var velocityIterations int 6 5 var positionIterations int 2 6 7 world Step timeStep velocityIterations positionIterations 9 As of version 2 1 we must clear the forces 1 world ClearForces 10 For drawing the debug data that we set earlier 1 world DrawDebugData 2 So that ends the first Box2D 2 1a tutorial If you decide to start experimenting on your own and are checking out other code samples be careful of what version you are looking at Pre 2 1 Box2D code examples will not compile without tweaking Final code view source print 01 package 02 03 import Box2D Dynamics b2World 04 import Box2D Common Math b2Vec2 05 import Box2D Dynamics b2BodyDef 06 import Box2D Dynamics b2Body 07 import Box2D Collision Shapes b2PolygonShape 08 import Box2D Dynamics b2Fixture 09 import Box2D Dynamics b2FixtureDef 10 import flash display MovieClip 11 import Box2D Dynamics b2DebugDraw 12 import flash display Sprite 13 import flash events Event 14 15 public class HelloWorld extends MovieClip 16 17 private const PIXELS TO METRE int 30 18 private const SWF HALF WIDTH int 400 19 private const SWF HEIGHT int 600 20 private var world b2World 21 22 public function HelloWorld 23 24 world new b2World new b2Vec2 0 10 true 25 26 var groundBodyDef b2BodyDef new b2BodyDef 27 groundBodyDef position Set SWF HALF WIDTH PIXELS TO ME TRE 28 SWF HEIGHT PIXELS TO METRE 20 PIXELS TO METRE 29 30 var groundBody b2Body world CreateBody groundBodyDef 31 32 var groundBox b2PolygonShape new b2PolygonShape 33 groundBox SetAsBox SWF HALF WIDTH PIXELS TO METRE 34 20 PIXELS TO METRE 35 36 var groundFixtureDef b2FixtureDef new b2FixtureDef 37 groundFixtureDef shape groundBox 38 groundFixtureDef density 1 39 groundFixtureDef friction 1 40 groundBody CreateFixture groundFixtureDef 41 42 var bodyDef b2BodyDef new b2BodyDef 43 bodyDef type b2Body b2 dynamicBody 44 bodyDef position Set SWF HALF WIDTH PIXELS TO METRE 4 45 var body b2Body world CreateBody bodyDef 46 47 var dynamicBox b2PolygonShape new b2PolygonShape 48 dynamicBox SetAsBox 1 1 49 50 var fixtureDef b2FixtureDef new b2FixtureDef 51 fixtureDef shape dynamicBox 52 fixtureDef density 1 53 fixtureDef friction 0 3 54 55 body CreateFixture fixtureDef 56 57 var debugSprite Sprite new Sprite 58 addChild debugSprite 59 var debugDraw b2DebugDraw new b2DebugDraw 60 debugDraw SetSprite debugSprite 61 debugDraw SetDrawScale PIXELS TO METRE 62 debugDraw SetLineThickness 1 0 63 debugDraw SetAlpha 1 64 debugDraw SetFillAlpha 0 4 65 debugDraw SetFlags b2DebugDraw e shapeBit 66 world SetDebugDraw debugDraw 67 68 addEventListener Event ENTER FRAME update 69 70 71 public function update e Event void 72 73 var timeStep Number 1 30 74 var velocityIterations int 6 75 var positionIterations int 2 76 77 world Step timeStep velocityIterations positionIterati ons 78 world ClearForces 79 world DrawDebugData 80 81 82 中文版 原文链接 使用 Box2D 制作 AS3 游戏 2 1a 版本 Hello World Box2D 想要制作一个像纸上怪物一样酷的基于物理学的 flash 游戏吗 最好的方式就是使用一个 叫做 Box2D 的很好的 flash 开源类库 现在有很多关于 flash 的物理引擎 但是 Box2D 就 属于这些引擎中的战斗机 很多开发人员选择使用 Box2D 并且现在 Box2D 有许多个语 言版本 C java xna iphone android 这使得 Box2D 成为了一款炙手可热的开发引擎 但是这也意味着 大部分的教程使用的不是 AS3 0 的编程语言 或者使用的是过时的 版本 本教程使用 AS3 0 以及最新的 Box2D 2 1a 版本 在本教程中 将会运用 Box2D 创建一个由能够进行真实碰撞的对象组成的世界 让你 在实践中学习取得经验 如果你是第一次接触 Box2D 你可能会对其以直观的方式将创建一个物体分为几个步骤 的方式感到不解 比如 如果你想创建一个方块状和一个球状图形 并让他们能够发生碰 撞 你可能希望只需要一个 Block 类和 Ball 类 通过 new 就能创建方块状和一个球状图形 并将他们添加到你的 Box2dWord 但是你错了 在 Box2D 中 如果你想创建一个方块 你需要进行以下几个步骤 现在 不用去担忧它是否是没意义的 后面我们将给出案例源码 1 创建一个 Shape 形状 这是一个对象的几何部分 2 创建一个 Body 刚体 定义 这是 Box2D 中的一个特殊对象类型 作为创建刚体的 参数 3 告诉 World 世界 创建一个 body 刚体 将你创建的 body 定义传给 world 世界 让 世界以它作为参数创建一个刚体 一个刚体在世界中是由多个形状构成的不可分割的对象 这些形状共享同一个质心 即刚体的质心 4 创建一个 fixture 固定附着物 即形状与刚体的绑定物 fixture 是 box2d 中的一个 新的对象类型 用于定义添加到刚体上的形状的属性 Box2D 有一个特殊的方式让你创建物体 而且你必须在正确的时间 按正确的顺序进 行 它不需要你在了解其内部组织结构上浪费时间 原因有两方面 其一 它最初是用不 同的语言编写的 它遵循这些语言的许多公约 其二 这些步骤使得 Box2D 的运行很有效 率 要明白 Box2D 和其它的 Actionscript APIS 是不同的 不要去反对它 去用它就行了 因为它对自己的规则非常自信 并且异常强大 好了 让我们来写一些代码 我们将要创建一个 box2d 世界 在里面建两个矩形刚体 并用 box2d 内置的调试渲染器将其画在屏幕上 下面是我们将要创建的整个类 现在只需 要大致的看一下 后面我们将详细的对其进行讲解 01 package 02 03 import flash display Sprite 04 import flash events Event 05 Bring In Box2D 06 import Box2D Dynamics 07 import Box2D Collision 08 import Box2D Collision Shapes 09 import Box2D Dynamics Joints 10 import Box2D Dynamics Contacts 11 import Box2D Common Math 12 13 14 15 author Zach 16 17 public class Main extends Sprite 18 19 private var world b2World 20 private var timestep Number 21 private var iterations uint 22 private var pixelsPerMeter Number 30 23 24 public function Main void 25 26 27 makeWorld 28 makeWalls 29 makeDebugDraw 30 31 if stage init 32 else addEventListener Event ADDED TO STAGE init 33 34 35 36 private function makeWorld void 37 38 Define the gravity vector 39 var gravity b2Vec2 new b2Vec2 0 0 10 0 40 Allow bodies to sleep 41 var doSleep Boolean true 42 Construct a world object 43 world new b2World gravity doSleep 44 world SetWarmStarting true 45 timestep 1 0 30 0 46 iterations 10 47 48 49 50 private function makeWalls void 51 52 Note I am assuming a stage size of 640 x400 53 These placements will put a row of boxes around an area that size 54 55 We reuse the shape and Body Definitions 56 Box2D creates a different body each time we call world CreateBody wallBd 57 var wall b2PolygonShape new b2PolygonShape 58 var wallBd b2BodyDef new b2BodyDef 59 var wallB b2Body 60 61 Left 62 wallBd position Set 95 pixelsPerMeter 400 pixelsPerMeter 2 63 wall SetAsBox 100 pixelsPerMeter 400 pixelsPerMeter 2 64 wallB world CreateBody wallBd Box2D handles the creation of a new b2Body for us 65 wallB CreateFixture2 wall 66 Right 67 wallBd position Set 640 95 pixelsPerMeter 400 pixelsPerMeter 2 68 wallB world CreateBody wallBd 69 wallB CreateFixture2 wall 70 Top 71 wallBd position Set 640 pixelsPerMeter 2 95 pixelsPerMeter 72 wall SetAsBox 680 pixelsPerMeter 2 100 pixelsPerMeter 73 wallB world CreateBody wallBd 74 wallB CreateFixture2 wall 75 Bottom 76 wallBd position Set 640 pixelsPerMeter 2 400 95 pixelsPerMeter 77 wallB world CreateBody wallBd 78 wallB CreateFixture2 wall 79 80 81 82 private function makeDebugDraw void 83 84 set debug draw 85 var debugDraw b2DebugDraw new b2DebugDraw 86 var debugSprite Sprite new Sprite 87 addChild debugSprite 88 debugDraw SetSprite debugSprite 89 debugDraw SetDrawScale 30 0 90 debugDraw SetFillAlpha 0 3 91 debugDraw SetLineThickness 1 0 92 debugDraw SetFlags b2DebugDraw e shapeBit b2DebugDraw e jointBit 93 world SetDebugDraw debugDraw 94 95 96 private function init e Event null void 97 98 removeEventListener Event ADDED TO STAGE init 99 entry point 100 update 101 102 103 private function update e Event null void 104 105 world Step timestep iterations iterations 106 world ClearForces 107 Render 108 world DrawDebugData 109 110 111 112 113 复制代码 通览整个类 如果你看到 6 11 行 我们使用通配符 导入 Box2d 来引用所有类 对于本教 程来说这种做法很好 但是在实际操作中 我通常只导入需要用到的类 教程中 我已经在构造函数中调用了三个函数 这三个函数的名称代表我们将要进行 的三个步骤 27 29 行 让我们详细的来看看每一个步骤 首先 创建世界 第一步 创建 world 世界 在 Box2D 2 1a 版本中 创建世界要比以前的版本简单得多 如果你看过旧版本的例子 你应该知道 创建世界需要进行定义世界的大小等许多零零碎碎的操作 但是现在不用了 现在创建世界非常的直接了当 01 private function makeWorld void 02 03 Define the gravity vector 04 var gravity b2Vec2 new b2Vec2 0 0 10 0 05 Allow bodies to sleep 06 var doSleep Boolean true 07 Construct a world object 08 world new b2World gravity doSleep 09 world SetWarmStarting true 10 timestep 1 0 30 0 11 iterations 10 12 13 复制代码 第 4 行 我们定义了一个重力变量 为向量类型 世界中的所有对象都将被赋予这个重力 向量 你可以通过设置向量为 0 10 来创建反重力 或者设置向量为 0 0 来创建零重力 甚至是将 X 参数设为一个正数 Y 参数设为 O 来创建不可思议的侧身重力 第 6 行 决定是否让 Box2D 停止检测已经停止移动的物体的碰撞 设为 True 会降低 CPU 的消耗 但是你需要注意在某些情况下使其为 flase 就个人而言 我还没遇到这样的情况 第 8 行 创建世界 我们设置它的重力参数 是否休眠属性 第 9 行 告诉世界 所有的刚体开始的时候都没有休眠 如果你设为 flase 新建的刚体将不 会立刻受到重力的影响直到你明确的将他们唤醒 或受到外力的作用 对于用 Box2d 制作 像台球类型的游戏 因为其游戏开始的时候所有的球都是静止的 就可以将其设为 flase 第 10 行 Box2D 在指定的时间内处理模拟对象的碰撞检测 timestep 步长 告诉 Box2d 两次碰撞检测应该间隔多久时间 保持这个数值较小是个好主意 第 11 行 告诉 Box2D 在移动前要解决多少次复杂的碰撞 考虑这样一个情形 一次碰撞 让一个刚体移进第三个刚体 现在他们发生了碰撞 并将一个刚体反弹回第一个刚体 由 于物理模拟的实质 这些碰撞将没有止境 你使用 iterations 迭代次数 告诉 box2D 好了 已经够近了 向前移动 如果你将 iterations 设得小 你的碰撞模拟将会包含更多的错误 和奇怪的行为 但是会更快 如果你将其值设得较大 将会更加精确 但是会降低整个程 序的性能 除非你遇到问题 不然就将其值都设为 10 现在进行下一步 添加对象到我们的世界 第二步 创建墙 边界 现在我们有了一个空的 Box2D 世界 现在我们将添加一些能发生碰撞的刚体到里面 值得注意的是 Box2D 中所有的类都是以 b2 为前缀开始的 这是一个非常有用的方式 通过这个方式 Box2D 确保你不会创建和其同名的类 于是你创建一个英雄 英雄有一个 身体 你依然可以为他创建一个 b2Body 而不用担心覆盖类名 下面是创建边界墙的代码 01 private function makeWalls void 02 03 Note I am assuming a stage size of 640 x400 04 These placements will put a row of boxes around an area that size 05 06 We reuse the shape and Body Definitions 07 Box2D creates a different body each time we call world CreateBody wallBd 08 var wall b2PolygonShape new b2PolygonShape 09 var wallBd b2BodyDef new b2BodyDef 10 var wallB b2Body 11 12 Left 13 wallBd position Set 95 pixelsPerMeter 400 pixelsPerMeter 2 14 wall SetAsBox 100 pixelsPerMeter 400 pixelsPerMeter 2 15 wallB world CreateBody wallBd Box2D handles the creation of a new b2Body for us 16 wallB CreateFixture2 wall 17 Right 18 wallBd position Set 640 95 pixelsPerMeter 400 pixelsPerMeter 2 19 wallB world CreateBody wallBd 20 wallB CreateFixture2 wall 21 Top 22 wallBd position Set 640 pixelsPerMeter 2 95 pixelsPerMeter 23 wall SetAsBox 680 pixelsPerMeter 2 100 pixelsPerMeter 24 wallB world CreateBody wallBd 25 wallB CreateFixture2 wall 26 Bottom 27 wallBd position Set 640 pixelsPerMeter 2 400 95 pixelsPerMeter 28 wallB world CreateBody wallBd 29 wallB CreateFixture2 wall 30 31 复制代码 在本教程的前面我们描述了创建一个对象的步骤 当时你可能感觉它有点混淆不清 但是 在这里 你将看到它起到的作用 它是非常清晰的 第 8 10 行 我们声明了我们需要的变量 我们将要创建 4 座墙 因此我们每次会重用 相同的变量 由于这些对象都是不动的 我们没必要为他们创建 fixture 来定义密度以及其 他属性 Box2D 创建的默认的 fixture 对于不懂的刚体来说已经非常完美了 我们只需要使用一个 BodyDefinition 一个 Shape 每次让 Box2D 创建刚体的时候改变他 们的参数就行了 把这当作一个可以重用的有顺序的表单 box2D 世界通过它创建实际的 刚体 但是每个刚体创建后 已获得参数的刚体和表单间就没有联系了 因此 如果你改 变了表单 并将它传递给了 Box2D 世界 你将获得一个新的顺序表单创建的新的刚体 事 实上 你可能会经常提交相同的 BodyDefinition box2D 会一遍又一遍的创建一个匹配你 BodyDefinition 的新的刚体 下面让我们来看看方块的创建 第 13 行 这里我们定义了新刚体的位置 它接收 X Y 的坐标参数 但是为什么会复杂 的除两次 因为 box2D 以米和千克测量它的世界 而我们的游戏用像素测量它的世界 理解 Box2D 中的单位 Box2D 是根据以米和千克为其计量单位来设计的 这非常的方便 因为物理科学 也是以米和千克为计量单位的 这能让 Box2D 对真实世界的现象进行真实的模拟 很明显 我们不能在任何方向都让一米和一像素等价 因此我们需要降低其比例 你可以设定你的 比例 让一米等于一像素 但是这会让 Box2D 的运行效率降低 因为在 Box2D 中 1 米 和两米间的差异很大 很明显 但是在 1 像素与 2 像素间的差异基本上不可见 你必须在用户可见的计量单位与 Box2D 的计量单位间找到一个平衡点 按照惯例 用 Box2D 的程序员将 30 个像素设置为 1 米 这样对 Box2D 的性能和精确度来说是一个 折中的办法 因此 当你想放一个对象进入 Box2D 世界的时候 让你的具体的像素位置除 以你的比例 下面是如何将坐标转换的公式 pixels pixelsPerMeter box2DMeters box2DMeters pixelsPerMeter pixels 请记住最后一点 Box2D 刚体的注册点在其几何中心 因此 以他们的左上角为特 殊点摆放物体 你会看到那些数字都除了 2 比如 如果你想创建一个 100 像素的正方形 Box2D 刚体 并将其坐标设为 0 0 你只会在屏幕上看到这个正方形的一半 要想将 100 x100 的方形放置在屏幕的左上方 你需要将其坐标设为 100 2 100 2 第 14 行 在这里我们调用了 SetAsBox 函数 这是创建不需要旋转的盒子的快捷函数 如果要创建需要旋转的盒子 就使用 SetAsOrientedBox 第 15 行 我们让世界以我们的 bodyDefinition 为规范创建一个刚体 所有对 bodyDefinition 的改变都会在我们调用 world CreateBody 的时候发生作用 新建的刚体在 我们对其添加东西前只是一个放置几何形状的空容器 从这一刻开始 任何对 bodyDefinition 的改变只会影响后续使用 world CreateBody 创建的刚体 第 16 行 最后 我们添加方形给我们的刚体 现在 空的刚体包含了一个长方形 接着我们对其它的墙重复这个过程 在这点上 Box2D 世界做得很好 不需要其它额 外的工作 Box2D 通过其内部数据进行模拟 不需要任何舞台上的对象工作 如果你是一 个不需要 GUI 的通过 linux 命令行进行编程的人 你可以到此结束了 去管理数据库或其 它的内容 当然 你是一个 flash 程序员 这意味着不看到它的运行情况就无法进行编程 好了 让我们来添加视觉元素到舞台 看看我们的世界看起来像个什么吧 使用 DebugDraw 来呈现在 Box2D 世界发生了什么 使用内置的 debug draw 类是呈现我们创建的 Box2D 世界的最快的方法 这并不奇特 只是一些矢量线和填充块 但这对于只想看看游戏引擎的效果而不担心游戏美工的我们来 说已经很完美了 如何在 Box2D 中使用你自己的图形和影片剪辑不在本教程的讲述范围内 下面是添加 debug draw 的代码 01 private function makeDebugDraw void 02 03 set debug draw 04 var debugDraw b2DebugDraw new b2DebugDraw 05 var debugSprite Sprite new Sprite 06 addChild debugSprite 07 debugDraw SetSprite debugSprite 08 debugDraw SetDrawScale 30 0 09 debugDraw SetFillAlpha 0 3 10 debugDraw SetLineThickness 1 0 11 debugDraw SetFlags b2DebugDraw e shapeBit b2DebugDraw e jointBit 12 world SetDebugDraw debugDraw 13 private function makeDebugDraw void set debug draw var debugDraw b2DebugDraw new b2DebugDraw var debugSprite Sprite new Sprite addChild debugSprite debugDraw SetSprite debugSprite debugDraw SetDrawScale 30 0 debugDraw SetFillAlpha 0 3 debugDraw SetLineThickness 1 0 debugDraw SetFlags b2DebugDraw e shapeBit b2DebugDraw e jointBit world SetDebugDraw debugDraw 复制代码 要想使用 b2DebugDraw 类 我们需要 创建 b2DebugDraw 类得实例 赋一个空的影片剪辑给它来进行所有的绘画 让世界使用这个 b2DebugDraw 实例 第 4 行 创建 b2DebugDraw
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物(黑吉辽蒙卷01)(全解全析)-2026年高考考前预测卷
- 涂装线固化温度控制制度规范
- 月嫂早教互动课程标准客厅早晨
- 核心制度执行情况督查方案
- 驱虫药销售话术手册门店流程
- 精益生产计划看板管理规范
- 成品保护施工节点质量技术交底方案
- 服务器运维操作手册与故障排查指南
- 机加工区能源监控设备制度
- 检验段零件清洗工艺优化制度
- 2026四川德阳市什邡市教育和体育局选调高(职)中教师13人备考题库附答案详解
- 2026江西赣州市安远县东江水务集团有限公司第一批人员招聘10人备考题库含答案详解(b卷)
- 企业一般固废管理制度
- 2026年花样滑冰赛事品牌建设与营销创新案例研究
- 2026山东青岛海关缉私局警务辅助人员招聘10人考试参考题库及答案解析
- 2026年考研数学一模拟单套试卷(含解析)
- 项目RAMS系统保证计划SAP
- 《2020室性心律失常中国专家共识(2016共识升级版)》要点
- 人教A版(2019)高中数学必修第二册 基本立体图形 第2课时圆柱、圆锥、圆台、球与简单组合体的结构特征课件
- 国家开放大学《四史通讲》形考任务专题1-6自测练习参考答案
- 混凝土机械建筑施工机械
评论
0/150
提交评论