展会信息港展会大全

Cocos2dx3.2 Crazy Tetris 制作简单的凸多边形刚体,cocos2dx3.2tetris
来源:互联网   发布日期:2015-09-28 15:11:14   浏览:1996次  

导读: Cocos2dx3.2 Crazy Tetris 制作简单的凸多边形刚体,cocos2dx3.2tetris 现在我们要考虑的,就是如何为游戏中的方块添加刚体。 对于俄罗斯方块,我们可以知道,...

Cocos2dx3.2 Crazy Tetris 制作简单的凸多边形刚体,cocos2dx3.2tetris

现在我们要考虑的,就是如何为游戏中的方块添加刚体。

对于俄罗斯方块,我们可以知道,有以下几种方块:

这种我称之为块(block)型

这种我称之为直线(line)型

这种我称之为凸字(bulge)型

这种我称之为正-L(positive_L)型

这种我称之为反-L(negative_L)型

这种我称之为正-Z(positive_Z)型

这种我称之为反-Z(negative_Z)型

总之,方块就是这几种,现在主要问题就是为他们每一个添加刚体。一开始我直接利用PhysicsBody的静态创建方法createPolygon去创建多边形刚体,但是却报错,然后了解到这个只能创建凸多边形。而上面几种方块中,只有block和line是凸多边形,其他的都是凹多边形。(凸多边形的定义可以百度之,简单说就是没有一个内角超过180度)

因此,必须想办法用凸多边形拼凑出各个方块,我的解决方法是用形状(shape)来组成这个PhysicsBody,而每一个shape,就如上图中的小正方形一样。如下(附带说明自定义方块类BaseBlock的思路):

首先,在头文件中声明变量:

private:

int shapeAmount;//物体中包含的shape数量

std::vector<cocos2d::Vec2 *> * shapeVecs;//shape的顶点集

std::vector<int> * shapeVecAmount;//每个shape的顶点个数

cocos2d::Color4B color;//图形颜色

这些变量的含义在注释中已经说明。其中,shape的顶点集是一个由Vec2(二维向量,可以看成一个点的结构体)组成的vector,因为Vec2其实就是一个简单的点的数组指针,因此定义了一个与之对应的vector<int>来存储每个shape的点的个数。(这里考虑到后面可能会进行裁剪,点个数不一定只有4个)

然后,就是声明并且定义初始化方块的函数:

void initForm(std::vector<cocos2d::Vec2 *> * shapeVecs, std::vector<int> * shapeVecAmount, int shapeAmount, cocos2d::Color4B color);

在函数中,只要:

auto body = PhysicsBody::create();

for(int i=0; i<shapeAmount; i++)

{

auto shape = PhysicsShapePolygon::create(shapeVecs->at(i), shapeVecAmount->at(i));

shape->setRestitution(0.5);

body->addShape(shape);

}

this->setPhysicsBody(body);

即可。

最后就是在GameView中调用该函数时,需要方块的顶点数据(此时以该图形的中心点为(0, 0)):

//添加方块

BaseBlock * GameView::addCubeBlock()

{

Vec2 * form1 = new Vec2[4];

Vec2 * form2 = new Vec2[4];

Vec2 * form3 = new Vec2[4];

Vec2 * form4 = new Vec2[4];

std::vector<Vec2 *> * vec = new std::vector<Vec2 *>[4];

std::vector<int> *vecNumber = new std::vector<int>[4];

form1[0].setPoint(-25.0f, -25.0f); form1[1].setPoint(-25.0f, 0.0f); form1[2].setPoint(0.0f, 0.0f); form1[3].setPoint(0.0f, -25.0f);

form2[0].setPoint(-25.0f, -0.0f); form2[1].setPoint(-25.0f, 25.0f); form2[2].setPoint(0.0f, 25.0f); form2[3].setPoint(0.0f, 0.0f);

form3[0].setPoint(0.0f, 0.0f); form3[1].setPoint(0.0f, 25.0f); form3[2].setPoint(25.0f, 25.0f); form3[3].setPoint(25.0f, 0.0f);

form4[0].setPoint(0.0f, -25.0f); form4[1].setPoint(0.0f, 0.0f); form4[2].setPoint(25.0f, 0.0f); form4[3].setPoint(25.0f, -25.0f);

vec->push_back(form1); vec->push_back(form2); vec->push_back(form3); vec->push_back(form4);

vecNumber->push_back(4); vecNumber->push_back(4); vecNumber->push_back(4); vecNumber->push_back(4);

auto sprite = BaseBlock::create("Img/block/cube.png");

sprite->initForm(vec, vecNumber, 4);

sprite->setTag(1);

sprite->setVertexRect(Rect(0, 0, 50, 50));

// this->addChild(sprite);

return sprite;

}

更完善一些可以将数据存储到资源文件中,然后统一封装加载方块的方法。

开启PhysicsWorld::DEBUGDRAW_ALL测试模式,运行效果如下:

关于制作游戏相关其他博客的目录,我放在利用Cocos2dx3.2制作重力版俄罗斯方块(Crazy

Tetris)

http://www.bkjia.com/Androidjc/921621.htmlwww.bkjia.comtruehttp://www.bkjia.com/Androidjc/921621.htmlTechArticleCocos2dx3.2 Crazy Tetris 制作简单的凸多边形刚体,cocos2dx3.2tetris 现在我们要考虑的,就是如何为游戏中的方块添加刚体。 对于俄罗斯方块,我...

赞助本站

人工智能实验室

相关热词: android开发 应用开发

AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港