uni app 钓鱼小游戏

news2025/1/11 5:51:31

最近姑娘喜欢玩那个餐厅游戏里的钓鱼  ,经常让看广告,然后就点点点...

自己写个吧。小鱼的图片自己搞。 有问题自己改,不要私信我

<template>
	<view class="page_main">

		<view class="top_linear">
			<view class="top_mean_left">
				<text>以钓到 </text>
				<text class="top_mean_tv">{{ydlist.length}} </text>
			</view>
			<view class="top_mean_center">
				<text> </text>
				<text class="top_mean_tv"></text>
			</view>
			<view class="top_mean_right">
				<text> </text>
				<text class="top_mean_tv"></text>
			</view>

			<view class="top_mean_right">
				<text> </text>
				<text class="top_mean_tv"> </text>
			</view>

		</view>
		<view class="contentone">
			<canvas class="canvas_cla" canvas-id="myCanvas" id="myCanvas"></canvas>

		</view>
		<view class="contenttwo">
			<canvas class="canvas_cla" canvas-id="myCanvass" @touchstart="touchstart" @touchend="touchend"
				id="myCanvass" @touchmove="touchmove"></canvas>

		</view>







	</view>
</template>

<script>
	export default {
		data() {
			return {
				canvasWidth: 0,
				canvasHeight: 0,
				shuishen: 0,
				ydlist: [],
				dyl: {
					dylimg: '../static/ship.png',
					dylx: 0,
					dyly: 0,
					dylsize: 50,
					dqjl: 100,
					speedx: 2,
					yg: {
						image: "../static/yg.png",
						size: 15,
						sxspeedy: 5
					}

				},
				ydtimerX: '',
				ytimerX: '',
				ylist: [],
				yimages: ['../static/yu1.png', '../static/yu2.png', '../static/yu3.png',
					'../static/yu4.png', '../static/yu5.png', '../static/yu6.png',
					'../static/yu7.png', '../static/yu8.png', '../static/yu9.png',
					'../static/yu10.png', '../static/yu11.png', '../static/yu12.png', '../static/yu13.png',
					'../static/yu14.png', '../static/yu15.png', '../static/yu16.png', '../static/yu17.png',
					'../static/yu18.png'
				],
				ygy: 100,
				istddyl: false,
				isxg: false,
				iswddl: false,






			};
		},
		onLoad() {


			this.dyl.yxstartx = this.dyl.dylx + this.dyl.dylsize
			this.dyl.dyly = this.canvasHeight - this.shuishen - this.dyl.dylsize
			this.dyl.yxstarty = this.dyl.dyly + this.dyl.dylsize - 10
			console.log(JSON.stringify(this.ylist))
		},

		onReady() {
			const ctx = uni.createCanvasContext('myCanvas');
			const ctxtwo = uni.createCanvasContext('myCanvass');
			this.ctx = ctx
			this.ctxtwo = ctxtwo
			const canvas = uni.createSelectorQuery().select('#myCanvas');
			canvas.boundingClientRect(rect => {

				this.canvasWidth = rect.width
				this.canvasHeight = rect.height
				this.shuishen = rect.height - 100
				this.addy()
			}).exec();


			this.drawyu()
			this.drawdyl()
			this.yddyl()
			this.ydy()
		},

		/**
		 * 生命周期函数--监听页面卸载
		 */
		onUnload: function() {

		},
		methods: {

			/**
			 * 触摸屏幕开始 记录开始坐标
			 */
			touchstart: function(e) {

				let startx = e.touches[0].x
				let starty = e.touches[0].y
				console.log(startx, starty)
				if (starty < this.canvasHeight - this.shuishen) {
					if (!this.isxg) {
						console.log("拖动钓鱼老")
						this.istddyl = true
						clearInterval(this.ydtimerX);
						this.dyl.dylx = startx


						this.drawdyl();
					}
				} else {
					if (!this.isxg) {
						this.ygy = starty
						this.isxg = true
						this.dyl.dqjl = this.getRandomInt(40, 100)
					}

				}



			},
			/**
			 * 触摸屏幕结束 计算
			 */
			touchend: function(e) {
				let x = e.changedTouches[0].x
				let y = e.changedTouches[0].y
				if (!this.isxg) {
					if (this.istddyl) {
						this.istddyl = false
						this.yddyl()
					}
				} else {

				}
			},
			/**
			 * 触摸屏幕移动  画框
			 */
			touchmove: function(e) {
				let x = e.touches[0].x
				let y = e.touches[0].y
				if (!this.isxg) {
					if (this.istddyl) {
						this.dyl.dylx = x
						this.drawdyl();
					}
				}

			},
			addy: function() {
				console.log("添加" + this.ylist.length)
				let count = 10 - this.ylist.length
				console.log("添加" + count)
				console.log(this.canvasHeight, this.shuishen, this.canvasHeight)
				// console.log(this.canvasHeight - this.shuishen + 50, this.canvasHeight - 50)
				for (var i = 0; i <= count; i++) {
					let bean = {}
					bean.size = this.getRandomInt(20, 40)
					bean.x = [0, this.canvasWidth - bean.size][this.getRandomInt(0, 1)]

					bean.y = this.getRandomInt(this.canvasHeight - this.shuishen + 50, this.canvasHeight - 80)
					bean.image = this.yimages[this.getRandomInt(0, this.yimages.length - 1)]
					bean.dqjl = this.getRandomInt(0, 100)
					bean.speedx = this.getRandomInt(1, 3)
					bean.isbdd = false




					this.ylist.push(bean)
				}
			},

			getRandomInt: function(min, max) {
				min = Math.ceil(min);
				max = Math.floor(max);
				return Math.floor(Math.random() * (max - min + 1)) + min;
			},




			drawdyl: function() {
				this.ctxtwo.drawImage("../static/shanshui.png", 0,
					0, this.canvasWidth, this.canvasHeight - this.shuishen);
				var dyly = this.canvasHeight - this.shuishen - this.dyl.dylsize
				this.ctxtwo.drawImage(this.dyl.dylimg, this.dyl.dylx, dyly, this
					.dyl.dylsize, this.dyl.dylsize);
				this.ctxtwo.draw(); // 绘制到 canvas 上

				// 绘制鱼线(假设是简单的直线)  
				this.ctxtwo.beginPath();
				this.ctxtwo.moveTo(this.dyl.dylx + this.dyl.dylsize, dyly + this.dyl.dylsize - 10); // 起点位置  
				this.ctxtwo.lineTo(this.dyl.dylx + this.dyl.dylsize, this.ygy); // 终点位置  
				this.ctxtwo.setStrokeStyle('#000000'); // 设置线条颜色  
				this.ctxtwo.setLineWidth(2); // 设置线条宽度  
				this.ctxtwo.stroke(); // 绘制线条  

				this.ctxtwo.drawImage(this.dyl.yg.image, this.dyl.dylx + this.dyl.dylsize - this.dyl.yg.size / 3,
					this.ygy, this.dyl.yg.size,
					this.dyl.yg.size);

				// 将绘图上下文的内容绘制到 canvas 中  
				this.ctxtwo.draw(true);


			},
			drawyu: function() {
				// 设置填充颜色
				this.ctx.setFillStyle('#1E90FF');

				// 绘制一个填充的长方形,参数分别为:x坐标,y坐标,宽度,高度  
				this.ctx.fillRect(0, this.canvasHeight - this.shuishen, this.canvasWidth, this.shuishen);

				// 将绘制内容绘制到画布上  

				for (var i = 0; i < this.ylist.length; i++) {
					var bean = this.ylist[i]

					this.ctx.drawImage(bean.image, bean.x, bean.y, bean.size, bean.size);

				}
				this.ctx.draw(); // 绘制到 canvas 上
			},
			ydy: function() {



				let that = this;
				let pzcount = 0
				// 在x轴上反弹  
				this.ytimerX = setInterval(() => {

					for (var i = 0; i < this.ylist.length; i++) {
						var bean = this.ylist[i]
						if (bean.isbdd) {
							if (bean.y > 100) {
								bean.y = this.ygy - this.dyl.yg.sxspeedy

							} else {
								this.ydlist.push(JSON.parse(JSON.stringify(bean)))

								console.log("收线完成", this.ydlist.length)
								this.dyl.yg.sxspeedy = 5
								this.iswddl = false
								this.ylist.splice(i, 1)
								this.addy()
							}
						} else {
							bean.x = bean.x + bean.speedx
							if (bean.x < 0 || bean.x + bean.size > that.canvasWidth) {
								bean.speedx = -bean.speedx;
								// bean.isReversed = !bean.isReversed
							}
						}

					}




					that.drawyu();
				}, 100); // 每100毫秒更新一次位置 

			},
			yddyl: function() {

				let that = this;
				let pzcount = 0
				// 在x轴上反弹  
				this.ydtimerX = setInterval(() => {

					if (!that.isxg) {
						that.dyl.dylx = that.dyl.dylx + that.dyl.speedx;


						if (that.dyl.dylx < 0 || that.dyl.dylx + that.dyl.dylsize > that.canvasWidth) {
							that.dyl.speedx = -that.dyl.speedx;
						}
					} else {
						if (that.ygy > 100) {
							that.ygy = that.ygy - that.dyl.yg.sxspeedy

							if (!that.iswddl) {
								console.log("没调到")
								that.iswddl = that.isColliding()

							} else {
								console.log("调到")
							}
						} else {
							that.isxg = false
							that.ygy = 100
							that.iswddl = false

						}
					}






					that.drawdyl();
				}, 100); // 每100毫秒更新一次位置  


			},

			isColliding: function() {
				let ygx = this.dyl.dylx + this.dyl.dylsize
				let ygy = this.ygy
				let ygsize = this.dyl.yg.size

				for (var i = 0; i < this.ylist.length; i++) {
					let bean = this.ylist[i]

					if (ygx < bean.x + bean.size && ygx + ygsize > bean.x && ygy < bean.y + bean
						.size && ygy + ygsize > bean.y) {

						if (this.dyl.dqjl + bean.dqjl >= 100) {
							bean.isbdd = true
							this.dyl.yg.sxspeedy = 45 - bean.size
							return true
						}

					}

				}


				return false
			},



		}
	};
</script>

<style scoped>
	.contentone {
		width: 100vw;
		height: 100vh;
		position: absolute;
		top: 80rpx;
		display: flex;
		justify-content: center;
	}

	.contenttwo {
		width: 100vw;
		height: 100vh;
		position: absolute;
		top: 80rpx;
		display: flex;
		justify-content: center;
	}

	.canvas_cla {
		width: 100vw;
		height: 100vh;
	}


	.top_linear {
		display: flex;
		flex-direction: row;
		justify-content: space-between;
		display: flex;
		flex-direction: row;
		height: 80rpx;

	}

	.top_mean_left {
		margin-left: 32rpx;

	}

	.top_mean_right {
		margin-right: 32rpx;

	}

	.top_mean_tv {
		color: #07a5a6;
	}


	.page_main {
		width: 100vw;
		height: 100vh;
		background-color: #efefef;
	}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1520234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT实战系列-LangChain的OutPutParser解析器

GPT实战系列-LangChain的OutPutParser解析器 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法…

蓝桥杯历年真题省赛Java b组 2017年第八届

一、题目 纸牌三角形&#xff08;难度&#xff1a;★★★&#xff09; A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形&#xff08;A按1计算&#xff09;。要求每个边的和相等。 下图就是一种排法。 这样的排法可能会有很多。 如果考虑旋转、镜像后相同的算同一种&#xff0c;…

基于单片机的自动售货机的设计

摘 要 自动售货机是近些年来兴起的一种通过FPGA或者单片机等硬件支持的智能设备。它广泛的应用于商场&#xff0c;公寓&#xff0c;火车汽车站等人流较密集且购物需求大的地方。自动售货机通过硬件支持&#xff0c;通过以编写好的程序自动出货自动找零&#xff0c;但货物一旦售…

SpringMVC基础之工作流程

文章目录 SpringMVC 的工作流程1. 总图2. DispatcherServlet3. 必需的配置4. 加载配置文件的两个时机5. 定义控制器6. 创建 JSP 视图 SpringMVC 的工作流程 1. 总图 如上图&#xff0c;Spring MVC 程序的完整执行流程如下&#xff1a; 用户通过浏览器发送请求&#xff0c;请求…

Django之图形验证码

Django之图形验证码 目录 Django之图形验证码【1】静态图片【2】视图层绑定静态文件【3】PIL生成图片(固定背景)【4】将图片存储在内存【5】生成文本信息【6】实现图片刷新 【1】静态图片 最基础的生成图片就是获取静态文件 <div style"margin-left: 10px;">…

单片机毕业设计智能家居集成控制器

项目介绍 物联网技术的兴起和发展逐渐的改变了我们的工作方式和生活方式。不仅需要办公变得智能&#xff0c;也需要家居生活逐渐变得智能化起来。智能家居就是在这样的影响下产生的。智能家居提供家电控制、照明控制、遥控控制、环境监测、防盗报警、人体红外扫描等多种功能和…

中电金信:技术实践|Flink维度表关联方案解析

导语&#xff1a;Flink是一个对有界和无界数据流进行状态计算的分布式处理引擎和框架&#xff0c;主要用来处理流式数据。它既可以处理有界的批量数据集&#xff0c;也可以处理无界的实时流数据&#xff0c;为批处理和流处理提供了统一编程模型。 维度表可以看作是用户来分析数…

1.2 课程架构介绍:STM32H5 芯片生命周期管理与安全调试

1.2 课程架构介绍&#xff1a;STM32H5 芯片生命周期管理与安全调试 下面开始学习课程的第二节&#xff0c;简单介绍下STM32H5芯片的生命周期和安全调试&#xff0c;具体课程大家可以观看STM32官方录制的课程&#xff0c;链接&#xff1a;1.2. 课程架构介绍&#xff1a;STM32H5…

专业无网设备如何远程运维?向日葵远程控制能源场景案例解析

清洁能源领域&#xff0c;拥有庞大的上下游产业链&#xff0c;涉及的相关工业设备门类多、技术覆盖全、行业应用广。在这一领域内&#xff0c;相关专业设备的供应商的核心竞争力除了本身产品的技术能力之外&#xff0c;服务也是重要的一环。 某企业作为致力于节能环保方向的气…

Oracle 一键巡检自动生成 Word 报告

前言 Oracle 数据库巡检通常需要消耗大量时间和精力&#xff0c;包括收集数据库以及主机的相关信息。针对 Word 报告的样式调整&#xff0c;也是重复和费事的&#xff0c;所以我针对 Oracle 巡检所需检查的信息以及报告模板&#xff0c;写了一套自动巡检并且生成报告的脚本。巡…

【回归预测】基于DBO-RF(蜣螂优化算法优化随机森林)的回归预测 多输入单输出【Matlab代码#67】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 随机森林RF算法2. 蜣螂优化算法3. 实验模型4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 1. 随机森林RF算法 …

【每日一问】手机如何开启USB调试?

一、背景 当电脑跟手机之间需要进行交互的时候&#xff0c;可以考虑使用usb进行连接。那么手机如何开启USB调试呢&#xff1f; 二、操作步骤&#xff1a; 思路&#xff1a; 步骤1&#xff1a;手机开启开发者模式 步骤2&#xff1a;在开发者模式中&#xff0c;开启“USB调试”…

孙宇晨最新研判:加密货币将成为全球金融基础设施的一部分

近日,波场TRON创始人、火币HTX全球顾问委员会委员孙宇晨接受了在加密社区有重要影响力的媒体平台Bankless的专访,就自己的从业经历、涉足加密行业的理想、波场TRON本身的发展和未来的市场走向等话题进行了详细的分享。 孙宇晨认为,波场TRON的使命是为那些没有银行账户的人提供…

数据结构——字符串

1.leetcode 151 题目链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/reverse-words-in-a-string/…

Vue.js+SpringBoot开发天沐瑜伽馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…

HTML—标签的分类,span和div标签,不同的标签之间类型转换

标签的分类&#xff1a; ①块级标签&#xff1a;无论内容多少&#xff0c;会充满整个行。大小可自定义 例&#xff1a;p&#xff0c;h1&#xff0c;ul&#xff0c;ol&#xff0c;hr 等 ②行级标签&#xff1a;自身的大小就是标签的大小&#xff0c;不会占一整行。大小不可调 例…

免费升级https的方式(含教学)

背景&#xff1a;随着现在全民网络安全意识的日益提升&#xff0c;各个网站实现的https数量也随之提升&#xff0c;那么如何将原本网站的http访问方式升级为https呢&#xff1f;下面均为干货内容。 目录 http访问和https访问的区别&#xff1a; 实现https后有哪些好处&#x…

多人聊天室 (epoll - Linux网络编程)

文章目录 零、效果展示一、服务器代码二、客户端代码三、知识点1.bind() 四、改进方向五、跟练视频 零、效果展示 一个服务器作为中转站&#xff0c;多个客户端之间可以相互通信。至少需要启动两个客户端。 三个客户端互相通信 一、服务器代码 chatServer.cpp #include <…

Java代码审计安全篇-反序列化漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计和部分师傅审计思路以及webgoat靶场&#xff0c;记录…

续上篇 qiankun 微前端配置

上篇文章地址&#xff1a;微前端框架 qiankun 配置使用【基于 vue/react脚手架创建项目 】-CSDN博客 主应用&#xff1a; src/main.js 配置&#xff1a; import Vue from vue import App from ./App.vue import router from ./router import { registerMicroApps, start } …