Cocos2d-x 跟随光线效果实现
来源:互联网 发布:linux arp老化 编辑:程序博客网 时间:2024/05/21 10:04
在实际游戏编程中,有很多效果是需要自己编程实现而非帧动画,特别是可通过参数控制效果的动画。此篇文章主要说明下《忍者必须死》流线光效果的实现原理。
效果图如下:
因为这种效果是动态的,所以需要实时绘制出来,也就是使用gl的一些绘图函数了,主要还是计算好顶点的位置和颜色。
先定义顶点结构,此后告诉gl顶点是怎么定义的、因为这里不使用纹理,就不要纹理坐标了。
1
2
3
4
typedef
struct
{
float
Position[3];
float
Color[4];
} Vertex;
需要用到索引数组以简化数据的传递,索引的建立就按照三角形的逆序依次输入就行。先假设一根光线使用21的顶点。
1
2
3
4
5
6
7
8
9
10
Vertex trackpt[21];
for
(
int
i=0;i<=20;++i){
trackpt[i].Position[0]=0;
trackpt[i].Position[1]=0;
trackpt[i].Position[2]=0;
trackpt[i].Color[0]=0;
trackpt[i].Color[1]=1;
trackpt[i].Color[2]=0;
trackpt[i].Color[3]=(
float
)i/30.0;
}
在每一帧绘制的地方设置跟踪最前面一顶点
1
2
3
4
5
for
(
int
i=0;i<20;++i)
{
trackpt[i].Position[0]=trackpt[i+1].Position[0];
trackpt[i].Position[1]=trackpt[i+1].Position[1];
}
更新最前面一顶点的位置,这里可以自己定义光线的形状,先假设就是上面效果图的那种。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
std::vector<Vertex> ttt;
tiarr.clear();
for
(
int
i=0;i<=20;++i)
{
if
(d==0)
{
ttt.push_back(trackpt[i]);
}
else
{
float
x3,y3,x4,y4;
if
(trackpt[i].Position[0]==trackpt[20].Position[0])
{
d=0;
}
tempfunc(trackpt[i-1].Position[0],trackpt[i-1].Position[1],
trackpt[i].Position[0],trackpt[i].Position[1],d,
x3,y3,x4,y4);
Vertex vt1={{x3,y3,0}, {color.x,color.y, color.z, 0}, {1, 0}};
Vertex vt2={{x4,y4,0}, {color.x,color.y, color.z, 0}, {1, 0}};
if
(trackpt[i].Position[0]==trackpt[20].Position[0])
{
vt1.Color[3]=0;
vt2.Color[3]=0;
}
trackpt[i].Color[0]=color.x;
trackpt[i].Color[1]=color.y;
trackpt[i].Color[2]=color.z;
ttt.push_back(vt1); ttt.push_back(trackpt[i]); ttt.push_back(vt2);
if
(i-1==0)
{
tiarr.push_back(0);
tiarr.push_back(1);
tiarr.push_back(2);
tiarr.push_back(0);
tiarr.push_back(2);
tiarr.push_back(3);
}
else
{
int
imax=3*i;
tiarr.push_back(imax-4); tiarr.push_back(imax-3); tiarr.push_back(imax-1);
tiarr.push_back(imax-3); tiarr.push_back(imax-1); tiarr.push_back(imax);
tiarr.push_back(imax-4); tiarr.push_back(imax-5); tiarr.push_back(imax-2);
tiarr.push_back(imax-4); tiarr.push_back(imax-2); tiarr.push_back(imax-1);
}
}
d+=((
float
)i+1)*maxdis*0.001;
}
顶点设置完毕,接着使用gl绘制
1
2
3
4
5
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER,
sizeof
(Vertex)*ttt.size(),ttt.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof
(GLushort)*tiarr.size(),tiarr.data(),GL_STATIC_DRAW);
glDrawElements(GL_TRIANGLES,tiarr.size(), GL_UNSIGNED_SHORT, 0);
如果没有意外的话,您将会看到上图的流线光效果了。实际效果如下:
感谢本文笔者米糊_的分享,Cocos引擎中文官网欢迎更多的开发者分享开发经验,来稿请发送至support@cocos.org。
0 0
- Cocos2d-x 跟随光线效果实现
- cocos2dx 跟随光线效果实现
- 源码分析使用Cocos2d-x实现2D光线效果
- 基于Cocos2d-x的2D光线效果雏形
- 使用光线投射实现相机跟随
- 【Cocos2d-x】实现翻牌效果
- cocos2d-x实现亮片效果
- cocos2d-x实现打字机效果
- 【Cocos2d-x】视线和光线:如何创建 2D 视觉范围效果
- 【Cocos2d-x】视线和光线:如何创建 2D 视觉范围效果
- 【Cocos2d-x】视线和光线:如何创建 2D 视觉范围效果
- Cocos2D实现RPG游戏人物地图行走的跟随效果
- Cocos2d-JS 实现X轴自定义视窗跟随
- cocos2d-x实现场景切换效果
- cocos2d-x 遮罩效果实现
- [cocos2d-x] --- 实现Dota技能冷却效果
- cocos2d-x实现飞字效果
- Cocos2d-x 粒子系统----实现下雪效果
- SDKD SingleTest A 题解 2015-04-03
- T-SQL查询执行顺序(二)
- linux下cat命令详解
- centos 安装mysql并设置密码
- 3.9
- Cocos2d-x 跟随光线效果实现
- Tomcat delegate类加载
- 云南本土教育类网站制作,该如何选择云主机服务商
- linux下echo命令详解
- android 离线帮助文档
- 32、64位win7和jdk、eclipse配置
- 【c++】语言基础:++i & i++ 的底层区别
- "stdafx.cpp"编译引起的C2859、C1083、LNK2001错误
- SharedPreferences