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

1、项目需求

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

2、资料内容

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

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

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

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

3、项目示例

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

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

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资料请关注我们其它相关文章!

(0)

相关推荐

  • 怎样在CocosCreator中使用游戏手柄

    一.场景布置 二. 添加手柄监听器 1.监听事件的变化 由原先的mouse系列的转换为touch系列的 touchstart 触摸按下,相当于 mousedown touchmove 触摸移动,相当于 mousemove touchend 触摸抬起,相当于 mouseup touchcancel 触摸取消,被其他事件终止,相当于按下了ESC键 2.坐标设定 当触摸按下随推动位置变化(要用世界坐标转换),触摸抬起后回归原位(直接设定0,0坐标默认相对坐标). setPosition()设定的为相对

  • CocosCreator通用框架设计之网络

    前言 在 Cocos Creator 中发起一个 http 请求是比较简单的,但很多游戏希望能够和服务器之间保持长连接,以便服务端能够主动向客户端推送消息,而非总是由客户端发起请求,对于实时性要求较高的游戏更是如此.这里我们会设计一个通用的网络框架,可以方便地应用于我们的项目中. 使用websocket 在实现这个网络框架之前,我们先了解一下 websocket.websocket 是一种基于 tcp 的全双工网络协议,可以让网页创建持久性的连接,进行双向的通讯.在 Cocos Creator

  • 详解CocosCreator项目结构机制

     一.项目文件夹结构 初次创建并打开一个 Cocos Creator 项目后,开发者的项目文件夹将会包括以下结构: 下面我们将会介绍每个文件夹的功能. 1.资源文件夹(assets) assets 将会用来放置游戏中所有的本地资源.脚本和第三方库文件.只有在 assets 目录下的内容才能显示在 资源管理器 中.assets 中的每个文件在导入项目后都会生成一个相同名字的 .meta 文件,用于存储对应的资源配置和索引信息..meta 文件需要一并提交到版本控制系统,详见 资源管理注意事项 --

  • 全面讲解CocosCreator热更新

    前言 本文主要引用cocos关于热更的官方文档,并在此基础上,总结sprout当前热更流程. 什么是热更 热更(新)本质上是从服务器下载需要的资源到本地,并且可以执行新的游戏逻辑,让新资源可以被游戏所使用,它可以使开发者在不发布新版本的情况下,修复 BUG 和发布功能,让开发者得以绕开苹果的审核机制,避免长时间的审核等待以及多次被拒造成的成本. Cocos 默认的热更新机制并不是基于补丁包更新的机制,传统的热更新经常对多个版本之间分别生成补丁包,按顺序下载补丁包并更新到最新版本.Cocos 的热

  • CocosCreator ScrollView优化系列之分帧加载

    一. 前言 JS是单线程的,也就意味着所有任务需要排队,只有当前一个任务结束了,后一个任务才会执行.如果前一个任务耗时很长,后一个任务就不得不一直等着. Cocos Creator 是采用 Java Script/Type Script语言开发,本质上是JS,同样会拥有以上特征.特别地,如果使用不当,极有可能导致界面卡顿. 比如:在为一个ScrollView的Content创建500个节点的的时候,可能就会出现下面界面卡死的问题 PS:本来加载过程中有一个loading对话框,因为卡死了,就感觉

  • 如何用CocosCreator实现射击小游戏

    分析下制作步骤: 1. 准备好资源,搭建场景 资源的话可以自己到网上找,也可以直接用我的也行:创建好相应文件夹,把资源放到res文件夹下: 搭建场景: 第一步:创建一个单色精灵(Script) bg 背景, 设置好颜色,加一个Widget组件,使其充满屏幕: 第二步: 在bg节点下创建top和button空节点作为顶与底部,然后在两个空节点加入带刺的节点(直接将图片拖到top层级管理器就可以),现在我们需要给top与button节点添加一个Layout组件,属性设置如图,这样可以看到屏幕上下都有

  • 游戏开发中如何使用CocosCreator进行音效处理

    在游戏开发中,我们经常需要使用音效来营造游戏氛围,因此本文给大家总结下 Cocos Creator 游戏开发中音效组件的封装和使用. 一. Cocos Creator 中音频播放基础 1. 基础知识 [1]AudioSource 组件官方文档:http://docs.cocos.com/creator/manual/zh/audio/audio.html [2]cc.audioEngine官方文档:http://docs.cocos.com/creator/manual/zh/audio/aud

  • 详解cocoscreater预制体prefab

    预制体prefab 什么是预制体,字面意思,还未使用前预先制作好的节点资源,属性等同于普通节点,可以看做一个预先制作还没展示出来的普通的节点 怎么创建预制体 1.在层级管理器处先创建普通的节点,然后把这个节点拖拽到资源管理器的assets文件夹下,出于方便管理会统一建立一个Prefab文件夹下统一存放预制体 双击预制体节点可以看到它呈现蓝色,这时候就可以删除还留在场景场景里的节点,需要使用该节点时,通过预制体创建 这时候可以看到属性检查器里的属性,和普通节点一致 预制体的作用 1.批量创建相同类

  • 如何在CocosCreator中利用常驻节点做图层管理

    CocosCreator版本:2.3.4 一般游戏都有图层管理,比如 sceneLayer 场景层 panelLayer 弹框层 tipLayer   提示框层 cocos里的场景不是持久化的,每次切换都会自动destroy,如果在场景上放这些图层,那么每个scene都要放一遍?然后再获取,这样很麻烦. 加载场景使用的是cc.director.loadScene,scene的容器node貌似是director上的一个nodeActivator 现在如果不考虑scene的容器或者cocos的顶层容

  • CocosCreator经典入门项目之flappybird

    开发环境 CocosCreator v2.3.1 node.js v10.16.0 vscode 1.46.1 游戏引擎概念 可以理解为一套已经编写好的代码,它封装了对底层接口的使用,是游戏开发的核心功能提供者. 一般分为6各部分: 图像渲染:控制电脑对游戏绘画的绘画操作,直接影响游戏质量 音频UI:提供音频特效,以及游戏UI部分,让游戏与用户交互更好 设备输入:键盘.鼠标.陀螺仪等 脚本引擎:提供脚本接口,为游戏开发者提供"笔墨" 网络引擎:数据交互模块,用服务器为客户端提供交互 物

  • 如何使用CocosCreator对象池

    前言: 在运行时进行节点的创建( cc.instantiate )和销毁( node.destroy )操作是非常耗费性能的,因此我们在比较复杂的场景中,通常只有在场景初始化逻辑( onLoad )中才会进行节点的创建,在切换场景时才会进行节点的销毁.如果制作有大量敌人或子弹需要反复生成和被消灭的动作类游戏,我们要如何在游戏进行过程中随时创建和销毁节点呢?这里就需要对象池的帮助了. 对象池就是一组可回收的节点对象,我们通过创建cc.NodePool的实例来初始化一种节点的对象池.通常当我们有多个

  • 整理CocosCreator常用知识点

    一.场景加载 cc.director.loadScene('场景名称');//场景跳转 cc.director.preloadScene('场景名称');//预加载场景 cc.director.getScene();//获取当前场景 二.查找节点 1,节点查找 node = cc.find("Canvas/bg");//路径访问节点 性能消耗相对较大 this.node.getChildByName('name');//名称获取子节点 性能消耗较小 node.getComponent(

随机推荐