首页 > 编程语言 >uni-app 微信小程序之红包雨活动

uni-app 微信小程序之红包雨活动

时间:2024-04-30 23:13:20浏览次数:17  
标签:红包 redEnvelope redEnvelopes 微信 app 60 background uni id

直接上代码

<!-- 红包雨活动 -->
<template>
	<scroll-view scroll-y="true">
		<view class="red-envelope-rain">
			<view v-for="(redEnvelope, index) in redEnvelopes" :key="index" class="red-envelope"
				:style="{ top: redEnvelope.top + 'px', left: redEnvelope.left + 'px' }"
				@click="handleRedEnvelopeClick(index)"></view>
		</view>
	</scroll-view>
</template>

<script>
	export default {
		data() {
			return {
				redEnvelopes: [],
				redEnvelopeInterval: null,
			}
		},
		onLoad(options) {
			// 每秒创建一个红包
			setInterval(this.initializeRedEnvelopes, 500); 
			// 更新红包位置,约 60 帧
			setInterval(this.moveRedEnvelopes, 1000 / 60); 
		},
		beforeDestroy() {
			this.stopRedEnvelopeRain();
		},
		methods: {
			initializeRedEnvelopes() {
				const numRedEnvelopes = 20; // 红包数量
				// for (let i = 0; i < numRedEnvelopes; i++) {
				const redEnvelope = {
					id: Date.now(),
					top: 0, // 随机纵坐标
					left: Math.random() * (uni.getSystemInfoSync().windowWidth - 50), // 随机横坐标
					speed: Math.random() * 6 + 1, // 随机速度
				};
				this.redEnvelopes.push(redEnvelope);

				setTimeout(() => {
					this.redEnvelopes = this.redEnvelopes.filter(p => p.id !== redEnvelope.id);
				}, 4000); // 4秒后移除红包
			},
			startRedEnvelopeRain() {
				this.redEnvelopeInterval = setInterval(() => {
					this.moveRedEnvelopes();
				}, 1000 / 60); // 每秒60帧
			},
			stopRedEnvelopeRain() {
				clearInterval(this.redEnvelopeInterval);
			},
			moveRedEnvelopes() {
				this.redEnvelopes.forEach((redEnvelope, index) => {
					console.log(redEnvelope, "redEnvelopes")
					redEnvelope.top += redEnvelope.speed;
					if (redEnvelope.top > uni.getSystemInfoSync().windowHeight) {
						this.redEnvelopes = this.redEnvelopes.filter(p => p.id !== redEnvelope.id);
					}
				});
			},
			// 处理红包点击事件,可以增加分数或显示提示等操作
			handleRedEnvelopeClick(index) {
				// 例如:this.score += 1;
				// 或者:this.showTip = true;
				// 可以根据实际需求自行添加逻辑
				this.redEnvelopes.splice(index, 1); // 点击后移除红包
			},
		}
	}
</script>

<style lang="scss">
	.red-envelope-rain {
		position: relative;
		overflow: hidden;
		width: 100vw;
		height: 100vh;
	}

	.red-envelope {
		position: absolute;
		background-image: url('https://i-1.lanrentuku.com/2020/11/4/a9b4bcdb-75f3-429d-9c21-d83d945b088e.png?imageView2/2/w/500');
		background-size: 100rpx 100rpx;
		background-repeat: no-repeat;
		width: 100rpx;
		height: 100rpx;
	}
</style>


改进代码

<!-- 红包雨活动 -->
<template>
	<scroll-view scroll-y="true">
		<view class="red-envelope-rain">
			<view v-for="(redEnvelope, index) in redEnvelopes" :key="index" class="red-envelope"
				:style="{ top: redEnvelope.top + 'px', left: redEnvelope.left + 'px' }"
				@click="handleRedEnvelopeClick(index)"></view>
		</view>
	</scroll-view>
</template>

<script>
	export default {
		data() {
			return {
				redEnvelopes: [],
				redEnvelopeInterval: null,
			}
		},
		onLoad(options) {
			// 每秒创建一个红包 500  50的话更快
			setInterval(this.initializeRedEnvelopes, 100); 
			
			// 更新红包位置,约 60 帧
			setInterval(this.moveRedEnvelopes, 1000 / 60); 
		},
		beforeDestroy() {
			this.stopRedEnvelopeRain();
		},
		methods: {
			initializeRedEnvelopes() {
				const numRedEnvelopes = 140; // 红包数量
				// for (let i = 0; i < numRedEnvelopes; i++) {
				const redEnvelope = {
					id: Date.now(),
					top: 0, // 随机纵坐标
				 
					left: Math.random() * (uni.getSystemInfoSync().windowWidth - 50), // 随机横坐标
		 
					speed: Math.random() * 6 + 1, // 随机速度
				};
				this.redEnvelopes.push(redEnvelope);

				setTimeout(() => {
					this.redEnvelopes = this.redEnvelopes.filter(p => p.id !== redEnvelope.id);
				}, 4000); // 4秒后移除红包
			},
			startRedEnvelopeRain() {
				this.redEnvelopeInterval = setInterval(() => {
					this.moveRedEnvelopes();
				}, 1000 / 60); // 每秒60帧
			},
			stopRedEnvelopeRain() {
				clearInterval(this.redEnvelopeInterval);
			},
			moveRedEnvelopes() {
				this.redEnvelopes.forEach((redEnvelope, index) => {
					console.log(redEnvelope, "redEnvelopes")
					redEnvelope.top += redEnvelope.speed;
					if (redEnvelope.top > uni.getSystemInfoSync().windowHeight) {
						this.redEnvelopes = this.redEnvelopes.filter(p => p.id !== redEnvelope.id);
					}
				});
		 
				
			},
			// 处理红包点击事件,可以增加分数或显示提示等操作
			handleRedEnvelopeClick(index) {
				// 例如:this.score += 1;
				// 或者:this.showTip = true;
				// 可以根据实际需求自行添加逻辑
				this.redEnvelopes.splice(index, 1); // 点击后移除红包
			},
		}
	}
</script>

<style lang="scss">
	.red-envelope-rain {
		position: relative;
		overflow: hidden;
		width: 100vw;
		height: 100vh;
		
				background-image: url('http://layui.79524795.vip/33.jpg'); /* 添加的背景图片 */
				background-size: cover; /* 背景图覆盖整个容器 */
				background-position: center; /* 背景图居中显示 */
		
	}

	.red-envelope {
		position: absolute;
		// background-image: url('https://i-1.lanrentuku.com/2020/11/4/a9b4bcdb-75f3-429d-9c21-d83d945b088e.png?imageView2/2/w/500');
		// background-image: url('http://layui.79524795.vip/bao.png');
		background-image: url('http://layui.79524795.vip/hong.png');
		
		background-size: 100rpx 100rpx;
		background-repeat: no-repeat;
		width: 100rpx;
		height: 100rpx;
	}
</style>


标签:红包,redEnvelope,redEnvelopes,微信,app,60,background,uni,id
From: https://www.cnblogs.com/79524795-Tian/p/18168851

相关文章

  • 群晖内网穿透+域名访问+PLEX APP直接访问
    本文主要记录自身PLEX通过APP访问的记录,也算是一个教程。另感谢各教程贡献者,详见参考。本教程重点在内网穿透的域名访问内网资源。适用人员针对无公网IP,同时PLEX安装在群晖或其它NAS上的,希望在外网使用pelx应用访问家中资源的人(其它系统也类似,原理相同)前期准备购买云服......
  • .Net单元测试xUnit和集成测试指南
    引言在现代化的软件开发中,单元测试和集成测试是确保代码质量和可靠性的关键部分。ASP.NETCore社区内提供了强大的单元测试框架,xUnit是其中之一,它提供了简单、清晰和强大的测试功能,编写单元测试有许多优点;有助于回归、提供文档及辅助良好的设计。下面几节我们来深入浅出探讨如......
  • 【每周一读】What is prompt-tuning?
    原文链接:https://research.ibm.com/blog/what-is-ai-prompt-tuning原文作者:KimMartineau(女作者好耶!)本文来自IBM的一篇科普性质的博客。除了介绍手工设计的硬提示(hardprompt)、AI设计的由向量或数字组成的软提示(softprompt)以及将软提示注入不同层的前缀微调(prefix-tuning),本文......
  • Unity游戏框架设计之缓存池管理器
    Unity游戏框架设计之缓存池管理器简单介绍在游戏运行的过程中,我们可能遇到这样的需求,即创建大量相同类型的敌人。在传统方法中,我们将对每一个敌人都重新创建,但这样是效率低且占据内存的。为此我们可以这样做,所有敌人在创建时,都从敌人缓存池中取出敌人对象,当敌人死亡时,则将敌人......
  • Unity游戏框架设计之音频管理器
    Unity游戏框架设计之音频管理器简单介绍在游戏中,主要的音频分为两种类型。第一种类型是BGM(背景音乐),第二种类型是音效。BGM的特点是音频持续时间长,一般在游戏中的同一时间内只能播放一个BGM。音效的特点是音频持续时间短,一般在游戏中的同一时间内允许同时播放多个音效。在下......
  • Unity性能分析(一)流程与工具的使用
    性能分析工作流对于游戏开发是“必备”的,从基本的三方面开始:在修改之前分析:建立基准线在开发过程中分析:确保修改不会影响性能在修改后分析:证明修改产生了预期效果分析工具是开发者的实用工具之一,可以帮助开发者定位代码中的内存问题和性能瓶颈,也能帮助了解Unity引擎底层的运......
  • Unity性能分析(二)CPU/GPU分析
    设置每帧时间预算帧率(fps)并不是衡量游戏稳定体验的理想指标。考虑以下情况:在运行时的前0.75s内渲染了59帧。然后接下来的1帧需要0.25s才能渲染完毕。虽然是60fps,但实际上会让玩家感觉卡顿。这是需要设置帧时间预算的重要原因之一。这为您提供了一个目标,在对游戏进行分析和优化时......
  • Unity性能分析(三)内存分析
    Unity中有两种分析内存的方法:MemoryProfiler:内置的分析器,提供内存使用的基本信息。MemoryProfilerpackage:将package添加到项目中,更详细地分析内存使用情况。可以存储和比较快照查找内存泄漏,查看内存布局以查找内存碎片问题。确定物理RAM限制每个目标平台都有一个内存限......
  • Unity性能分析(四)Unity性能分析工具使用
    使用Profiler按照以下步骤开始使用UnityProfiler:在进行分析时,必须使用开发版本。File>BuildSettings>DevelopmentBuild。勾选AutoconnectProfile(可选)。注意:AutoconnectProfile会增加初始启动时间。如果不启用AutoconnectProfiler,可以随时手动连接正在运行的开发版......
  • Unity游戏框架设计之场景管理器
    Unity游戏框架设计之场景管理器简单介绍在游戏开发过程中,我们经常对Scene进行切换。为了不使场景切换时造成的游戏卡顿,可以Unity官方API利用协程的方式异步加载场景。同时,为提升Scene切换的玩家体验,我们经常会在场景切换的开始,先显示过渡UI,然后才对目标场景进行加载......