教你使用Box2d制作用蜡笔手绘物体的效果(一)

news/2024/7/20 22:29:23 标签: IOS, box2d, 刚体, 手绘


首先推荐一款好玩儿的物理益智游戏“CrayonPhysics”,中文名叫“蜡笔物理学”(当然不是做广告哈哈),游戏中我们通过手工绘制各种各样的“物体”来让一个红色的小球吃掉星星。整个游戏都是蜡笔画的风格,手绘物体的游戏体验非常棒。下面是游戏的截图:


如果你喜欢这类清新的益智游戏,可以下载玩一玩,以便对我们这个教程有更好的理解。好了,我们言归正传,开始使用Box2d来制作这种手绘蜡笔风的刚体

为了避免篇幅过于冗长,我把教程分成了两部分,前一部分我们来制作手绘刚体的效果,后一部分我们为刚体添加上蜡笔的纹理效果。

首先,我们以cocos2d iOS withBox2d为模板创建Box2d工程(本文使用的是Box2d2.3.1版本),默认Box2d的demo工程会实现ccTouchesBegan方法,当我们点击屏幕任何地方的时候会向场景中添加盒子对象。我们将这部分代码注释掉,另外再将初始化函数中添加menu的方法也都给注释掉(如果你觉得还有什么别的代码碍事的话,一并都给注释掉就好了),留下一个空白的(或者说全黑的)场景供我们开发即可。

我们首先来实现记录绘制路径以及将绘制的路径显示在屏幕上的代码,这部分的实现方法请参考Box2d中使用开源的PRKit库来制作任意形状的多边形刚体的纹理

接着我们利用取样取到的节点来创建刚体

我们在HelloWorldLayer中添加下面的方法:

-(void) createPathPolygon {

    CGPoint start =[pathVertexes[0] CGPointValue];   //路径起点

    b2BodyDef bodyDef;

    bodyDef.type =b2_dynamicBody;

    bodyDef.position = [selftoVec2:start];   //以路径起点为定义物体位置

    b2Body* body =world->CreateBody(&bodyDef);   //创建物体

   

int vertexCount = [pathVertexes count];

//遍历除最后一个节点之外的所有节点

for (int i = 0; i < vertexCount - 1; i++) {

 //第i个节点为线段的起点

        CGPoint segStart =[pathVertexes[i] CGPointValue];

 //第i+1个节点为线段的终点

        CGPoint segEnd =[pathVertexes[i+1] CGPointValue];

  //线段的中点

        CGPoint center =ccpMidpoint(segStart, segEnd);

  //线段的初始角度

        float32 angle =-ccpAngleSigned(ccpSub(segEnd, segStart), ccp(1.0f, 0.0f));

 //定义一个长度等于线段长度,宽度为3px的矩形多边形

        b2PolygonShape* shape= new b2PolygonShape();

        float32 segLength =ccpDistance(segStart, segEnd) * 0.5f + 0.5f;

       shape->SetAsBox(segLength / PTM_RATIO, 3.0f / PTM_RATIO, [selftoVec2:ccpSub(center, start)], angle);

 //以我们创建的矩形为形状创建fixture(我们的刚体最终就是由一系列的小矩形组合而成的

        b2FixtureDeffixtureDef;

        fixtureDef.density =2.0f;

        fixtureDef.friction =0.3f;

        fixtureDef.shape =shape;

       body->CreateFixture(&fixtureDef);

    }

}

定义好之后,我们在ccTouchEnded方法中添加调用:

-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {

    if ([pathVertexes count]> 1) {

        [selfcreatePathPolygon];

    }

   

    [pathVertexesremoveAllObjects];

}

当定点数大于1的时候(至少要有两个顶点才能组成一条线段),沿路径创建刚体,运行效果如下:


这里我们设置的取样长度为10,如果觉得不够细腻,可以再减小取样长度,越小的取样长度得到的效果就越细腻,但是创建出来的物体也就会越复杂,资源消耗就会更多。

这里总结下大体的思路,我们在创建的时候绘制一条路径,然后在路径上相邻的节点之间创建一个矩形,将所有的矩形首尾相连就得到了绘制的刚体

接着我们在HelloWorldLayer中再添加一个方法:

-(void) createSmallCircleAtPosition:(CGPoint) position {

    b2BodyDef bodyDef;

    bodyDef.type =b2_staticBody;

    bodyDef.position = [selftoVec2:position];

    b2Body* body =world->CreateBody(&bodyDef);

   

    b2CircleShape shape;

    shape.m_radius = 0.1f;

   

    b2FixtureDef fixtureDef;

    fixtureDef.shape =&shape;

    fixtureDef.friction =0.4f;

   body->CreateFixture(&fixtureDef);

}

这个方法比较简单,创建一个圆形的,半径为0.1米的静态刚体

接着我们修改一下ccTouchEnded方法:

-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {

    if ([pathVertexes count]> 1) {

        [selfcreatePathPolygon];

    } else {

        CGPoint location =[[CCDirector sharedDirector] convertToGL:[touch locationInView:[touch view]]];

        [selfcreateSmallCircleAtPosition:location];

    }

   

    [pathVertexesremoveAllObjects];

}

即如果我们在屏幕上点击而不是绘制路径的话,那么会创建一个固定的圆形物体,再来做一下测试:


可以看到可以通过简单的组合实现钟摆效果,增加了很多的趣味性~

好了这样我们就完成了第一部分的工作,下一篇中我们来实现蜡笔纹理的制作。



http://www.niftyadmin.cn/n/878449.html

相关文章

免费45天WPS稻壳会员领取

昨天在微信公众号“十点神器”分享了一个WPS专业版的永久密钥和使用方法&#xff0c;想到大家可能有需求使用稻壳会员&#xff0c;今天就找了一下一些免费的稻壳会员&#xff0c;还真的找到了一个45天的免费稻壳会员领取链接&#xff0c;好东西当然要分享。 稻壳会员能干啥&am…

栅格图像 转_这项AI图像描摹,90%的人都不知道!学会就是出图大佬

我们在寻找场地信息时&#xff0c;经常会找到一些专项地图&#xff0c;但是其非矢量的性质导致我们无法对其编辑&#xff1b;有时候从地图网站中下载地图&#xff0c;下载的图标和图像均无法更改&#xff0c;今天就告诉大家一个非矢量图像转矢量的方法。可能有的同学已经知道图…

教你使用Box2d制作用蜡笔手绘物体的效果(二)

&#xfeff;&#xfeff;我们继续来制作蜡笔手绘物体的效果。上一篇中我们完成了刚体绘制&#xff0c;这一部分我们来完成蜡笔纹理。 先来看一下最终的效果&#xff1a; &#xff08;如果觉得蜡笔的纹理不够好的话&#xff0c;可以精加工一个自己的蜡笔纹理&#xff09; 下面…

8 无法识别raid盘_车辆识别系统!开源可自取

今天&#xff0c;介绍一款车牌识别开源系统- yx-image-recognition&#xff0c;大伙需要的可以收藏哈&#xff01;&#xff01;&#xff01;gitee开源地址&#xff1a;https://gitee.com/admin_yu/yx-image-recognitionspring boot maven实现的车牌识别系统基于Opencv实现、在…

使用b2MouseJoint实现鼠标拖拽刚体的效果

&#xfeff;&#xfeff;要在Box2d中实现鼠标拖拽效果&#xff08;当然在移动设备上就不是鼠标拖拽而是手指拖拽了&#xff09;&#xff0c;可以使用Box2d中定义的b2MouseJoint来制作。大体思路是&#xff0c;首先在ccTouchBegan事件中获取鼠标&#xff08;以下不再区分鼠标或…

切换白屏_min-width 问题,el-collpase-transition 动画,组件切换白屏问题总结

min-width 可以解决什么问题今天碰到一个问题&#xff1a;当我使用 flex 布局&#xff0c;一行显示多个时&#xff0c;当我屏幕缩小的时候&#xff0c;发现文字会掉下来&#xff0c;如果我们给最外层的 div 加上最小宽度&#xff0c;这样他就不会掉下来了1、正常情况下&#xf…

免费好用的划词搜题神器插件

年初疫情爆发至今&#xff0c;可能不少家长头疼坏了-因为小孩的教育突然成了家长们巨大的烦恼&#xff0c;面对漫天飞的试题和教辅&#xff0c;不知道多少家长疲于应付&#xff0c;今天分享一个可以在浏览器中进行划词搜题的插件&#xff0c;不光可以一定程度上缓解家长们的教育…

Box2d中使用b2Separate开源代码创建凹多边形及其算法分析

&#xfeff;&#xfeff;我们知道&#xff0c;在Box2d中默认只能创建凸多边形&#xff0c;如果我们定义的顶点不小心形成了一个凹多边形&#xff0c;那么凹面部分的法线会存在问题&#xff0c;并且在物理模拟的时候会有问题&#xff08;比如检测不到碰撞等等&#xff09;。 要…