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 相关文章推荐
用Juery网页选项卡实现代码
Jun 13 Javascript
window.opener用法和用途实例介绍
Aug 19 Javascript
网页防止tab键的使用快速解决方法
Nov 07 Javascript
深入了解Node.js中的一些特性
Sep 25 Javascript
JavaScript中的方法重载实例
Mar 16 Javascript
在Node.js应用中使用Redis的方法简介
Jun 24 Javascript
JS实现简单的图书馆享元模式实例
Jun 30 Javascript
javascript回调函数详解
Feb 06 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
Jul 10 Javascript
vue this.reload 方法 配置
Sep 12 Javascript
vue回到顶部监听滚动事件详解
Aug 02 Javascript
vue中使用v-model完成组件间的通信
Aug 22 Javascript
JS监听Esc 键触发事键
Apr 14 #Javascript
jQuery实现影院选座订座效果
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
JavaScript实现复选框全选功能
js实现上传图片到服务器
Apr 11 #Javascript
Canvas跟随鼠标炫彩小球的实现
Apr 11 #Javascript
uniapp开发小程序的经验总结
You might like
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
destoon各类调用汇总
2014/06/20 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
Javascript 解疑
2009/11/11 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
js获取select标签的值且兼容IE与firefox
2013/12/30 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
Python对列表中的各项进行关联详解
2017/08/15 Python
Python批量发送post请求的实现代码
2018/05/05 Python
python中的json总结
2018/10/11 Python
tensorflow多维张量计算实例
2020/02/11 Python
如何真正的了解python装饰器
2020/08/14 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
美国折扣网站:jClub
2017/08/07 全球购物
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
如何在C# winform中异步调用web services
2015/09/21 面试题
酒店中秋节活动方案
2014/01/31 职场文书
召开会议通知范文
2015/04/15 职场文书
2015年林业工作总结
2015/05/14 职场文书
付款证明格式范文
2015/06/19 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书