cocos2dx ​​Animate3D (一)

3D相关的动画都是继承Grid3DAction

本质上是用GirdBase进行创建动画的小块。

Shaky3D

晃动特效
请添加图片描述

//  持续时间(时间过后不会回到原来的样子)
// 整个屏幕被分成几行几列 
// 晃动的范围 
// z轴是否晃动 
static Shaky3D* create(float initWithDuration, const Size& gridSize, int range, bool shakeZ);

关键实现

void Shaky3D::update(float /*time*/)
{int i, j;for (i = 0; i < (_gridSize.width+1); ++i){for (j = 0; j < (_gridSize.height+1); ++j){Vec3 v = getOriginalVertex(Vec2(i ,j));v.x += (rand() % (_randrange*2)) - _randrange;v.y += (rand() % (_randrange*2)) - _randrange;if (_shakeZ){v.z += (rand() % (_randrange*2)) - _randrange;}setVertex(Vec2(i, j), v);}}
}

示例代码

cc.Shaky3D:create(5, cc.size(15,10), 5, false)

Waves3D

波浪特效
请添加图片描述

// 持续时间(时间过后不会回到原来的样子) 
// 整个屏幕被分成几行几列 
// 波动的速率 
// 振幅 
static Waves3D* create(float duration, const Size& gridSize, unsigned int waves, float amplitude);

源码

void Waves3D::update(float time)
{int i, j;for (i = 0; i < _gridSize.width + 1; ++i){for (j = 0; j < _gridSize.height + 1; ++j){Vec3 v = getOriginalVertex(Vec2(i ,j));v.z += (sinf((float)M_PI * time * _waves * 2 + (v.y+v.x) * 0.01f) * _amplitude * _amplitudeRate);//CCLOG("v.z offset is %f\n", (sinf((float)M_PI * time * _waves * 2 + (v.y+v.x) * .01f) * _amplitude * _amplitudeRate));setVertex(Vec2(i, j), v);}}
}

示例

cc.Waves3D:create(5, cc.size(15,10), 5, 40)

FlipX3D

X轴翻转动画

请添加图片描述

// 反转时间
static FlipX3D* create(float duration);

源码

void FlipX3D::update(float time)
{float angle = (float)M_PI * time; // 180 degreesfloat mz = sinf(angle);angle = angle / 2.0f; // x calculates degrees from 0 to 90float mx = cosf(angle);Vec3 v0, v1, v, diff;v0 = getOriginalVertex(Vec2(1.0f, 1.0f));v1 = getOriginalVertex(Vec2());float    x0 = v0.x;float    x1 = v1.x;float    x;Vec2    a, b, c, d;if ( x0 > x1 ){// Normal Grida.setZero();b.set(0.0f, 1.0f);c.set(1.0f, 0.0f);d.set(1.0f, 1.0f);x = x0;}else{// Reversed Gridc.setZero();d.set(0.0f, 1.0f);a.set(1.0f, 0.0f);b.set(1.0f, 1.0f);x = x1;}diff.x = ( x - x * mx );diff.z = fabsf( floorf( (x * mz) / 4.0f ) );// bottom-leftv = getOriginalVertex(a);v.x = diff.x;v.z += diff.z;setVertex(a, v);// upper-leftv = getOriginalVertex(b);v.x = diff.x;v.z += diff.z;setVertex(b, v);// bottom-rightv = getOriginalVertex(c);v.x -= diff.x;v.z -= diff.z;setVertex(c, v);// upper-rightv = getOriginalVertex(d);v.x -= diff.x;v.z -= diff.z;setVertex(d, v);
}

示例

cc.FlipX3D:create(3)

FlipY3D

Y轴翻转动画
请添加图片描述

// 时间
static FlipY3D* create(float duration);

源码

void FlipY3D::update(float time)
{float angle = (float)M_PI * time; // 180 degreesfloat mz = sinf( angle );angle = angle / 2.0f;     // x calculates degrees from 0 to 90float my = cosf(angle);Vec3    v0, v1, v, diff;v0 = getOriginalVertex(Vec2(1.0f, 1.0f));v1 = getOriginalVertex(Vec2());float    y0 = v0.y;float    y1 = v1.y;float y;Vec2    a, b, c, d;if (y0 > y1){// Normal Grida.setZero();b.set(0.0f, 1.0f);c.set(1.0f, 0.0f);d.set(1.0f, 1.0f);y = y0;}else{// Reversed Gridb.setZero();a.set(0.0f, 1.0f);d.set(1.0f, 0.0f);c.set(1.0f, 1.0f);y = y1;}diff.y = y - y * my;diff.z = fabsf(floorf((y * mz) / 4.0f));// bottom-leftv = getOriginalVertex(a);v.y = diff.y;v.z += diff.z;setVertex(a, v);// upper-leftv = getOriginalVertex(b);v.y -= diff.y;v.z -= diff.z;setVertex(b, v);// bottom-rightv = getOriginalVertex(c);v.y = diff.y;v.z += diff.z;setVertex(c, v);// upper-rightv = getOriginalVertex(d);v.y -= diff.y;v.z -= diff.z;setVertex(d, v);
}

示例

cc.FlipY3D:create(3)

Lens3D

凸镜特效
请添加图片描述

// 持续时间(时间过后不会回到原来的样子) 
// 网格大小 
// 凸镜中心点
// 半径
static Lens3D* create(float duration, const Size& gridSize, const Vec2& position, float radius);

源码

void Lens3D::update(float /*time*/)
{if (_dirty){int i, j;for (i = 0; i < _gridSize.width + 1; ++i){for (j = 0; j < _gridSize.height + 1; ++j){Vec3 v = getOriginalVertex(Vec2(i, j));Vec2 vect = _position - Vec2(v.x, v.y);float r = vect.getLength();if (r < _radius){r = _radius - r;float pre_log = r / _radius;if ( pre_log == 0 ) {pre_log = 0.001f;}float l = logf(pre_log) * _lensEffect;float new_r = expf( l ) * _radius;if (vect.getLength() > 0){vect.normalize();Vec2 new_vect = vect * new_r;v.z += (_concave ? -1.0f : 1.0f) * new_vect.getLength() * _lensEffect;}}setVertex(Vec2(i, j), v);}}_dirty = false;}
}

示例

 cc.Lens3D:create(2, cc.size(15,10), cc.p(size.width/2,size.height/2), 240)

Ripple3D

水波特效
请添加图片描述

// 持续时间(时间过后不会回到原来的样子) 
// 网格大小 
// 凸镜中心点 
// 半径
// 波动的速率
// 振幅
static Ripple3D* create(float duration, const Size& gridSize, const Vec2& position, float radius, unsigned int waves, float amplitude);

源码

void Ripple3D::update(float time)
{int i, j;for (i = 0; i < (_gridSize.width+1); ++i){for (j = 0; j < (_gridSize.height+1); ++j){Vec3 v = getOriginalVertex(Vec2(i, j));Vec2 vect = _position - Vec2(v.x,v.y);float r = vect.getLength();if (r < _radius){r = _radius - r;float rate = powf(r / _radius, 2);v.z += (sinf( time*(float)M_PI * _waves * 2 + r * 0.1f) * _amplitude * _amplitudeRate * rate);}setVertex(Vec2(i, j), v);}}
}

示例

// 持续时间(时间过后不会回到原来的样子)
// 整个屏幕被分成几行几列 
// 波动的速率 
// 振幅
cc.Ripple3D:create(t, cc.size(32,24), cc.p(size.width/2,size.height/2), 240, 4, 160)

Liquid

液体特效

请添加图片描述

// 持续时间(时间过后不会回到原来的样子) 
// 整个屏幕被分成几行几列 
// 波动的速率 
// 振幅 
static Liquid* create(float duration, const Size& gridSize, unsigned int waves, float amplitude);

源码

void Liquid::update(float time)
{int i, j;for (i = 1; i < _gridSize.width; ++i){for (j = 1; j < _gridSize.height; ++j){Vec3 v = getOriginalVertex(Vec2(i, j));v.x = (v.x + (sinf(time * (float)M_PI * _waves * 2 + v.x * .01f) * _amplitude * _amplitudeRate));v.y = (v.y + (sinf(time * (float)M_PI * _waves * 2 + v.y * .01f) * _amplitude * _amplitudeRate));setVertex(Vec2(i, j), v);}}
}

示例

cc.Liquid:create(3, cc.size(16,12), 4, 20)

Waves

带方向的波浪特效,水平与垂直
请添加图片描述

// 持续时间(时间过后不会回到原来的样子) 
// 整个屏幕被分成几行几列 
// 波动的速率 
// 振幅 
// 是否是水平方向 
// 是否是垂直方向 
static Waves* create(float duration, const Size& gridSize, unsigned int waves, float amplitude, bool horizontal, bool vertical);

源码

void Waves::update(float time)
{int i, j;for (i = 0; i < _gridSize.width + 1; ++i){for (j = 0; j < _gridSize.height + 1; ++j){Vec3 v = getOriginalVertex(Vec2(i, j));if (_vertical){v.x = (v.x + (sinf(time * (float)M_PI * _waves * 2 + v.y * .01f) * _amplitude * _amplitudeRate));}if (_horizontal){v.y = (v.y + (sinf(time * (float)M_PI * _waves * 2 + v.x * .01f) * _amplitude * _amplitudeRate));}setVertex(Vec2(i, j), v);}}
}

例子

cc.Waves:create(2, cc.size(16,12), 4, 20, true, true)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/207884.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程的几种状态

&#xff08;线程的几种状态&#xff09; 1.线程状态&#xff08;生命周期&#xff09; 1.1.源码中的状态 关于Java线程的状态&#xff0c;网上说法很多&#xff0c;有五种、六种甚至七种&#xff0c;本文采用Java官方的线程状态分类。 实际上&#xff0c;官方一共给出了六种…

[点云分割] 基于最小切割的分割

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <vector>#include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/cloud_viewer.h> #include <pcl/filters/filter_indices.h> #include…

基本的弹层,点击弹出

<div class"role"><el-button type"primary" size"mini" click"showDialog true">添加角色</el-button></div><!--控制弹框的显示隐藏visible .sync可以点击X关闭弹框 --> <el-dialog width"…

在字节三年,我跳槽了...

前言 早上&#xff08;8:00-12:00&#xff09;8:00起床&#xff0c;到公司吃个早饭&#xff0c;挤电梯。看事故平台摸摸鱼&#xff0c;根据一天的会议情况安排时间&#xff0c;大概11:50跟同组同学去吃饭。 中午&#xff08;吃完饭后-14:00&#xff09;看情况&#xff0c;如果…

python数据结构与算法-10_递归

递归 Recursion is a process for solving problems by subdividing a larger problem into smaller cases of the problem itself and then solving the smaller, more trivial parts. 递归是计算机科学里出现非常多的一个概念&#xff0c;有时候用递归解决问题看起来非常简单…

2014年5月28日 Go生态洞察:GopherCon 2014大会回顾

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Android APN 参数数据库设计和代码实现

Android U 网页代码&#xff1a;/ - OpenGrok cross reference for / (aospxref.com) 字段参数介绍 实体对象 ApnSetting ApnSetting.java - OpenGrok cross reference for /frameworks/base/telephony/java/android/telephony/data/ApnSetting.java (aospxref.com) An Acc…

Attention is All You Need:Transformer各模块详解

Transformer encoder-decoder架构 Encoder&#xff1a;将输入序列转换为一个连续向量空间中的表示。Encoder通常是一个循环神经网络&#xff08;RNN&#xff09;或者卷积神经网络&#xff08;CNN&#xff09;&#xff0c;通过对输入序列中的每个元素进行编码&#xff0c;得到…

腾讯待办导出的文件在哪找?支持打开ics文件的提醒待办工具

您使用过腾讯待办吗&#xff1f;如果您在平常使用的提醒待办工具为腾讯待办&#xff0c;想必近期您打开这款提醒待办工具时会看到提示您及时导出数据的提示。腾讯旗下的腾讯待办应用&#xff0c;应业务发展方向调整将于2023年12月20日全面停止运营并下架该应用。 面对突如其来…

高防服务器的工作原理

在当今互联网时代&#xff0c;网络安全问题日益突出&#xff0c;各种网络攻击层出不穷。为了保护企业的网络安全&#xff0c;高防服务器应运而生。那么&#xff0c;你是否了解高防服务器的工作原理呢&#xff1f;下面就让我们一起来探索一下。 高防服务器是一种能够有效抵御各种…

算法 全排列的应用

#include <iostream> #include <string>using namespace std;// 交换字符串中两个字符的位置 void swap(char& a, char& b) {char temp a;a b;b temp; }void fun(string str) {string a str.substr(0,4); int aa;sscanf(a.c_str(), "%d",…

redis的性能管理、主从复制和哨兵模式

一、redis的性能管理 redis的数据时缓存在内存中的 查看系统内存情况 info memory used_memory:853688 redis中数据占用的内存 used_memory_rss:10522624 redis向操作系统申请的内存 used_memory_peak:853688 redis使用内存的峰值 系统巡检&#xff1a;硬件巡检、数据库 n…