一个永远反弹的球

这次我们以一个打砖块小游戏展开学习。首先,在上篇的基础上我们做出调整。

world = new World(new Vector2(0, 0f), true);

我们把重力设置为0,因为该游戏中并不需要重力。

        EdgeShape edge = new EdgeShape();FixtureDef boxShapeDef = new FixtureDef();boxShapeDef.shape = edge;edge.set(new Vector2(0f, 0f), new Vector2(48f, 0f));groundBody.createFixture(boxShapeDef);edge.set(new Vector2(0f, 0f), new Vector2(0f, 80f));groundBody.createFixture(boxShapeDef);edge.set(new Vector2(48f, 0f), new Vector2(48f, 80f));groundBody.createFixture(boxShapeDef);edge.set(new Vector2(48f, 80f), new Vector2(0f, 80f));groundBody.createFixture(boxShapeDef);

创建四面墙

        // Create ball body and shapeBodyDef ballBodyDef = new BodyDef();ballBodyDef.type = BodyType.DynamicBody;ballBodyDef.position.set(24f, 60f);body = world.createBody(ballBodyDef);body.setUserData("ball");CircleShape circle = new CircleShape();circle.setRadius(2f);FixtureDef ballShapeDef = new FixtureDef();ballShapeDef.shape = circle;
        ballShapeDef.density = 1.0f;ballShapeDef.friction = 0f;ballShapeDef.restitution = 1.0f;body.createFixture(ballShapeDef);

调整球的摩擦力和恢复力。

把回复力restitution设置为1,这意味着,我们的球在碰撞的时候,将会是完全弹性碰撞。

把摩擦力friction设置为0,这防止球在碰撞的时候,由于摩擦损失能量,导致来回碰撞的过程中会有一点点偏差。

Vector2 force = new Vector2(500f, 500f);
body.applyLinearImpulse(force, ballBodyDef.position);

我们再给物体加上一个冲力,使它运动起来,力的大小可以自己调整。

加一块砖

        BodyDef paddleBodyDef = new BodyDef();paddleBodyDef.type = BodyType.DynamicBody;paddleBodyDef.position.set(STAGE_W / 2, 10f);paddle = world.createBody(paddleBodyDef);PolygonShape paddleShape = new PolygonShape();paddleShape.setAsBox(8f, 2f);FixtureDef paddleShapeDef = new FixtureDef();paddleShapeDef.shape = paddleShape;
        paddleShapeDef.density = 10f;paddleShapeDef.friction = 0.4f;paddleShapeDef.restitution = 0.1f;paddle.createFixture(paddleShapeDef);

砖块为长方形,所以这里我们使用了PolygonShape多边形图形。砖块比小球重,所以这里将其密度改为10。适当调整摩擦力和恢复力。

为了方便起见,我们还是使用测试渲染器Box2DDebugRenderer。

    @Overridepublic void draw() {Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);world.step(Gdx.app.getGraphics().getDeltaTime(), 8, 8);renderer.render(world, camera.combined);super.draw();}

来看看效果吧,球与砖块进行了猛烈的碰撞。

移动砖块

球有了,砖块有了,但是他们都不受我们控制。下面要做的是在砖块的身上加上一个力,这个力是通过“鼠标关节”实现的。

什么是鼠标关节? 

鼠标关节用于通过鼠标(对于手机来说,就是您的手指)来操控物体。它试图将物体拖向当前鼠标光标的位置。而在旋转方面就没有限制。

鼠标关节的定义需要一个目标点(target point),最大力(maximum force),频率(frequency),阻尼率(damping ratio)。目标点最开始与物体的锚点重合。最大力用于防止在多个动态物体相互作用时,会有激烈反应。你想将最大力设为多大就多大。频率和阻尼率用于创造一种弹性效果。

PS:可能有些难以理解,其实他们就是一些参数,为何不自己测试下,看看效果呢。

1.我们首先需要调整下上面砖块声明的代码。因为我们需要控制砖块,所以这里先赋值一个变量来方便今后的使用。

fixPaddle = paddle.createFixture(paddleShapeDef);

2.覆盖touchDown方法

    @Overridepublic boolean touchDown(int x, int y, int pointer, int button) {//mouseJoint是个变量,只有它失效了才去重新生成if (mouseJoint == null) {//这里将真实世界的坐标转换为游戏内的坐标//注意libgdx的坐标系以屏幕左下角为(0,0)float yy = STAGE_H - (y / RATIO); float xx = x / RATIO;//首先判断当前触点是否在砖块范围内if (fixPaddle.testPoint(xx, yy)) {//我们来定义一个鼠标关节的声明MouseJointDef mouseJointDef = new MouseJointDef();mouseJointDef.bodyA = groundBody;//设为物理世界的边界mouseJointDef.bodyB = paddle;//我们想要拖动的物体//是否检测2个物体间的碰撞,不检测会怎么样?砖块会飞离屏幕!mouseJointDef.collideConnected = true;//最大力设为砖块质量的1000倍//设小点会怎么样?砖块响应你的速度会很慢很慢mouseJointDef.maxForce = 1000.0f * paddle.getMass();//好了,让世界生成它吧mouseJoint = (MouseJoint) world.createJoint(mouseJointDef);//传入目的地坐标mouseJoint.setTarget(new Vector2(x, STAGE_H - y));}}return super.touchDown(x, y, pointer, button);}

3.覆盖touchDragged方法

    @Overridepublic boolean touchDragged(int x, int y, int p) {if (mouseJoint != null) {//更新目的地坐标mouseJoint.setTarget(new Vector2(x, STAGE_H - y));}return super.touchDragged(x, y, p);}

4.覆盖touchUp方法

    @Overridepublic boolean touchUp(int x, int y, int pointer, int button) {if (mouseJoint != null) {//当触角离开屏幕时,销毁关节
            world.destroyJoint(mouseJoint);mouseJoint = null;}return super.touchUp(x, y, pointer, button);}

限制砖块的移动

我们现在虽然可以移动砖块了,但是移动的过于随意了。打砖块游戏只是水平的移动。所以我们还需要在砖块上加一个束缚!

这就是移动关节(prismatic joint),它允许两个物体沿指定轴相对移动,它会阻止相对旋转。因此,移动关节只有 一个自由度。

        //声明移动关节的定义PrismaticJointDef prismaticJointDef = new PrismaticJointDef();//设置一个约束向量,只能沿着x轴移动Vector2 axis = new Vector2(1f, 0f);//碰撞监测prismaticJointDef.collideConnected = true;//初始化移动关节的定义
        prismaticJointDef.initialize(groundBody, paddle,paddle.getWorldCenter(), axis);//生成移动关节的定义world.createJoint(prismaticJointDef);

运行后我们会发现如果用力的拖动砖块去碰撞小球的话,小球的速度会变得非常快!所以,我们还需要进行一下调整。

    public void draw() {//获得小球的当前速度Vector2 velocity = ball.getLinearVelocity();float speed = velocity.len();//当大于某一个值时,我们设置它的阻尼,来起到减速的效果,具体数值自行调整if (speed > 100f) {ball.setLinearDamping(0.1f);} else if (speed < 100f) {ball.setLinearDamping(0f);}......}

到这里,我们结束第一部分。

源码下载

https://github.com/dwintercode/Box2D.git

Box2D例子——打砖块相关推荐

  1. python box2d例子_box2dpython教程

    box2dpython教程内容摘要 box2dpython教程吃教程,希望下次购买时可以注意一下.希望我用了越来越白,ug注塑模具设计教程,希望我如果的回答能帮知道您.希望我妈妈早日能摆脱疼.威海一建 ...

  2. iphone开发每日一练【2011-10-11】

    为啥gamecenter在沙箱里好使,在正式环境中分数和成就都提交不了呢???? 关于cocos2D 音效失真的问题 CCGameBox问题 游戏中人物的动画效果是怎么做出来的? 双向链表 for O ...

  3. [每日100问][2011-10-11]iphone开发笔记,今天你肿了么

    [url=http://www.buildapp.net/iphone/show.asp?id=24500]为啥gamecenter在沙箱里好使,在正式环境中分数和成就都提交不了呢????[/url] ...

  4. android box2d运行小例子,配置eclipse【转】

    本文是一篇在android上使用2D物理引擎的入门教程.  2D物理引擎能增强游戏世界中物体如多边形(箱子,三角形,多边形)的动作的真实感从而提高游戏质量.这个引擎通过用户设定的参数如重力,密度,摩擦 ...

  5. GLSL着色语言学习。橙皮书第一个例子GLSL+OpenTK+F#的实现。

    Opengl红皮书有选择的看了一些,最后的讲着色语言GLSL的部分看的甚为不理解,然后找到Opengl橙皮书,然后就容易理解多了. 在前面,我们或多或少接触到Opengl的处理过程,只说前面一些处理, ...

  6. echarts中树图的label的点击_ECharts 堆积木(砖块)游戏

    最近突发奇想,用 3D 的堆叠柱图,做了一个搭积木的小游戏. 主要思路 用一个几乎透明的 series-bar3D 铺满整个 grid3D,作为操作区,监听鼠标点击事件.完成堆积木的操作: 用多层数据 ...

  7. 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法...

    为什么80%的码农都做不了架构师?>>>     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigam ...

  8. cocos2d-x初探学习笔记(20)--物理引擎box2d(2)

    小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 由于box2d的内容比较多,它也有自己的tes ...

  9. cocos2d, Box2D

    http://antkillerfarm.github.io/ 安装 cocos2d和cocos2d-x虽然都是一家的产品,但前者是用python写的,而后者是用C++写的. 我试着在windows下 ...

最新文章

  1. UpdateData函数(转)
  2. 2.10 局部最优的问题-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  3. MVVMLight绑定数据
  4. 设计模式之单例模式8种实现方式,其八:枚举方式
  5. NUAGENETWORKS第二代SDN方案推企业云服务
  6. HTML的Get方法URL传递中文参数,解决乱码问题
  7. java 匿名内部类多态,下面这个简单的程序验证匿名内部类的多态属性,但出现错误。...
  8. 2022年度成都市工程系列专业技术高级职称申报评审工作内容及所需材料
  9. 【常用模块】电容触摸按键模块(原理讲解、STM32实例操作)
  10. 一看就懂!小白就能用python爬到又大又白的图片!
  11. 写给程序员的心理学入门知识(一)
  12. slt mysql_SAP SLT操作手册 PDF 下载
  13. 第二篇第五章防火防烟分区于分隔
  14. 一台主机 两台显示器 就可以两个用户同时使用电脑
  15. Django DRF routers路由使用
  16. mysql: load data与select into outfile
  17. delphi 实现虚拟打印, 远程集中打印
  18. Design Compiler知识点汇总
  19. Kubernetes集群中部署Node节点
  20. [附源码]Nodejs计算机毕业设计基于JAVA的校园电车租赁系统Express(程序+LW)

热门文章

  1. 垃圾收集器G1与ZGC
  2. KVM虚拟化,云平台
  3. 交互体验之产品的文案
  4. 高度自律学习者的app
  5. 已知平面三点坐标求其中两条边之间的夹脚
  6. 香港中文大学计算机专业学费,香港中文大学研究生专业学费是多少?
  7. 微信jsapi支付结果回调错误Tag mismatch
  8. 山中无甲子,寒尽不知年
  9. 利用huffman编码对文本文件进行压缩与解压(java实现)
  10. 博途PLC 1200/1500PLC多段曲线控温FB(支持40段控温曲线、段曲线搜索、暂停、跳段等功能)