#Andengine##Box2D#-----前轮驱动赛车
来源:互联网 发布:win7网络共享无法保存 编辑:程序博客网 时间:2024/04/28 06:19
一. 实现功能:
应用Andengine引擎+Box2D物理引擎,实现“前轮驱动”赛车.
二. 相关代码:
1. 在游戏场景中创建物理世界:
FixedStepPhysicsWorld mPhysicsWorld = new FixedStepPhysicsWorld(60, new Vector2(0f, 0f), false, 8, 3); //创建物理世界,将重力设置为0registerUpdateHandler(mPhysicsWorld); //在当前场景中注册该物理世界
2. 创建汽车主体部分:
public static final FixtureDef CAR_DEF = PhysicsFactory.createFixtureDef(1f, 1f, 1f, false);Sprite CarShape=new Sprite(); //创建汽车主体精灵GameScene.attach(CarShape);//将精灵附加到场景中Body carBody = PhysicsFactory.createBoxBody(Registry.sGameScene.mPhysicsWorld,CarShape,BodyDef.BodyType.DynamicBody,Registry.sGameScene.CAR_DEF); //根据汽车主体精灵创建BodycarBody.setLinearDamping(1); //设置线性方向上的阻尼carBody.setAngularDamping(1);//设置转动阻尼mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(CarShape, carBody, true, true)); //将Sprite和Body进行连接
3. 创建四个轮胎:
public static final FixtureDef WHEEL_DEF = PhysicsFactory.createFixtureDef(1f, 1f, 1f, false); //右前轮(Sprite+Body):rightTopWheel=new Sprite(CarShape.getX()+CarShape.getWidth()*0.5f,CarShape.getY()+18,ResourceManager.getInstance().WheelRegion,ResourceManager.getInstance().vbom);Registry.sGameScene.attachChild(rightTopWheel); rightTopBody = PhysicsFactory.createBoxBody(Registry.sGameScene.mPhysicsWorld,rightTopWheel,BodyDef.BodyType.DynamicBody, Registry.sGameScene.WHEEL_DEF);Registry.sGameScene.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(rightTopWheel, rightTopBody, true, true));//左前轮(Sprite+Body):leftTopWheel=new Sprite(CarShape.getX()-CarShape.getWidth()*0.5f,CarShape.getY()+18,ResourceManager.getInstance().WheelRegion,ResourceManager.getInstance().vbom);Registry.sGameScene.attachChild(leftTopWheel);leftTopBody = PhysicsFactory.createBoxBody(Registry.sGameScene.mPhysicsWorld,leftTopWheel,BodyDef.BodyType.DynamicBody, Registry.sGameScene.WHEEL_DEF); Registry.sGameScene.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(leftTopWheel, leftTopBody, true, true));//右后轮(Sprite+Body):rightDownWheel=new Sprite(CarShape.getX()+CarShape.getWidth()*0.5f,CarShape.getY()-18,ResourceManager.getInstance().WheelRegion,ResourceManager.getInstance().vbom);Registry.sGameScene.attachChild(rightDownWheel);rightDownBody = PhysicsFactory.createBoxBody(Registry.sGameScene.mPhysicsWorld,rightDownWheel,BodyDef.BodyType.DynamicBody, Registry.sGameScene.WHEEL_DEF);Registry.sGameScene.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(rightDownWheel, rightDownBody, true, true));//左后轮(Sprite+Body)leftDownWheel=new Sprite(CarShape.getX()-CarShape.getWidth()*0.5f,CarShape.getY()-18,ResourceManager.getInstance().WheelRegion,ResourceManager.getInstance().vbom);Registry.sGameScene.attachChild(leftDownWheel);leftDownBody = PhysicsFactory.createBoxBody(Registry.sGameScene.mPhysicsWorld,leftDownWheel,BodyDef.BodyType.DynamicBody, Registry.sGameScene.WHEEL_DEF);Registry.sGameScene.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(leftDownWheel, leftDownBody, true, true));
4.将轮胎与汽车主体进行关联:
(1). RevoluteJoint (旋转关节) ----前轮
因为前轮负责方向的引导(即转向,方向盘控制前轮),所以需要使用旋转关节
private RevoluteJoint mJointRightTop; private RevoluteJointDef rtjd; rtjd.initialize(carBody, rightTopBody, rightTopBody.getWorldCenter()); //将车体Body与右前轮Body进行连接,连接中心设为车胎中心rtjd.enableMotor=true; //旋转关节开启扭矩rtjd.maxMotorTorque=100; //最大扭矩设置为100mJointRightTop= (RevoluteJoint)Registry.sGameScene.mPhysicsWorld.createJoint(rtjd); //在物理世界中注册该关节
(2). PrismaticJoint(平行关节)----后轮
后轮只需要跟随车辆主体进行运动
PrismaticJointDef jd=new PrismaticJointDef();Joint mJointRightDown=null;jd.initialize(carBody, rightDownBody, rightDownBody.getWorldCenter(),new Vector2(1,0)); //将右后轮Body与车主体Body进行平行关节连接jd.enableLimit=true; //设置为跟随车动jd.lowerTranslation=0;jd.upperTranslation=0;mJointRightDown=Registry.sGameScene.mPhysicsWorld.createJoint(jd); //注册关节
5. 场景Update循环中控制车辆移动与转向:
*Box2D知识点: Body.getTransform() ---->获得Body的位置及速度,通过位置和速度能得到向量。也可以通过vals来简便获得
Body X轴的方向向量:
Vector2 d=new Vector2(Body.getTransform().vals[2],Body.getTransform().vals[3]);
Body Y轴的方向向量:
Vector2 d=new Vector2(Body.getTransform().vals[4],Body.getTransform().vals[5]);
public static double MAX_STEER_ANGLE = Math.PI/3; //最大扭矩public static float STEER_SPEED = 1.5f; //转向速度public static float HORSEPOWERS = 20f; //马力public float engineSpeed;public double steeringAngle;场景循环:(Update)//前进sideXR = (float)myCar.getRightTopBody().getTransform().vals[4];sideYR = (float)myCar.getRightTopBody().getTransform().vals[5];Vector2 rdirection=new Vector2(sideXR,sideYR); //获得右前胎Y轴的方向向量rdirection.mul(engineSpeed); //方向向量*动力=作用力sideXL = (float)myCar.getLeftTopBody().getTransform().vals[4];sideYL = (float)myCar.getLeftTopBody().getTransform().vals[5];Vector2 ldirection=new Vector2(sideXL,sideYL); //获得左前胎Y轴的方向向量ldirection.mul(engineSpeed);//方向向量*动力=作用力myCar.getRightTopBody().applyForce(ldirection, myCar.getRightTopBody().getPosition()); //施加右前胎作用力myCar.getLeftTopBody().applyForce(rdirection, myCar.getLeftTopBody().getPosition());//施加左前胎作用力//转向float mspeed;mspeed=(float)(steeringAngle-myCar.getmJointRightTop().getJointAngle()); //获得转向扭矩力myCar.getmJointRightTop().setMotorSpeed(mspeed * STEER_SPEED);//施加转向扭矩力mspeed=(float)(steeringAngle-myCar.getmJointLeftTop().getJointAngle());myCar.getmJointLeftTop().setMotorSpeed(mspeed * STEER_SPEED);
6. 创建前进与转向按钮:
前进:
engineSpeed=-CarManager.getInstance().HORSEPOWERS;
转向:(右转)
steeringAngle=-CarManager.getInstance().MAX_STEER_ANGLE;
释放以后:
engineSpeed=0;
steeringAngle=0;
最后附上项目的demo供参考:
下载地址:http://pan.baidu.com/s/1jGkJbdc
0 0
- #Andengine##Box2D#-----前轮驱动赛车
- andengine、box2d错误:java.lang.NoClassDefFoundError: org.andengine.extension.physics.box2d.PhysicsWorld
- [AndEngine学习教程] 第10节 box2D 物理碰撞系统
- [AndEngine学习教程] 第10节 box2D 物理碰撞系统
- Andengine 学习系列5-使用物理系统BOX2D
- (转)Andengine 学习系列5-使用物理系统BOX2D
- AndEngine学习笔记10-Physics(andengine中使用Box2D的PhysicsWorld介绍)
- 赛车
- 赛车
- 赛车
- Andengine
- andengine
- andengine中使用box2D后对entity进行初始速度设定
- andengine游戏引擎实用篇-box2d与瓦片地图的结合使用
- Box2D
- Box2D
- box2d
- box2d
- xen 添加网卡设备初步分析之 network-attach 流程分析
- 高级编程简略笔记
- java关于SSH解释
- com中CComBSTR 的利弊
- Config文件详解
- #Andengine##Box2D#-----前轮驱动赛车
- 字符集和字符编码(Charset & Encoding)
- poj 2411 && zoj 1100 Mondriaan's Dream ———状态压缩dp
- mongodb笔记
- Visual Studio 程序集 详解
- PCM data flow之六:Frames & Periods
- Struts2 XML配置详解
- 疯狂的Web应用开源项目
- Java设计模式之虚拟代理模式