CocosCreator如何实现划过的位置显示纹理


Posted in Javascript onApril 14, 2021

1、项目需求

项目需要有一个功能:是当一个光点走过的路径,这个路径的位置就都亮起来的功能。

2、资料内容

功能类似这位大神的橡皮擦功能:https://forum.cocos.org/t/2-0-8/74246

CocosCreator如何实现划过的位置显示纹理

但是,项目的需求还要经过的路径周围有模糊的外边——也就是从中心到边缘越来越暗。

所以对于借鉴了网上大神的shader例子,类似以下的示例:

CocosCreator如何实现划过的位置显示纹理

在大神的肩膀上做了一些改动,来实现项目的需求。

3、项目示例

以下是我自己的测试项目的示例:

CocosCreator如何实现划过的位置显示纹理

(请忽略这渣渣的画质,懒得装录屏软件了)

4、项目代码

SliderPointLight.ts

const {
	ccclass,
	property
} = cc._decorator;


@ccclass

export default class Follow_spot extends cc.Component {

	@property(cc.Node)

	bg: cc.Node = null;

	material: cc.Material = null;

	center: number[] = [0.5, 0.5];

	testArr: number[] = [];


	onLoad() {

		this.material = this.bg.getComponent(cc.Sprite).getMaterial(0);

		this.material.setProperty('wh_ratio', this.bg.width / this.bg.height);

		this.material.setProperty('center', this.center);


		//js 中最重要是这一句,这里参数是数组长度*数组里向量的维度

		this.material.setProperty('colorArr', new Float32Array(400));

		//这里设置的时候需要把数组里向量的分量展开到一个一维数组

		this.material.setProperty('colorArr', []);


		this.bg.on(cc.Node.EventType.TOUCH_MOVE, this.touchMoveEvent, this);

	}


	touchMoveEvent(evt: cc.Event.EventTouch) {

		this.center[0] = evt.getLocation().x / this.bg.width;

		this.center[1] = 1 - evt.getLocation().y / this.bg.height;

		console.log(this.center);

		this.material.setProperty('center', this.center);

		if (this.testArr.length >= 400) {

			this.testArr.shift();

			this.testArr.shift();

		}

		this.testArr.push(this.center[0]);

		this.testArr.push(this.center[1]);



		//js 中最重要是这一句,这里参数是数组长度*数组里向量的维度

		this.material.setProperty('colorArr', new Float32Array(this.testArr));

		//这里设置的时候需要把数组里向量的分量展开到一个一维数组

		this.material.setProperty('colorArr', this.testArr);

	}

}



SliderPointLight.effect


CCEffect % {

		techniques:

			-passes:

			-vert: vs

		frag: fs

		blendState:

			targets:

			-blend: true

		rasterizerState:

			cullMode: none

		properties:

			texture: {
				value: white
			}

		wh_ratio: {

			value: 1.78,

			editor: {

				tooltip: "宽高比"

			}

		}

		blur: {

			value: 0.35,

			editor: {

				tooltip: "光圈模糊程度"

			}

		}

		radius: {

			value: 0.5,

			editor: {

				tooltip: "光圈半径"

			}

		}

		center: {

			value: [0.5, 0.5],

			editor: {

				tooltip: "光圈起点"

			}

		}

		colorArr: {
			value: [0.5, 0.5, 0.5, 0.5]
		}

	} %



	CCProgram vs % {

		precision highp float;


		#include <cc-global>

		#include <cc-local>


		in vec3 a_position;

		in vec4 a_color;

		out vec4 v_color;


		#if USE_TEXTURE

		in vec2 a_uv0;

		out vec2 v_uv0;

		#endif


		void main() {

			vec4 pos = vec4(a_position, 1);


			#if CC_USE_MODEL

			pos = cc_matViewProj * cc_matWorld * pos;

			#else

			pos = cc_matViewProj * pos;

			#endif


			#if USE_TEXTURE

			v_uv0 = a_uv0;

			#endif


			v_color = a_color;


			gl_Position = pos;

		}

	} %


	CCProgram fs % {


		precision highp float;


		#include <alpha-test>


		in vec4 v_color;


		#if USE_TEXTURE

		in vec2 v_uv0;

		uniform sampler2D texture;

		#endif


		uniform ARGS {

			float radius;

			float blur;

			vec2 center;

			float wh_ratio;

		};


		//effect定义

		uniform Metaball {

			vec4 colorArr[100];

		};


		void main() {

			vec4 o = vec4(1, 1, 1, 0);

			o *= texture(texture, v_uv0);

			o *= v_color;

			float circle = radius * radius;

			for (int i = 0; i < 100; i++) {

				float colorX = colorArr[i].x;

				float colorY = colorArr[i].y;

				float rx = colorX * wh_ratio;

				float ry = colorY;

				float dis = (v_uv0.x * wh_ratio - rx) * (v_uv0.x * wh_ratio - rx) + (v_uv0.y - ry) * (v_uv0.y - ry);


				o.a = smoothstep(circle, circle - blur, dis) + o.a;

			}


			gl_FragColor = o;

		}

	}%

以上就是CocosCreator如何实现划过的位置显示纹理的详细内容,更多关于CocosCreator资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
为调试JavaScript添加输出窗口的代码
Feb 07 Javascript
JQuery 操作select标签实现代码
May 14 Javascript
jquery 操作DOM案例代码分享
Apr 05 Javascript
JS定时关闭窗口的实例
May 22 Javascript
DOM 事件流详解
Jan 20 Javascript
jquery ui dialog替代confirm实例分析
Jan 25 Javascript
Bootstrap 3 进度条的实现
Feb 22 Javascript
深入理解node.js之path模块
May 03 Javascript
微信小程序项目实践之验证码倒计时功能
Jul 18 Javascript
vue 点击按钮增加一行的方法
Sep 07 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
May 02 Javascript
jQuery实现二级导航菜单的示例
Sep 30 jQuery
JS监听Esc 键触发事键
Apr 14 #Javascript
jQuery实现影院选座订座效果
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
JavaScript实现复选框全选功能
js实现上传图片到服务器
Apr 11 #Javascript
Canvas跟随鼠标炫彩小球的实现
Apr 11 #Javascript
uniapp开发小程序的经验总结
You might like
用PHP来写记数器(详细介绍)
2006/10/09 PHP
推荐一篇入门级的Class文章
2007/03/19 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
大家未必知道的Js技巧收藏
2008/04/07 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
js判断是否是手机页面
2017/03/17 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
Python自动化之UnitTest框架实战记录
2020/09/08 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
如何将整数int转换成字串String
2014/03/21 面试题
ORACLE第二个十问
2013/12/14 面试题
数学专业毕业生自荐信
2013/11/10 职场文书
杠杆的科学教学反思
2014/01/10 职场文书
学生期末评语大全
2014/04/30 职场文书
淘宝活动总结范文
2014/06/26 职场文书
2014医学院领导干部四风对照检查材料思想汇报
2014/09/16 职场文书
中学生检讨书范文
2014/11/03 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
分享几个JavaScript运算符的使用技巧
2021/04/24 Javascript
Python如何利用pandas读取csv数据并绘图
2022/07/07 Python