位置: 编程技术 - 正文

cocos2dx实现自定义2D地形(cocos2d怎么用)

编辑:rootadmin

推荐整理分享cocos2dx实现自定义2D地形(cocos2d怎么用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:cocos2d-x教程,cocos2dx实现自定义加密解密,cocos2dx实现自定义加密解密,cocos2dx官方教程,cocos2d-x教程,cocos2d-x教程,cocos2dx怎么用,cocos2dx怎么用,内容如对您有帮助,希望把文章链接给更多的朋友!

先来看看效果:

对于2D地形的生成,可以采用2种方法,

1.使用建模软件将2D的地形模型构建好直接使用Sprite3D导入

优点:不需要太多程序控制,只是简单的导入

缺点:需要建模,而且还要转换成2D坐标,很难使用chipmunk加入物理特性

2.根据自定义数据使用顶点数据和shader。

下面来讲解如何实现,之后分析优缺点。

推荐一篇博客

如何制作一个类&#;Tiny Wings的游戏 Cocos2d-x 2.1.4

如果你看懂了上面的博客,那么就跟容易理解笔者讲解的。

首先准备,图片资源

草地(地形表面) 土地(地形底部)

地形数据,其实是由许多点连成线组成的,如图

只要获取这些点就可以得到一个比较平滑的地形,如果点的间隔比较大,得到的地形就没有那么平滑,所以两个点的水平距离要根据需要设置。

由于主要讲解如何根据点生成地形,这里就不讲解如何生成这么多点,有兴趣的同学可以加

QQ:,一起讨论。

有了数据,那么应该如何生成地形呢?

我们都知道大多数3D模型是由许多点组成的(有些模型也包含曲线),这些点就组成了许多三角形,

这些三角形就组成了一个模型,给这个模型赋予贴图,就得到了一个完整的模型。

同样利用这个道理,我们可以自己构造一个2D模型。

对于上面由线段组成的曲线,如果将每一个点复制后向下平移一定的距离,就能得到

许多矩形(实际就多了一倍的顶点,目前还是点),现在就要把这些矩形拆分成三角形,

每个矩形沿对角线切割,就得到了三角形。

让我们想想opengl绘制三角形的方法,

glBegin(GL_TRIANGLES); ..... glEnd(); 这种方法又慢又费资源。

glBegin(GL_TRIANGLE_STRIP); ..... glEnd(); 这种方法比刚才的快了一点

glDrawArrays(GL_TRIANGLE_STRIP, , ); 这种一次绘制的就是我们想要的,

其实cocos2dx也是利用glDrawArrays来减少绘制次数的,尤其是对于粒子,一次性

传入所有粒子的顶点,一次性绘制,岂能不快。

这里也提一下,假如提供了1,2,3,4,5,6,6个顶点:

GL_TRIANGLES,每三个顶点构成一个三角形,(1,2,3),(4,5,6),绘制2个三角形

GL_TRIANGLE_STRIP,前面的两个顶点与当前顶点构成一个三角形,

(1,2,3),(2,3,4),(3,4,5),(4,5,6),绘制4个三角形

可见如果要节约资源,采用GL_TRIANGLE_STRIP是个不错的选择。

关于地形顶点数据的存储,笔者采用文件存储,前4个字节,表示顶点的个数,

以后每8个字节表示一个顶点,因为Vec2就占8个字节,正好可以读入。

如下,载入数据:

auto data = FileUtils::getInstance()->getDataFromFile(fileName);

CC_BREAK_IF(data.isNull());

int numPoint = *((int*)data.getBytes()); // 读取顶点个数

_points.resize(numPoint);

memcpy(&_points[0], data.getBytes() &#; 4, data.getSize() - 4); // 读取顶点数据

这里_points是std::vector<Vec2> _points;

cocos2dx实现自定义2D地形(cocos2d怎么用)

vector的数据是连续的,而且Vec2又占8个字节,又不需要特殊的构造。

下一步就是将顶点数据转换成三角形顶点

对于土地部分

只要保证顶部地形的走势就可以,底部要做的就是一直拖到屏幕最下方,

所以根据上面标有数字的图片,按照数字顺序添加顶点就可以了。

而对于表面(草地)部分

实际上就是给土地镶嵌一层花边,如图中的黑色粗线

只要将每个顶点的Y坐标上下平移一小段距离,得到图中的橘色多边形就可以了

这样土地和表面的三角顶点数据就构造好了

纹理的处理

纹理采用的是GL_REPEAT,对于地形的显示至关重要。

那么纹理坐标应该怎么生成呢?

土地可以根据(坐标/图像的尺寸)得到。

表面水平方向/图像的宽带,竖直方向不能根据坐标,因为纹理是重复的,

只要将上顶点设为0.f,下顶点设为1.0f,就可以,纹理坐标Y坐标与opengl坐标系是相反的。

顶点坐标纹理都已准备好,下面就是如何绘制了.

Shader&#;绘制函数就可以搞定了,

继承Node,重载draw函数

定义一个CustomCommand,目的调用自己的绘制方法,

我们并没有使用glVertexPointer, glTexCoordPointer, 因为可以利用cocos2dx 的shader设置顶点属性

getGLProgramState()->setVertexAttribPointer,

可以这样提供给shader顶点坐标, 前提顶点着色器要有attribute vec4 a_position

getGLProgramState()->setVertexAttribPointer("a_position",2, GL_FLOAT, GL_FALSE, sizeof(Vec2), &_triangles[0]);

同理纹理坐标

getGLProgramState()->setVertexAttribPointer("a_texCoord",2, GL_FLOAT, GL_FALSE, sizeof(Vec2), &_texCoords[0])

可以参照tests的ShaderTests

到此我们已经知道地形绘制的方法,具体怎么实现呢?

组织方式

Terrain类管理地形的表面和土地

TerrainSurface类和TerrainBottom类分别显示地形的表面和土地

两者继承TerrainSprite类,TerrainSprite类显示自定义网&#;,

考虑一下Surface 和 Bottom 不同之处: 纹理,三角形数据,shader

仅仅几个参数不同,所以可以合并到TerrainSprite.

先来分析Terrain,载入地形数据,初始化表面和土地

初始化代码:

然后TerrainSprite, 根据顶点数据构造三角顶点和纹理顶点,初始化shader,并绘制,头文件就不用看了,

由于三角形的处理不同所以提供了一个纯虚函数,让子类实现。

先来看看初始化,初始化shader,顶点数据,设置参数

再来看看shader的初始化, 改变纹理参数, 向shader设置纹理及尺寸

最后分析TerrainSurface和TerrainBottom

如何创建

重点是这句

node->init(points,tex, "glsl/terrain_surface.vert", "glsl/terrain_surface.frag");

纹理,shader,其实create还可以提供一个Texture2D*的参数以便得到不同的纹理。

initTriangles,在文章前面已经提到过,

TerrainBottom类&#;,具体请在文章最后下载源码查看。

Shader的编写

顶点着色器

片元着色器

使用很简单

可见自定义数据,可以通过shader轻松更改显示特效,同时还可以添加物理特性.

源码下载

cocos 3.x android下home键后,切回游戏时黑屏太久的问题 cocos3.x版本开发,按home键,再切回游戏,发现有时候,可以很快渲染出游戏的UI界面(1秒以内),有时候要很久(大概5秒),后来发现是因为activity的UI

cocos2d-x初探学习笔记(1)--HelloWorld 小满(billman)个人原创,欢迎转载,转载请注明地址,小满(billman)的专栏地址

cocos2d-x初探学习笔记(2)--重要概念及Test例子结构 小满(billman)个人原创,欢迎转载,转载请注明地址,小满(billman)的专栏地址

标签: cocos2d怎么用

本文链接地址:https://www.jiuchutong.com/biancheng/372778.html 转载请保留说明!

上一篇:权作记录 cocos2dx

下一篇:cocos 3.x android下home键后,切回游戏时黑屏太久的问题

  • 房地产开发企业资质等级有几个
  • 税务局 强制
  • 租赁收入缴纳个人所得税
  • 坏账准备计入营业外支出还是资产减值损失
  • 注销有几种方法
  • 微信怎么开公司账户
  • 金税盘维护费申报
  • 企业购买房产每年需要交什么税
  • 有营业执照有什么好处吗?
  • 税总界定超标准小规模纳税人偷税数额
  • 旅游的合同
  • 融资租入的办公楼属于固定资产吗
  • 制造费用属于成本类还是损益类
  • 财税[2012]15
  • 一次性发放奖金个税怎么计算
  • 发票抬头写个人税号怎么写
  • 利润表中的销售收入
  • 个体工商户怎么交社保
  • 应交增值税和实缴增值税差额怎么做账
  • 代销商品手续费计入什么科目
  • 搭建rtmp
  • 贷款本息转本金
  • 清除cmos数据按钮一直亮
  • 隐藏登录界面的软件
  • win10系统损坏开不了机
  • movie maker是什么软件
  • 购入研发设备
  • 外资企业取得财产的条件
  • 代理业如何交增值税
  • 计提职工养老保险金
  • 蒂内河畔圣艾蒂安小镇,法国阿尔卑斯省 (© CAVALIER Michel/hemis.fr/Alamy Stock Photo)
  • php怎么输出中文
  • 职工福利费包括奖金吗
  • 固定资产残值率怎么计算
  • mysql_escape_string()函数用法分析
  • thinkphp获取数据库数据
  • 代垫运费增值税计入销项税额吗
  • vue3.0 main.js
  • 发票报销可以跨年吗
  • 公司的零星开支是什么
  • 第6章 分支语句和逻辑运算符
  • okhttp3源码分析
  • 跨国公司海外子公司
  • 常用的收集数据方法有
  • 债权投资和其他债权投资举例
  • 砂石可以开专票吗
  • 季度所得税申报怎么弥补以前年度亏损
  • 合并报表两种方法
  • 其他收益会计科目解释
  • 收到政府补贴现金流
  • 应交税金的负数重分类
  • 应收票据的账务处理程序
  • 出口未申报退税罚款多少
  • 房屋租赁的注意问题
  • 装修公司开劳务费怎么选择税控编码
  • 小规模30万含专票吗
  • 小规模如何申报1个点
  • 专用发票给客户的都要盖章吗
  • 组织机构代码证图片
  • sqlserver如何更改数据类型
  • mysql5.7.22安装配置教程
  • ubuntu20.04怎么用
  • mac升级最新系统会卡么
  • ubuntu下载net-tools
  • cpqdfwag.exe是什么进程 能结束吗 cpqdfwag进程查询
  • win10链接手机怎么用
  • 已停止工作win7
  • 2021年win10累积更新
  • 如何升级win10专业版
  • win7桌面怎么设置到d盘
  • android怎么添加按钮
  • 全面理解全面把握全面落实
  • 协程有什么用
  • android的图片应该放到哪一个目录下面?
  • 使用筷子就餐会不会传染乙肝病毒
  • python 网络应用
  • python语句查询
  • 临沂二套房契税收费标准2023年
  • 煤矸石征收资源税吗
  • 北京车船税新标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设