jQuery小游戏

jQuery小游戏(一)

嘻嘻,今天我们来写个jquery小游戏吧

  1. 首先,我们准备一下写小游戏需要准备的佩饰,如果:图片、音乐、搞怪的小表情

这里我准备了一些游戏中需要涉及到的图片
在这里插入图片描述

  1. 游戏中使用到的方法
  • eval() 函数:用于计算传入字符串形式的 JavaScript 代码并执行它。当调用时不带任何对象前缀时,默认是在全局作用域下运行;而通过 window.eval() 显式指定,则可以在当前窗口上下文中评估表达式

  • window.requestAnimationFrame:这里强调一下为什么使用这个办法,其实setInterval也有定时的作用,但是不同之处在于setInterval需指定时间再执行,window.requestAnimationFrame()则推迟到浏览器下一次重绘时就执行回调。重绘通常是 16ms 执行一次,不过浏览器会自动调节这个速率,比如网页切换到后台 Tab 页时,requestAnimationFrame()会暂停执行。需要注意的是:若是某个函数会影响到网页的布局调整,一般就放在window.requestAnimationFrame()里面执行。 取消操作使用cancelAnimationFrame()方法,下面代码为具体实操:

//requestAnimationFrame效果
    (function zhouqi(time) {
       console.log(time,Date.now())
       render();
       zhou = requestAnimationFrame(zhouqi);
       //如果left等于50 停止动画
       if(left == 50){
           cancelAnimationFrame(zhou)
       }
   })
  • window.cancelAnimationFrame():用于取消先前通过的 window.requestAnimationFrame()方法请求的动画帧回调函数的方法,上面代码也有提及到,在使用 window.requestAnimationFrame()方法创建动画时,通常会把返回的ID存储起来,以便在需要时使用window.cancelAnimationFrame()方法取消动画
  • String.format : Java 中用于格式化字符串的一个方法, String.format 允许你通过占位符来创建一个格式化的字符串。使用 String.format 可以将各种类型的数据(如整数、小数、字符串等)以指定的格式组合成一个字符串
var link, jsGame; (function() {
	var e = window.eval,
		t = function(e, t, n) {
			var r = n || {};
			if (t) {
				var i = function() {};
				i.prototype = t.prototype,
					e.prototype = new i,
					e.prototype.constructor = e,
					e.prototype.superClass = t.prototype,//javascript的superclass继承
					i = null
			}
			for (var s in r) e.prototype[s] = r[s];
			return r = null, e};
	    window.requestAnimationFrame = function() {
		return window.requestAnimationFrame || window.webkitRequestAnimationFrame ||   
			window.mozRequestAnimationFrame || window.oRequestAnimationFrame ||
			window.msRequestAnimationFrame || window.setTimeout} (),//这段代码是用来兼容不同浏览器的requestAnimationFrame 方法,requestAnimationFrame 用于在下一次浏览器重绘之前执行指定的函数,以实现流畅的动画效果。首先会尝试获取浏览器原生的requestAnimationFrame 方法,如果浏览器不支持,则依次尝试获取其他浏览器的前缀版本,若依旧不支持,则使用setTimeout模拟实现,这样可以确认在不同情况下都能正常运行requestAnimationFrame 方法
		    window.cancelAnimationFrame = function() {//同上面解释类似
			return window.cancelAnimationFrame || window.webkitCancelAnimationFrame ||
				window.mozCancelAnimationFrame || window.oCancelAnimationFrame ||
				window.msCancelAnimationFrame || window.clearTimeout} (),
        String || (String = {}),
    	String.format || (String.format = function() {
		if (arguments.length == 0) return null;//当参数个数为0即空数组         //arguments类数组对象
		var e = arguments[0] || "", t;
		for (var n = 1, r = arguments.length; n < r; n++) t = new RegExp("\\{" + (n - 1)+"\\}","gm"),
			e = e.replace(t, arguments[n]);
		 return t = null, e
	}),
	  
  • Array.prototype : 所有的数组实例都继承于 Array.prototype,和其他构造函数一样,可以通过Arrayprototype属性上的方法来给所有数组实例增加方法
String.getByteLength || (String.getByteLength = function(e) {
		var t, n = 0, r = e || "", i = r.length;
		for (t = 0; t < i; t++) r.charCodeAt(t) >= 0 & r.charCodeAt(t) <= 255 ? n += 1 : n += 2;
		   return t = r = i = null, n});
	    if (!Array || !Array.prototype) Array.prototype = {};
	    Array.prototype.indexOfAttr = function(e, t) {
		var n = (typeof e).toLowerCase(), r = -1;
		for (var i = 0, s = this.length; i < s; i++) if (n == "string" && this[i][e] == t || n =="number"
			&& this[i] == e) {
			r = i;
			break
		}
  • canvas: HTML5的新增元素
<canvas id="zhouqi"></canvas> // 如果没有设置宽高,canvas会自动创建一个 300 * 150 的画布(单位默认为px)
canvas.width = 300    // 设置画布宽度
canvas.height = 300   // 设置画布高度
const canvas = document.getElementById('zhouqi')  // 获取画布节点
const ctx = canvas.getContext('2D') // 获取 2D 绘图上下文对象
return n = null, r};
	   var n = {
			canvas: {
				id: "linkScreen",
				defaultId: "linkScreen",
				defaultFont: "12px Arial",
				defaultWidth: 240,
				defaultHeight: 320,
				defaultColor: "rgb(0, 0, 0)",
				bgColor: "#000",
				cavansDoms: [],
				ctxs: [],
				device: "",
				fps: 1,
				touch: !1,
				zoom: 1
			},
			system: {
				loadRes: null,
				pageLoad: null,
				menu: null,
				run: null,
				runFn: function() {},
				rafRun: null,
				stop: null,
				over: null,
				zone: null,
				active: null,
				lastDate: Date.now(),
				timeout: 30,
				isPause: !1,
				gameFlow: -1,
				loadedImageToGameFlow: -1,
				zoneArgs: null,
				activeArgs: null,
				spendTime: 0,
				loadResTimer: null,
				playTimer: null
			},
			event: {
				key: 0,
				keys: {
					up: !1,
					down: !1,
					left: !1,
					right: !1,
					a: !1,
					b: !1,
					c: !1,
					menu: !1,
					quit: !1
				},
				lastKey: {
					up: !1,
					down: !1,
					left: !1,
					right: !1,
					a: !1,
					b: !1,
					c: !1,
					menu: !1,
					quit: !1
				},
				pressedKey: {
					up: !1,
					down: !1,
					left: !1,
					right: !1,
					a: !1,
					b: !1,
					c: !1,
					menu: !1,
					quit: !1
				},
				keyPressCtrl: {
					up: !0,
					down: !0,
					left: !0,
					right: !0,
					a: !0,
					b: !0,
					c: !0,
					menu: !0,
					quit: !0
				},
				keyDownGo: !1,
				keyUpGo: !1,
				keyPressedGo: !1,
				keyDownCallBack: null,
				keyUpCallBack: null,
				orientationChange: null,
				touchStart: null,
				touchEnd: null,
				touchMove: null,
				touchCancel: null,
				clickCallBack: null,
				mouseDownCallBack: null,
				mouseUpCallBack: null,
				mouseMoveCallBack: null,
				focused: !1,
				pageFocusCallBack: null,
				pageUnFocusCallBack: null,
				swipeCallBack: null,
				pageOffX: 0,
				pageOffY: 0,
				pageStarOffX: 0,
				pageStarOffY: 0,
				swipeDate: null,
				swipeTimeout: 200,
				swipeRange: 50
			},
			image: {
				imgs: {},
				imgObjs: [],
				initImgs: {},
				asyncImgObjs: {},
				imgCount: 0,
				countLoaded: 0,
				version: "",
				inited: !1
			},
			audio: {
				audios: {}
			},
			ajax: {
				xhrObj: null,
				pool: [],
				poolLength: 5,
				date: null,
				isTimeout: !1,
				param: {
					type: "get",
					data: null,
					dataType: "json",
					url: "",
					xhr: null,
					timeout: 5e3,
					before: function(e) {},
					success: function(e, t) {},
					error: function(e, t) {},
					complete: function(e) {}
				}
			},
		}
  • fillStyle: 用于图形内部的颜色
  • fillRect: 用于绘制一个填充的矩形
  • strokeStyle: 用于设置图形轮廓的颜色
  • drawImage: 用于绘制图像
request: {
				gets: []
			},
			buttonLayout: {
				buttons: [],
				Button: t(function(e) {
						this.id = e.id,
							this.value = e.value,
							this.x = e.x,
							this.y = e.y,
							this.width = e.width,
							this.height = e.height,
							this.bgColor = e.bgColor,
							this.bgStroke = e.bgStroke,
							this.stroke = e.stroke,
							this.font = e.font,
							this.imageId = e.imageId,
							this.sx = e.sx,
							this.sy = e.sy,
							this.color = e.color,
							this.hx = e.hx,
							this.hy = e.hy,
							this.hColor = e.hColor,
							this.dex = e.dex,
							this.dey = e.dey,
							this.deColor = e.deColor,
							this.hided = e.hided,
							this.disabled = e.disabled,
							this.path = e.path,
							this.hovered = !1,
							this.repeated = !1,
							this.pressed = !1,
							this.released = !1,
							this.goned = !1,
							this.cacheId = "buttonLayoutCache_" + this.id,
							this.setDelay(e.delay).refresh()
					},
					null, {
						refresh: function() {
							m.canvas.pass(this.cacheId, this.width * 3, this.height),
								this.imageId == "" ? (this.bgColor != "" && m.canvas.fillStyle(this.bgColor).fillRect(0, 0, this.width, this.height).fillRect(this.width, 0, this.width, this.height).fillRect(this.width * 2, 0, this.width, this.height), this.bgStroke != "" && m.canvas.strokeStyle(this.bgStroke).strokeRect(1, 1, this.width - 2, this.height - 2).strokeRect(this.width + 1, 1, this.width - 2, this.height - 2).strokeRect(this.width * 2 + 1, 1, this.width - 2, this.height - 2)) : m.canvas.drawImage(this.imageId, this.sx, this.sy, this.width, this.height, 0, 0, this.width, this.height).drawImage(this.imageId, this.hx, this.hy, this.width, this.height, this.width, 0, this.width, this.height).drawImage(this.imageId, this.dex, this.dey, this.width * 2, this.height, this.width * 2, 0, this.width, this.height);
							if (this.value != "") {
								var e = m.canvas.font(this.font).measureText(this.value),
									t = this.width - e.width >> 1,
									n = (this.height - e.height >> 1) + parseInt(this.font) - 2;
								this.stroke != "" && m.canvas.fillStyle(this.stroke).fillText(this.value, t - 1, n).fillText(this.value, t, n - 1).fillText(this.value, t + 1, n).fillText(this.value, t, n + 1).fillText(this.value, t + this.width - 1, n).fillText(this.value, t + this.width, n - 1).fillText(this.value, t + this.width + 1, n).fillText(this.value, t + this.width, n + 1).fillText(this.value, t + this.width * 2 - 1, n).fillText(this.value, t + this.width * 2, n - 1).fillText(this.value, t + this.width * 2 + 1, n).fillText(this.value, t + this.width * 2, n + 1),
									m.canvas.fillStyle(this.color).fillText(this.value, t, n).fillStyle(this.hColor).fillText(this.value, t + this.width, n).fillStyle(this.deColor).fillText(this.value, t + this.width * 2, n),
									e = t = n = null
							}
							return m.canvas.pass(),
								this
						},
						show: function() {
							return this.hided = !1,
								this
						},
						hide: function() {
							return this.hided = !0,
								this
						},
						disable: function(e) {
							return this.disabled = e,
								this
						},
						setPath: function(e, t) {
							return this.setDelay(t).path = e || [],
								this
						},
						endPath: function() {
							return this.path.length == 0
						},
						gone: function(e, t) {
							return this.setPath(e, t).goned = !0,
								this
						},
						setDelay: function(e) {
							return this.delay = e || 0,
								this.delayDate = null,
							this.delay > 0 && (this.delayDate = Date.now()),
								this
						},
						action: function() {
							if (this.hided) return this;
							this.delayDate && Date.now() - this.delayDate >= this.delay && (this.delayDate = null);
							if (!this.delayDate && this.path.length > 0) {
								var e = this.path.shift();
								this.x += e[0],
									this.y += e[1],
									e = null
							}
							return this
						},
						render: function() {
							return this.hided ? this: (m.canvas.drawCache(this.cacheId, this.hovered ? this.width: this.disabled ? this.width * 2 : 0, 0, this.width, this.height, this.x, this.y, this.width, this.height), this)
						},
						disposed: function() {
							return this
						}
					})
			}
		},
r = {
			canvas: {
				context: {
					base: 0
				},
				graphics: {
					HCENTER: 1,
					VCENTER: 2,
					LEFT: 4,
					RIGHT: 8,
					TOP: 16,
					BOTTOM: 32,
					ANCHOR_LT: 20,
					ANCHOR_LV: 6,
					ANCHOR_LB: 36,
					ANCHOR_HT: 17,
					ANCHOR_HV: 3,
					ANCHOR_HB: 33,
					ANCHOR_RT: 24,
					ANCHOR_RV: 10,
					ANCHOR_RB: 40
				},
				trans: {
					TRANS_MIRROR: 2,
					TRANS_NONE: 0,
					TRANS_ROT90: 5,
					TRANS_ROT180: 3,
					TRANS_ROT270: 6,
					TRANS_MIRROR_ROT90: 7,
					TRANS_MIRROR_ROT180: 1,
					TRANS_MIRROR_ROT270: 4
				}
			},
			event: {
				key: {
					up: 38,
					down: 40,
					left: 37,
					right: 39,
					a: 90,
					b: 88,
					c: 67,
					menu: 49,
					quit: 50
				}
			},
			system: {
				gameFlowType: {
					menu: 0,
					run: 1,
					stop: 2,
					over: 3,
					zone: 4,
					active: 5,
					loadImage: 6,
					loadedImage: 7
				}
			}
		},
  • getOffsetX:指 offsetX 属性,是一个只读属性,表示触发事件的位置相对于目标元素内边距边缘 (padding edge) 的 X 坐标位置。如果事件发生在子元素上,则计算的是相对于最近的有定位(position 不为 static)祖先元素的偏移量;该属性属于鼠标事件对象的一部分
  • changedTouches:说到changedTouches,那需要提及的就是移动端滑屏touch事件,刚开始触摸事件touchstarttouchmovetouchend是苹果操作系统Safari浏览器新添加的事件;主要是IOS大多设备没有鼠标及键盘,所以在移动Safari浏览器开发交互性网页时,PC端的鼠标及键盘事件是远远不够的;接下来看看代码中应用到的touch事件
  • touches:当前位于屏幕上的所有手指触摸点的一个列表
  • targetTouches:当前元素对象上所有触摸点的列表
  • changedTouches:涉及当前事件的触摸点的列表
    每个触摸点对应的Touch都有三对重要的属性:(clientX/clientY)、(pageX/pageY)、(screenX/screenY)
    e.changedTouches.length表示获取手指的个数
    e.changedTouches[0].pageX表示获取坐标
i = {
			getCanvasDom: function() {
				var e;
				return function() {
					return e || (e = m.getDom(n.canvas.defaultId)),
						e
				}
			} (),
			getOffsetX: function(e) {
				return e.offsetX || (e.changedTouches && e.changedTouches[0] ? e.changedTouches[0].clientX - i.getCanvasDom().offsetLeft: e.clientX - i.getCanvasDom().offsetLeft) || 0
			},
			getOffsetY: function(e) {
				return e.offsetY || (e.changedTouches && e.changedTouches[0] ? e.changedTouches[0].clientY - i.getCanvasDom().offsetTop: e.clientY - i.getCanvasDom().offsetTop) || 0
			},

今天的内容有些多,我们先消化这些吧,后面的下一次继续😜😜😜

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Batch Normalization学习笔记

文章目录 一、为何引入 Batch Normalization二、具体步骤1、训练阶段2、预测阶段 三、关键代码实现四、补充五、参考文献 一、为何引入 Batch Normalization 现在主流的卷积神经网络几乎都使用了批量归一化&#xff08;Batch Normalization&#xff0c;BN&#xff09;1&#xf…

JavaSec系列 | 动态加载字节码

视频教程在我主页简介或专栏里 目录&#xff1a; 动态加载字节码 字节码 加载远程/本地文件 利用defineClass()直接加载字节码 利用TemplatesImpl加载字节码 动态加载字节码 字节码 Java字节码指的是JVM执行使用的一类指令&#xff0c;通常被存储在.class文件中。 加载远程…

第十四讲 JDBC数据库

1. 什么是JDBC JDBC&#xff08;Java Database Connectivity&#xff0c;Java数据库连接&#xff09;&#xff0c;它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系型数据库&#xff0c;并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作…

JVM面试题解,垃圾回收之“分代回收理论”剖析

一、什么是分代回收 我们会把堆内存中的对象间隔一段时间做一次GC&#xff08;即垃圾回收&#xff09;&#xff0c;但是堆内存很大一块&#xff0c;内存布局分为新生代和老年代、其对象的特点不一样&#xff0c;所以回收的策略也应该各不相同 对于“刚出生”的新对象&#xf…

电脑如何访问手机文件?

手机和电脑已经深深融入了我们的日常生活&#xff0c;无时无刻不在为我们提供服务。除了电脑远程操控电脑外&#xff0c;我们还可以在电脑上轻松地访问Android或iPhone手机上的文件。那么&#xff0c;如何使用电脑远程访问手机上的文件呢&#xff1f; 如何使用电脑访问手机文件…

ThinkPHP 8模型与数据的插入、更新、删除

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

【MySQL】数据库基础知识

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;【MySQL】数据库基础知识 发布时间&#xff1a;2025.1.21 隶属专栏&#xff1a;MySQL 目录 什么是数据库为什么要有数据库数据库的概念 主流数据库mysql的安装mysql登录使用一下mysql显示数据库内容创建一个数据库创…

【线性代数】基础版本的高斯消元法

[精确算法] 高斯消元法求线性方程组 线性方程组 考虑线性方程组&#xff0c; 已知 A ∈ R n , n , b ∈ R n A\in \mathbb{R}^{n,n},b\in \mathbb{R}^n A∈Rn,n,b∈Rn&#xff0c; 求未知 x ∈ R n x\in \mathbb{R}^n x∈Rn A 1 , 1 x 1 A 1 , 2 x 2 ⋯ A 1 , n x n b 1…

高等数学学习笔记 ☞ 微分方程

1. 微分方程的基本概念 1. 微分方程的基本概念&#xff1a; &#xff08;1&#xff09;微分方程&#xff1a;含有未知函数及其导数或微分的方程。 举例说明微分方程&#xff1a;&#xff1b;。 &#xff08;2&#xff09;微分方程的阶&#xff1a;指微分方程中未知函数的导数…

HarmonyOS基于ArkTS卡片服务

卡片服务 前言 Form Kit&#xff08;卡片开发框架&#xff09;提供了一种在桌面、锁屏等系统入口嵌入显示应用信息的开发框架和API&#xff0c;可以将应用内用户关注的重要信息或常用操作抽取到服务卡片&#xff08;以下简称“卡片”&#xff09;上&#xff0c;通过将卡片添加…

Java复习第四天

一、代码题 1.相同的树 (1)题目 给你两棵二叉树的根节点p和q&#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1: 输入:p[1,2,3]&#xff0c;q[1,2,3] 输出:true示例 2: 输…

全面了解 Web3 AIGC 和 AI Agent 的创新先锋 MelodAI

不管是在传统领域还是 Crypto&#xff0c;AI 都是公认的最有前景的赛道。随着数字内容需求的爆炸式增长和技术的快速迭代&#xff0c;Web3 AIGC&#xff08;AI生成内容&#xff09;和 AI Agent&#xff08;人工智能代理&#xff09;正成为两大关键赛道。 AIGC 通过 AI 技术生成…

新能源汽车充电桩选型以及安装应用

摘要:随着当前经济的不断发展,国家的科技也有了飞速的进步,传统的燃油汽车已经不能适应当前社会的发展,不仅对能源造成巨大的消耗,还对环境造成了污染,当前一种新型的交通运输工具正在占领汽车市场。在环境问题和能源问题愈发严重的当今社会,节能减排已经成为全世界的共同课题,…

一个vue项目npm install失败的问题解决方案

vue的项目一直是史上最难的最烦的问题&#xff0c;今天给别人做毕设单子想在gitee上拉项目二开的时候&#xff0c;由于很久没写过vue项目已经生疏了&#xff0c;在拿到项目之后我还是例行完成最常见的步骤&#xff1a; 1、npm init -y 初始化 2、npm install 用npm把这个项目…

计算机网络 (55)流失存储音频/视频

一、定义与特点 定义&#xff1a;流式存储音频/视频是指经过压缩并存储在服务器上的多媒体文件&#xff0c;客户端可以通过互联网边下载边播放这些文件&#xff0c;也称为音频/视频点播。 特点&#xff1a; 边下载边播放&#xff1a;用户无需等待整个文件下载完成即可开始播放…

UE求职Demo开发日志#6 测试用强化页面UI搭建

1 反向实现思路设计 先看最终效果&#xff1a; 先做了一个大致的分区&#xff0c;右侧的上半部分用来显示数据&#xff0c;下半部分用来强化和显示需要的材料&#xff0c;至于这个背景设定上强化应该叫什么&#xff0c;。。。。&#xff0c;还没定&#xff0c;反正应该不叫强…

python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加

【1】引言 前序已经学习了直接在画布上使用掩模&#xff0c;会获得彩色图像的多种叠加效果&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;四十&#xff09;掩模&#xff1a;三通道图像的局部覆盖-CSDN博客 这时候如果更进一步&#xff0c;直接…

SpringCloudAlibaba 服务保护 Sentinel 项目集成实践

目录 一、简介1.1、服务保护的基本概念1.1.1、服务限流/熔断1.1.2、服务降级1.1.3、服务的雪崩效应1.1.4、服务的隔离的机制 1.2、Sentinel的主要特性1.3、Sentinel整体架构1.4、Sentinel 与 Hystrix 对比 二、Sentinel控制台部署3.1、版本选择和适配3.2、本文使用各组件版本3.…

窥探QCC518x-308x系列与手机之间的蓝牙HCI记录与分析 - 耳机篇

上一篇是介绍如何窥探手机端Bluetooth的HCI log, 本次介绍是如何窥探Bluetooth的HCI log-耳机篇. 这次跟QCC518x/QCC308x测试的手机是Samsung S23 Ultra. QCC518x/QCC308x透过HCI界面取得Log教学. 步骤1: 开启QMDE -> 选择ADK r1102 QCC3083 Headset workspace.步骤2: 点…

C++ list 容器用法

C list 容器用法 C 标准库提供了丰富的功能&#xff0c;其中 <list> 是一个非常重要的容器类&#xff0c;用于存储元素集合&#xff0c;支持双向迭代器。<list> 是 C 标准模板库&#xff08;STL&#xff09;中的一个序列容器&#xff0c;它允许在容器的任意位置快速…