之前都是球!一个充满了球的世界!悲催········

在box2d中为我们提供的shape就只有球和多边形!

shape是为我们的body提供形状的,虽然不能决定其外表如何!但已经奠定了其内在基础!再整容业真实的触碰范围也就那么大!至于外观!后面会说到!

box2d把body叫刚体,就是永不变形的身体!假设他可以承受所有外力而不变形!我们可以认为他是硬邦邦的石头!只有两个基础shape一个圆一个多边形!所以我们创建复杂的刚体的时候大多要基于多变形!他为我们提供了SetAsArray方法我们就可以有人一多顶点只需要按顺时针方向依次顺序排列好的数组传给进去!就可以了!

官方要求是这么传的!为什么必须这么传你懂得!他要不顺序乱交叉出来的不一定是什么形状!你自己可以再canvas上每画一根线fill依次!画个方别按顺序来!

所以在box2d的世界只能够支持凸形状不支持凹形状!为什么?和上面一样!他总得closePath才能fill,所以总是凸的!

通常我们需要画复杂的形状或者凹形状的办法是用多个凸的形状是有joint连接起来!组成一个(看似一个)shape

代码如下:

Your browser does not support the canvas element.
var _container;
    createContainer();
    function createContainer()
    {
        var shapeCoords = [
            [[61,55],[77,67],[39,135],[23,124]],
            [[23,124],[39,135],[25,220],[6,218]],
            [[6,218],[25,220],[44,305],[28,312]],
            [[28,312],[44,305],[94,372],[82,384]],
            [[82,384],[94,372],[167,413],[161,425]],
            [[161,425],[167,413],[250,424],[250,437]],
            [[250,438],[250,424],[339,416],[341,429]],
            
            [[341,430],[339,416],[411,383],[418,393]],
            [[418,393],[411,383],[464,327],[478,334]],
            [[478,334],[464,327],[489,254],[504,252]],
            [[504,252],[489,254],[488,183],[504,177]],
            [[504,177],[488,183],[470,112],[488,103]],
            [[488,103],[470,112],[443,66],[465,63]],
            [[77,67],[72,46],[436,43],[443,66]]
        ];
        //创建一个刚体定义
        var bodyDef = new b2BodyDef();
        bodyDef.type = b2Body.b2_staticBody;
        bodyDef.position.Set(-8 / drawScale, -50/drawScale);
        //创建刚体
        _container = world.CreateBody(bodyDef);
        //为刚体创建修饰物
        //传递顶点数组作为参数
        createFixtrues(shapeCoords);
    };
    //创建Fixtures
    //根据顶点数组的第一维度,创建多个Fixture
    function createFixtrues(coords)
    {
        for(var i = 0; i<coords.length; i++)
        {
            var shape = new b2PolygonShape();
            //调用创建顶点方法,将数组的第二维度作为参数
            //返回一个顶点数组,用于创建shape
            var shapeVertices = createVerticesArray(coords[i]);
            shape.SetAsArray(shapeVertices);
            var shapeFixtureDef = new b2FixtureDef();
            shapeFixtureDef.shape = shape;
            shapeFixtureDef.density = 1;
            shapeFixtureDef.restitution = 1.0;
            _container.CreateFixture(shapeFixtureDef);
        }
    };
    
    //创建顶点数组
    function createVerticesArray(coords)
    {
        //不能少于三个顶点
        if(coords.length < 3)
        {
            throw new Error("Shape create wrong");
        }
        var vertices = new Array();
        //遍历顶点数组的第二维度,生成b2Vec2数组
        for (var i = 0; i<coords.length ; i++)
        {
            var vertice = new b2Vec2(coords[i][0]/drawScale, coords[i][1]/drawScale);
            vertices.push(vertice);
        }
        
        return vertices;
     };  
     

看着那一堆数组有没有很恶心!我看着他也很恶心!

其实主要是获取这些点的问题!

如果这些点我们直接用鼠标画是不是爽多了!至少我认为之这样!So..........

我们用点击一次确定一个点,第二次确定另外一个点,并且把前一个点和这个点连接形成一个shape !

Your browser does not support the canvas element.

您老自己只要把口封好了,closePath,拿着vec里面这些point!那不是想画什么,是什么吗!

但是记得吧坐标系转换成物理坐标系

canvas.onclick = function(e){

vec.push(new Point(e.offsetX,e.offsetY));
        if(vec.length>1){
            context.strokeStyle = "#ffffff";
            context.beginPath();
            context.moveTo(vec[0].x,vec[0].y);
            for(var i=1;i<vec.length;i++)
                context.lineTo(vec[i].x,vec[i].y);
            context.stroke();
        }
    }

function Point(_x,_y){this.x = _x;this.y = _y};

看了这么就debugdraw,也该添加以下外观了!放哪儿呢!其实爱放哪儿放哪!因为这个外观其实和box2d没多大关系!

你放哪自己指导就行!通常放body的userdata或者fixture的userdata!或者把body对象持有给你自己的对象!

为什么说外观和box2d没有关系!因为外观是什么样他不关心!他也不会管理!需要我们自己同步外观得坐标以及角度!另外即使fixturedef的shape是圆形你给一个方形也没人管!

他也就依旧这个走着!

其实这也是显示和逻辑分离的一个应用吧!

上面那个只有小球是动的,那个容器不动都是静态也可以给他一个对象就装着图片,但是意义不大所以就直接给摆张img吧!我们主要同步小球的皮肤!

给小球创建外观!并且同步所以先建一个小球类吧!

function Ball(r){

this.x;this.y;this.r=r;this.body;
     this.draw = function(context){
        this.x = this.body.GetPosition().x * drawScale;
        this.y = this.body.GetPosition().y * drawScale;
    var my_gradient= context.createRadialGradient(this.x,this.y,this.r/4, this.x,this.y,this.r*2);
     my_gradient.addColorStop(0, "#FAACBD");   
     my_gradient.addColorStop(1, "#772777");         
     context.save(); 
        context.fillStyle = "#ABDFCD";
        context.beginPath();
        context.arc(this.x,this.y,this.r,0,Math.PI/180*360,true);
        context.closePath();
        context.stroke();
        context.fill();
        context.restore();
    };
};

定义好之后再创建小球body的时候把小球的body传给ball.body就ok了!在update方法里ball.draw()就ok了!

这样小球就会跟据body的position更新自己的位置,当然还是坐标转换注意下!

function update(){

var timeStep = 1/60;
    world.Step(timeStep,10,10);
    world.ClearForces();
    world.DrawDebugData();
    ball.draw(context);
};

现在呢是一个小球要是多个小球呢!也是一样的!放进数组里!写一方法一起同步了

或者写一个统一的父类必须包含body属性和draw方法,然后其他显示对象继承他!body.GetNext()遍历所有body判断是这个类型的,统一调用draw方法!

或者更好的!这个就个人发挥吧!

不想看见debugDraw的!你懂得!world.DrawDebugData();注掉

转载于:https://www.cnblogs.com/Just-go/archive/2012/03/13/2393475.html

Box2DWeb_03之Shape相关推荐

  1. tf.shape()

    tf.shape tf.shape( input, name=None, out_type=tf.int32 ) 1 2 3 4 5 例如: 将矩阵的维度输出为一个维度矩阵 import tensor ...

  2. AICompiler动态shape编译框架

    AICompiler动态shape编译框架 移动互联网的兴起,不仅产生了海量数据,也对人机交互有了新的定义.企业如何动态处理不同规格图片数据,如何更灵活处理不同长度的对话语料等等,提升企业运营效率,争 ...

  3. HarmonyOS shape 的使用

    HarmonyOS shape 吐槽 在说这个shape使用之前先吐槽一下,好像目前版本对shape 总感觉很别扭,因为shape画好之后无法直接看到效果,只能回到布局中才能看到效果,所以大家在使用s ...

  4. Android shape 绘制左右 或者上下的渐变色

    shape 绘制的渐变色使用的 gradient 默认是从左向右的方向绘制的 比如 <?xml version="1.0" encoding="utf-8" ...

  5. Android Shape 的使用

    学而时习,温故而知新. 今天复习shape 画各种常见类型的背景图 使用: 当在 java 代码R.drawable.文件的名称 当在布局中时 android:background="@dr ...

  6. PyTorch 笔记(04)— Tensor 属性方法(获取元素个数numel/neleme、查看形状size()/shape、增减维度squeeze()/unsqueeze()、resize形状)

    1. 获取 Tensor 元素个数 获取 Tensor 的元素个数 ,a.numel() 等价 a.nelement() In [1]: import torch as t In [5]: a = t ...

  7. Numpy 一维、二维数组、size/dtype/shape属性、数组函数arange/linspace/logspace /diag/zeros/ones/random 、多维数组索引和筛选)

    参考: https://gitbook.cn/gitchat/column/undefined/topic/5e3bceadec8d9033cf924665 打开 IPython ,创建 Python ...

  8. android 背景切换动画效果代码,关于Android shape gradient背景渐变

    百度后,发现渐变色不仅可以根据xml来实现,也可以用java代码来实现,由于目前没有那么多时间,只记录xml实现的方法:以后在记录Java实现的代码. 通过Shape gradient标签来实现 首先 ...

  9. maya表情blendshape_Maya的形状融合变形器Blend Shape | 学步园

    Maya的形状融合变形器Blend Shape是制作面部表情动画的有力武器,它能通过使用一系列的目标形状物体(Target)使基础物体得到非常平顺.高精度的变形效果.它在角色动画的时候非常受用,尤其是 ...

最新文章

  1. ubuntu vsftp安装
  2. Another Rejection from University of Oxford MRes in Engineering
  3. 数据结构(5) -- 图
  4. robotframework(12)修改用户密码(从数据库查询短信验证码)
  5. 05Prism WPF 入门实战 - Navigation
  6. kotlin 二进制_Kotlin程序检查数字是否为二进制
  7. React之事件处理
  8. 最近病毒缠身,帖两个病毒的解决方法.
  9. 面向对象设计模式与原则
  10. mapxtreme 更改图元的位置
  11. 日记侠:我为什么学习网络营销
  12. 服务器如何安装center os7系统,center os 7安装教程
  13. obs摄像头模糊_OBS录制视频画面很糊,不清晰,怎么调整设置?
  14. 「经济理财」 简七理财之小白理财入门篇9堂课
  15. dBm 转 W 换算
  16. HCNP-Cloud云计算认证
  17. java this逃逸_java 中的 this 逃逸
  18. 三星S8原生android8.0,三星S8惧怕的全面屏机皇杀到,原生安卓8.0系统
  19. Apple MFi认证是什么意思?
  20. 制作openstack离线 yum 源

热门文章

  1. 俯首甘为孺子牛上一句是什么
  2. 实体与电商,有啥区别?
  3. 微信小程序为什么会成为了实体店“上线”的最优选择?
  4. 要想完全放弃Windows使用Linux需要多少勇气?
  5. UEFI---(NT32)的第一个代码
  6. iPhone 7 P适合什么系统?
  7. Qt——P1 创建第一个Qt程序
  8. TCP/PI参考模型(应用层、传输层、网际层、网络接口层)、五层参考模型(应用层、传输层、网络层、数据链路层、物理层)、OSI与TCP/IP参考模型比较...
  9. 学习SQL:SQL Server数据透视表
  10. azure云数据库_使用Azure SQL数据库构建ASP.NET应用