• Android基于box2d开发弹弓类游戏[三]创建游戏世界


    前一章中,我们创建了游街场景,这一章中,我们开始最重要的一章,创建游戏世界,期待已久的box2d物理引擎也要登场了!

    六.创建游戏世界

    之前所做的,都是在游戏场景中画出一些静态图片。不能多物理场景进行模拟。接下来就要创建一个模拟的世界。我们的游戏就将在这个世界中进行模拟。在创建游戏世界之前要确定已经引入了最新版本的jbox2d。 但前jbox2d的最新版本为2.1.2。接下来的代码都是针对2.1.2进行开发的。

    1.     模拟世界

    需要添加一些变量

    //添加一个世界需要的变量--->>>
        private final float RATE = 30; //屏幕到现实世界的比例 30px:1m;为了能够真实的模拟现实世界,在jbox2d中,所有的单位都是以米为标准的。所以需要设定一个屏幕到现实世界的比例。在屏幕中30像素代表现实世界中的1米。
        private World world; //物理世界
        private Vec2 gravity;// 声明一个重力向量对象
        private float timeStep = 1f / 60f;// 物理世界模拟的的频率
        private int iterations = 10;// 迭代值,迭代越大模拟越精确,但性能越低
     
    然后再MainView构造方法中对变量进行初始化。
    // --添加一个物理世界--->>
        gravity = new Vec2(0f, 10f); // 模拟显示世界的重力 横向重力为0,纵向重力为10
        world = new World(gravity, true); // 为游戏世界添加重力,并且使世界处于睡眠状态,当物体进行改变时,在唤醒世界。这样可以很好的节省系统资源。

    通过以上的代码,已经模拟出了一个游戏世界。

    2.     在世界中创建物体

    游戏世界是由各种各样的物体组成的,下面介绍如何创建一个物体。分为以下六步。

    • 设置形状
    • 创建夹具
    • 为夹具绑定形状
    • 创建刚体
    • 通过刚体在世界中创建物体
    • 为物体绑定夹具

    下面介绍一些刚体。以下是百度百科的解释:在任何力的作用下,体积和形状都不发生改变的物体叫做刚体(Rigid body)。在物理学内,理想的刚体是一个固体的,尺寸值有限的,形变情况可以被忽略的物体。不论有否受力,在刚体内任意两点的距离都不会改变。在运动中,刚体上任意一条直线在各个时刻的位置都保持平行。

    下面创建一个方法CreateFloorBody()。用来创建地面。

    3.     创建大地

    此时已经创建了世界。但是这个世界是无限延伸的,为了更好的模拟现实世界。接下来需要为这个世界添加大地。

    四个参数分别为:x轴位置,y轴位置,宽度,高度

    public Body createBorderBody(float x,float y,float width,float height)    {
       
        PolygonShape ps = new PolygonShape();//创建形状
        ps.setAsBox(width/2/RATE, height/2/RATE);//形状为一个矩形
       
        FixtureDef fd = new FixtureDef();//创建夹具
        fd.shape = ps;//为夹具绑定形状
        fd.density = 0;//设置密度,当密度为0时,这个物体为静止状态。
        fd.friction = 0.8f;//设置摩擦力
        fd.restitution = 0.3f;//设置恢复力
       
        BodyDef bd = new BodyDef();//创建刚体
        bd.position.set((x+width/2)/RATE, (y+height/2)/RATE);//创建刚体范围
        bd.type = BodyType.STATIC;//设置刚体类型,设置为静态刚体
       
        Body body = world.createBody(bd);//创建物体并制定刚体
        body.createFixture(fd);//为物体制定夹具
       
        return body;
     }

    方法有了,接下来就要定义地面变量

    private Body floorBody;

    surfaceCreated方法中创建floorBody物体

    floorBody = CreateFloorBody(0, ScreenH-FLOOR_HEIGHT, gameWidth, FLOOR_HEIGHT);

    此时第一个物体创建完成。有了大地,模拟的世界就更加真实了。此时运行环境还不能看出任何效果。但是,我们的游戏世界确确实实的存在了。

    不要着急,我们会在下一章节中创建世界中的物体----》发射器。

     

     

     

     

     

  • 相关阅读:
    P2197 nim游戏
    P3942 将军令
    UVA10228 模拟退火
    关于欧拉定理的证明以及扩展欧拉定理的证明及其应用
    秒杀架构模型设计
    大型网站如何防止崩溃,解决高并发带来的问题
    序列化与反序列号
    普通常用知识汇总
    接口和抽象类的区别
    详解C#break ,continue, return
  • 原文地址:https://www.cnblogs.com/81du/p/2797993.html
Copyright © 2020-2023  润新知