egret 实现刮刮乐效果

使用egret mask实现刮刮乐效果
使用eui.Image来作为实现,当然也可以直接用egret.Bitmap代替,i3作为刮刮乐刮层,i0做为被遮罩层,就是最终的结果图
想要实现刮的效果,还得有个遮罩mask

class GuaGuaLe extends eui.Component {

	private i0: eui.Image;//结果层
	private i3: eui.Image;//刮层
	private maskGroup: eui.Group;//遮罩层,当然也可以是egret.DisplayObjectContainer

	//第一个绘制图形点
	private starPointX: number;
	private starPointY: number;
	//第二个绘制点
	private middlePointX: number;
	private middlePointY: number;
	//绘制间隔
	private readonly drawInterval: number = 30;
	//上个绘制时间点
	private lastDrawTime: number;
	//绘制的share数组
	private shares: egret.Shape[];
	//绘制的次数
	private drawTime: number;
	//绘制的线宽
	private lineWidth: number = 30;
	public constructor() {
		super();
		this.skinName = "";//关联对应的exml
		this.once(egret.Event.ADDED_TO_STAGE, this.addToStage, this);
	}
	//显示对象添加到舞台的后的操作
	private addToStage(): void {
		//初始化mask层
		this.maskGroup = new eui.Group();
		this.maskGroup.x = this.i0.x;
		this.maskGroup.y = this.i0.y;
		this.maskGroup.width = this.i0.width;
		this.maskGroup.height = this.i0.height;
		this.addChild(this.maskGroup);
		this.i0.mask = this.maskGroup;//设置遮罩层
		//对刮层进行监听
		this.i3.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.touchBegin, this);
		this.i3.addEventListener(egret.TouchEvent.TOUCH_MOVE, this.touchMove, this);
		this.i3.addEventListener(egret.TouchEvent.TOUCH_END, this.touchEnd, this);
	}
	//鼠标或手指按下
	private touchBegin(e: egret.TouchEvent): void {
		if (!this.shares)
			this.shares = [];
		if (this.shares.length > 0) {
			this.shares[this.shares.length - 1].graphics.endFill()
		}
		//按下开始绘制
		this.starPointX = this.middlePointX = e.stageX;//给第一点和第二点赋初值
		this.starPointY = this.middlePointY = e.stageY;

		let shareLine = new egret.Shape();
		this.shares.push(shareLine);
		this.maskGroup.addChild(shareLine);
		shareLine.graphics.lineStyle(this.lineWidth, 0);//开始绘制线
		shareLine.graphics.moveTo(this.starPointX, this.starPointY);
		this.drawTime = 0;
		this.lastDrawTime = egret.getTimer();
	}
	//鼠标或手指移动
	private touchMove(e: egret.TouchEvent): void {
		if (egret.getTimer() - this.lastDrawTime < this.drawInterval)
			return;
		this.lastDrawTime = egret.getTimer();
		this.drawTime++;//每次间隔记录点,三点绘制一个曲线
		let yushu = this.drawTime % 2;

		if (yushu == 0) {//持续绘制
			let shapes = this.shares[this.shares.length - 1];
			shapes.graphics.curveTo(this.middlePointX, this.middlePointY, e.stageX, e.stageY);
			this.starPointX = this.middlePointX;
			this.starPointX = this.middlePointY;
			this.middlePointX = e.stageX;
			this.middlePointY = e.stageY;
		} else if (yushu == 1) {//点的坐标赋值
			this.starPointX = this.middlePointX;
			this.starPointX = this.middlePointY;
			this.middlePointX = e.stageX;
			this.middlePointY = e.stageY;
		}
	}
	//鼠标或手指抬起
	private touchEnd(e: egret.TouchEvent): void {
		if (this.shares.length > 0) {//结束绘制
			this.shares[this.shares.length - 1].graphics.endFill()
		}
	}
}

最终效果:
在这里插入图片描述
使用mask 和 egret.shape来实现还是比较耗性能的,fps下降到40级。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值