`

物理模拟引擎box2D-2

 
阅读更多
根据第一例子重新自己做了box2D的例子,感觉写这个比前面的体会多点。

package  
{
	import Box2D.Collision.b2AABB;
	import Box2D.Collision.Shapes.b2PolygonDef;
	import Box2D.Collision.Shapes.b2ShapeDef;
	import Box2D.Common.Math.b2Vec2;
	import Box2D.Dynamics.b2Body;
	import Box2D.Dynamics.b2BodyDef;
	import Box2D.Dynamics.b2DebugDraw;
	import Box2D.Dynamics.b2World;	
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	
	/**
	 * ...
	 * @author ottoliu
	 */
	public class Hello extends MovieClip {
		
		protected var _world:b2World;
		
		// the ratio of pixels to meters
		public const RATIO:Number = 40;
		private var _fallingBody:b2Body;
		
		public function Hello() 
		{
			// 1. setup the world 
			 setupWorld();
			// 2. Creating the wall and floor
			createWallAndFloor();
			// 3 . adding the crate
			addCrate();
			
			setupDebugDraw();
			
			addEventListener(Event.ENTER_FRAME, newFrameEvent);
		}
		
		private function setupDebugDraw():void
		{
			
			var spriteToDraw:Sprite = new Sprite();
			addChild(spriteToDraw);
			
			var artistForHire:b2DebugDraw = new b2DebugDraw();
			artistForHire.m_sprite = spriteToDraw;
			artistForHire.m_drawScale = RATIO;
			artistForHire.SetFlags(b2DebugDraw.e_shapeBit);
			artistForHire.m_fillAlpha = 0.6;
			artistForHire.m_lineThickness = 2.0;
			
			_world.SetDebugDraw(artistForHire);
			
			
			
		}
		
		private function newFrameEvent(e:Event):void 
		{
			
			_world.Step(1.0 / 30.0, 10);
			
			trace("falling crate is "+_fallingBody.GetPosition().x+" , "+_fallingBody.GetPosition().y);
		}
		
		private function addCrate():void
		{
			//falling blocks to the world
			 var fallingCrateDef:b2PolygonDef = new b2PolygonDef();
			 fallingCrateDef.SetAsBox(25 / RATIO, 25 / RATIO);
			 fallingCrateDef.friction = 0.3;
			 fallingCrateDef.restitution = 0.1;
			 fallingCrateDef.density = 0.4;
			 
			//set it to 250,-30
			var fallingBodyDef:b2BodyDef = new b2BodyDef();
			fallingBodyDef.position.Set(250 / RATIO, -50 / RATIO);
			fallingBodyDef.angle = 30 * Math.PI / 180;
			
			_fallingBody = _world.CreateBody(fallingBodyDef);
			_fallingBody.CreateShape(fallingCrateDef);
			_fallingBody.SetMassFromShapes();
		}
		
		private function createWallAndFloor():void
		{
			//create the shape defination
			var bigLongPolyDef:b2PolygonDef = new b2PolygonDef();
			bigLongPolyDef.vertexCount = 4;
			b2Vec2(bigLongPolyDef.vertices[0].Set(0 / RATIO, 0 / RATIO));
			b2Vec2(bigLongPolyDef.vertices[1].Set(550 / RATIO, 0 / RATIO));
			b2Vec2(bigLongPolyDef.vertices[2].Set(550 / RATIO, 10 / RATIO));
			b2Vec2(bigLongPolyDef.vertices[3].Set(0 / RATIO, 10 / RATIO));
			
			bigLongPolyDef.friction = 0.5;
			bigLongPolyDef.restitution = 0.3;
			bigLongPolyDef.density = 0.0;
					
			
			// create the body defination
			var floorBodyDef:b2BodyDef = new b2BodyDef();
			floorBodyDef.position.Set(0 / RATIO, 390 / RATIO );
			
			// create body
			var floorBody:b2Body = _world.CreateBody(floorBodyDef);
			// create shape
			floorBody.CreateShape(bigLongPolyDef);
			floorBody.SetMassFromShapes();
			
			//wall
			var tallskinDef:b2PolygonDef = new b2PolygonDef();
			tallskinDef.SetAsBox(5 / RATIO, 195 / RATIO);
			tallskinDef.friction = 0.5;
			tallskinDef.restitution = 0.3;
			tallskinDef.density = 0.0;
						
			var wallBodyDef:b2BodyDef = new b2BodyDef();
			wallBodyDef.position.Set(5 / RATIO, 195 / RATIO);
			
			var leftWall:b2Body = _world.CreateBody(wallBodyDef);
			leftWall.CreateShape(tallskinDef);
			leftWall.SetMassFromShapes();
			
			wallBodyDef.position.Set(545 / RATIO, 195 / RATIO );
			var rightWall:b2Body = _world.CreateBody(wallBodyDef);
			rightWall.CreateShape(tallskinDef);
			rightWall.SetMassFromShapes();
			
			trace("the world has "+_world.GetBodyCount()+" bodies.");
		}
		
		private function setupWorld():void
		{
			// 1. setup the size of  the universe
			var universeSize:b2AABB = new b2AABB();
			universeSize.lowerBound.Set( -3000/RATIO, -3000/RATIO);
			universeSize.upperBound.Set( 3000/RATIO, 3000/RATIO);
			
			// 2. define gravity
			var gravity:b2Vec2= new b2Vec2(0.0, 10.0);
			// 3. ignore sleeping?
			var doSleep:Boolean = true;
			
			_world = new b2World(universeSize, gravity, doSleep);
			trace("my world has " + _world.GetBodyCount() + "bodies.");
		}
		
		
	}
	
}
分享到:
评论

相关推荐

    物理模拟引擎box2D-1

    NULL 博文链接:https://ottoliu.iteye.com/blog/1158040

    PhysicsEditor-Cocos2d-x-Box2d-master.zip_box2D_cocos2d_cocos2d x

    在"PhysicsEditor-Cocos2d-x-Box2d-master"这个项目中,包含了整合Cocos2d-x与Box2D的示例代码和资源,可以帮助开发者快速理解和实践两者之间的交互。项目中可能包括了如下的文件结构: 1. 示例场景文件(.cpp和.h...

    cocos2d-x box2d 物理引擎

    在cocos2d-x中,你需要创建一个Box2D的世界实例,这是所有物理模拟的基础。通过设置重力向量和其他参数,你可以控制游戏环境的物理特性。 5. **定义物理对象** 使用Box2D,你可以创建各种形状的物理对象,如矩形...

    box2d--1.0.js很好的物理引擎

    Box2D是一个非常知名的开源2D物理引擎,它在JavaScript版本中被称为Box2D--1.0.js。这个引擎主要用于创建具有真实世界物理特性的2D游戏和模拟。它的强大功能使得开发者能够轻松地实现物体碰撞检测、重力、摩擦力、...

    cpp-Box2DLite是一个小型2D物理引擎Lite版本更适合学习游戏物理

    总的来说,Box2D-Lite是一个强大的学习工具,它为2D游戏开发中的物理模拟提供了简洁的API和丰富的功能。通过掌握Box2D-Lite,开发者不仅可以创建出更加真实的游戏世界,还能提升自己在物理引擎开发领域的专业技能。

    box2d_py-2.3.5-cp37-cp37m-win_amd64.whl.zip

    Box2D_Py是Python中的一个物理引擎库,它是一个基于Box2D C++库的Python绑定,用于在游戏开发、模拟和可视化中创建2D物理效果。Box2D库本身由Erin Catto开发,它广泛应用于各种2D游戏和教育软件中,因为它能够高效地...

    box2d-wasm:Box2D物理引擎已编译为WebAssembly。 支持TypeScript和ES模块

    box2d-wasm Box2D编译为WebAssembly。 展示柜 展示自定义重力 使用释放 高性能主回路 WebGL渲染 用法 安装 npm i box2d-wasm 然后查看。 替代发行 有关其他功能: 流体模拟 粒子模拟 软体碰撞 您可以从分支进行...

    generic-box2d-plist

    《cocos2d-x与Box2D物理引擎的适配:深入理解“generic-box2d-plist”》 在游戏开发领域,cocos2d-x是一个广泛应用的2D游戏引擎,而Box2D则是一个强大的物理模拟库。两者结合,为开发者提供了构建具有真实物理效果...

    box2d物理引擎cocos2d

    在本案例中,我们看到的"box2d物理引擎cocos2d"是Cocos2d集成了Box2D物理引擎的一个实例,它涵盖了Cocos2d的2.x和3.x两个版本。 Box2D引擎的核心概念包括刚体(Bodies)、形状(Shapes)、关节(Joints)和力...

    《Box2dDemo》(Cocos2d-js)

    《Box2dDemo》是基于Cocos2d-js...总之,《Box2dDemo》是一个很好的学习Box2d和Cocos2d-js结合的起点,通过这个示例,开发者可以深入理解如何在JavaScript游戏中实现物理模拟,为创建更多具有真实感的2D游戏打下基础。

    瘸腿蛤蟆笔记42-cocos2d-x-3.2 Box2d物理引擎Motor Joint代码

    总结来说,Cocos2d-x 3.2版本中的Box2d物理引擎为游戏开发者提供了强大的物理模拟能力,Motor Joint是其中一种实现特定物理效果的工具。通过理解和运用Motor Joint,开发者可以创造出更为丰富多样的游戏场景,提升...

    cocos2d-x box2d 弹球

    在这个"弹球"项目中,开发者利用了Cocos2d-x的图形功能和Box2D的物理模拟能力,创建了一个类似"打砖块"(Breakout)的游戏。"Breakout"是一款经典的街机游戏,玩家通过控制一个挡板反弹球来击碎屏幕上方的砖块。 **...

    瘸腿蛤蟆笔记38-cocos2d-x-3.2 Box2d物理引擎Ray-cast代码

    Box2D是一款广泛应用于2D游戏开发的开源物理引擎,它提供了强大的物理模拟功能,包括刚体动力学、碰撞检测等。在Cocos2d-x框架中,Box2D被用来实现游戏中的物理行为,让游戏物体的运动更加真实。 首先,我们需要...

    IOS应用源码——YannickL-Box2D-Examples-63f9424.rar

    总之,YannickL-Box2D-Examples-63f9424是iOS开发者学习和实践2D物理模拟的宝贵资源。通过这个项目,不仅可以学习Box2D引擎的使用,还能提升对iOS应用开发的理解,为开发更丰富的互动体验打下坚实基础。

    box2d物理引擎和资料

    Box2D是一个开源的2D物理引擎,广泛用于游戏开发,模拟和教育领域。它提供了现实世界的物理行为,如重力、碰撞检测、摩擦力和弹力,使得开发者能够创建出更加逼真的游戏环境和交互体验。以下是关于Box2D物理引擎的...

    瘸腿蛤蟆笔记39-cocos2d-x-3.2 Box2d物理引擎自由落体代码

    通过研究这些笔记,开发者可以更好地理解和掌握在Cocos2d-x 3.2中使用Box2d进行物理模拟的方法。 总的来说,这个笔记提供了一个学习如何在Cocos2d-x游戏中利用Box2D实现自由落体效果的实例。通过实践这些技巧,...

    Box2D-2.3.0用户手册-中文版

    Box2D 是一种开放源代码的物理引擎,用于模拟2D刚体和碰撞检测。下面是根据 Box2D 2.3.0 用户手册-中文版生成的知识点总结: Chapter 1 导言 1.1 关于 Box2D * Box2D 是一种物理引擎,用于模拟2D刚体和碰撞检测...

    box2d-as3版 中文教程

    ### Box2D-as3版中文教程相关知识点 #### 1. 导言 **1.1 关于** Box2D是一款强大的2D物理仿真库,主要用于游戏开发领域,旨在为游戏提供更为真实的物理效果和更加丰富的互动体验。通过Box2D,游戏开发者可以让...

    MIPool 小台球 demo Box2d cocos2d-x2.2.3 源代码

    Box2D是一个强大的2D物理引擎,广泛应用于各种游戏和模拟场景,而cocos2d-x则是一个开源的跨平台2D游戏开发框架,支持iOS、Android、Windows等多平台。 首先,我们关注的是Box2D在小台球Demo中的应用。Box2D提供了...

Global site tag (gtag.js) - Google Analytics