JS 实现游戏流畅移动与按键立即响应

AWSD 按键移动

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			.box1 {
				width: 400px;
				height: 400px;
				background: yellowgreen;
				margin: 0 auto;
				position: relative;
			}

			.box2 {
				width: 50px;
				height: 50px;
				background: aqua;
				position: absolute;
			}
		</style>
	</head>
	<body>
		<div class="box1">
			<div class="box2"> </div>
		</div>
	</body>
	<script>
		var odiv1 = document.getElementsByClassName("box1")[0];
		var odiv2 = document.getElementsByClassName("box2")[0];
		var ax = 0; // 玩家加速方向
		var ay = 0;
		var speedx = 0; // 玩家移动速度
		var speedy = 0;
		// 四个键盘按键状态,1是按下,0是抬起
		var keya = 0;
		var keyw = 0;
		var keys = 0;
		var keyd = 0;
		
		// 游戏循环
		var int=self.setInterval("move()",10);
		
		function move(){
			var T = odiv2.offsetTop //盒子距离最顶部的距离
			var L = odiv2.offsetLeft // 盒子距离最左边的距离
			if (keya == 1 && keyd == 0) {
				ax -= 1;
			} else if (keya == 0 && keyd == 1) {
				ax += 1;
			}
			
			if (keyw == 1 && keys == 0) {
				ay -= 1;
			} else if (keyw == 0 && keys == 1) {
				ay += 1;
			}
			
			
			if (ax < -1) {
				ax = -1
			} else if (ax > 1) {
				ax = 1
			}
			
			if (ay < -1) {
				ay = -1;
			} else if (ay > 1) {
				ay = 1;
			}
			
			if (keya == 1 || keyd == 1) {
				speedx += ax;
			}
			
			if (keyw == 1 || keys == 1) {
				speedy += ay;
			}
			
			if(keya==0&&keyd==0){
				speedx=0;
				ax=0;
			}
			
			if(keyw==0&&keys==0){
				speedy=0;
				ay=0;
			}
			
			// 速度防止过快
			if (speedx > 5) {
				speedx = 5
			} else if (speedx < -5) {
				speedx = -5
			}
			
			if (speedy > 5) {
				speedy = 5
			} else if (speedy < -5) {
				speedy = -5
			}
			// console.log(speedx);
			
			// 位置防止出界
			if (T + speedy < 0) {
				T = 0;
			} else if (T + speedy > 500) {
				T = 500;
			} else {
				T += speedy;
			}
			
			if (L + speedx < 0) {
				L = 0;
			} else if (L + speedx > 500) {
				L = 500;
			} else {
				L += speedx;
			}
			
			odiv2.style.left = L + "px"
			odiv2.style.top = T + "px"
		}
		
		window.onkeydown = function(e) {
			// 通过监听按键按下时的操作
			var e = e || window.event;
			// 取消打印
			// alert(e.keyCode)

			console.log("按键按下:" + e.keyCode)
			//获取当前元素到body的距离 
			var T = odiv2.offsetTop //盒子距离最顶部的距离
			var L = odiv2.offsetLeft // 盒子距离最左边的距离
			if (e.keyCode == 87) { //判断当前按键是不是w按键
				// console.log('W')
				// var T = T - 5
				// if (T < 0) {
				// 	T = 0
				// }
				// odiv2.style.top = T + "px"
				// ay  -=1;
				keyw = 1;
			}
			if (e.keyCode == 83) { //判断当前按键是不是S按键
				// console.log('S')
				// var T = T + 5
				// if (T > odiv1.offsetWidth - odiv2.offsetWidth) {
				// 	T = odiv1.offsetWidth - odiv2.offsetWidth
				// }
				// odiv2.style.top = T + "px"
				// ay += 1;
				keys = 1;
			}
			if (e.keyCode == 65) { //判断当前按键是不是A按键
				// console.log('A')
				// var L = L - 5
				// if (L < 0) {
				// 	L = 0
				// }
				// odiv2.style.left = L + "px"
				// ax  -=1;
				keya = 1;
			}
			if (e.keyCode == 68) { //判断当前按键是不是D按键
				// console.log('D')
				// var L = L + 5
				// if (L > odiv1.offsetHeight - odiv2.offsetHeight) {
				// 	L = odiv1.offsetHeight - odiv2.offsetHeight
				// }
				// odiv2.style.left = L + "px"
				// ax += 1;
				keyd = 1;
			}

			
		}



		window.onkeyup = function(e) {
			var e = e || window.event;
			if (e.keyCode == 87) { //判断当前按键是不是w按键
				// console.log('W')
				// ay = 0;
				keyw=0;
			}
			if (e.keyCode == 83) { //判断当前按键是不是S按键
				// console.log('S')
				// ay = 0;
				keys=0;
			}
			if (e.keyCode == 65) { //判断当前按键是不是A按键
				// console.log('A')
				// ax = 0;
				keya=0;
			}
			if (e.keyCode == 68) { //判断当前按键是不是D按键
				// console.log('D')
				// ax = 0;
				keyd=0;
			}
		}
	</script>
</html>

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

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

相关文章

安全见闻-泷羽sec课程笔记

编程语言 C语言&#xff1a;一种通用的、面向过程的编程语言&#xff0c;广泛应用于系统软件和嵌入式开发。 C:在C语言基础上发展而来&#xff0c;支持面向对象编程&#xff0c;常用于尊戏开发、高性能计算等领域。 Java:一种广泛使用的面问对象编程语言&#xff0c;具有跨平台…

vue跳转传参

path 跳转只能使用 query 传参 ,name 跳转都可以 params &#xff1a;获取来自动态路由的参数 query &#xff1a;获取来自 search 部分的参数

Android 最新的AndroidStudio引入依赖失败如何解决?如:Failed to resolve:xxxx

错误信息&#xff1a; 在引入依赖时报错&#xff1a;Failed to resolve: xxx.xxxx:1.1.0 解决方案&#xff1a; 需要修改maven库的代理&#xff0c;否则就需要翻墙编译 新的AndroidStudio版本比较坑&#xff0c;修改代理的位置发生了变化&#xff1a; 最新变化&#xff1a;…

Mysql每日一题(行程与用户,困难※)

今天给大家分享一个截止到目前位置&#xff0c;我遇到最难的一道mysql题目&#xff0c;非常建议大家亲手做一遍 完整代码如下&#xff0c;这道题的主要难点是它有两个外键&#xff0c;以前没遇到过&#xff0c;我也没当回事&#xff0c;分享一下错误经验哈 当时我写的where判断…

深度学习知识点5-马尔可夫链

马尔科夫链的思想&#xff1a;过去所有的信息都已经被保存到了现在的状态&#xff0c;基于现在就可以预测未来。 The future is independent of the past given the present 马尔可夫链属于随机过程课程&#xff08;使用统计模型一些事物的过程进行预测和处理&#xff09; 概…

飞凌嵌入式RK3576核心板已适配Android 14系统

在今年3月举办的RKDC2024大会上&#xff0c;飞凌嵌入式FET3576-C核心板作为瑞芯微RK3576处理器的行业首秀方案重磅亮相&#xff0c;并于今年6月率先量产发货&#xff0c;为客户持续稳定地供应&#xff0c;得到了众多合作伙伴的认可。 FET3576-C核心板此前已提供了Linux 6.1.57…

css文字间距撑满横向距离

效果&#xff1a; 代码&#xff1a; 、 text-align:justify;text-align-last: justify;

Dynamo介绍

一、介绍 1、简介 Amazon DynamoDB 是由 AWS 提供的一种完全托管的 NoSQL 数据库服务&#xff0c;适用于高性能、可扩展的应用程序。它设计用于处理大规模的数据存储和高速数据访问&#xff0c;广泛应用于需要低延迟、高吞吐量的场景&#xff0c;如移动应用、电商、游戏后端、…

【Linux】HTTP协议和HTTPS加密

文章目录 HTTP1、概念2、认识URL3、协议格式、请求方法和状态码4、HTTP请求和响应报头5、Cookie和Session HTTPS1、对称和非对称加密2、对称非对称加密安全分析3、证书 HTTP 1、概念 我们在应用层定制协议时&#xff0c;不建议直接发送结构体对象&#xff0c;因为在不同的环境…

FlinkPipelineComposer 详解

FlinkPipelineComposer 详解 原文 背景 在flink-cdc 3.0中引入了pipeline机制&#xff0c;提供了除Datastream api/flink sql以外的一种方式定义flink 任务 通过提供一个yaml文件&#xff0c;描述source sink transform等主要信息 由FlinkPipelineComposer解析&#xff0c…

Python中如何获取HTTP请求的Response Body

目录 一、引言 二、使用urllib库获取Response Body 1. 基本用法 2. 发送POST请求 三、使用requests库获取Response Body 1. 安装requests库 2. 基本用法 3. 发送POST请求 4. 处理JSON响应 四、高级用法 1. 处理请求头 2. 设置超时 3. 处理Cookies 五、案例&#…

从华为到创业公司

我有一个朋友&#xff0c;在华为工作了很长一段时间&#xff0c;一年多前&#xff0c;他从华为出来到了一家创业公司。 周末趁着有时间&#xff0c;我跟他聊了下关于从华为到创业公司的一些问题&#xff0c;总结给大伙看看。 ▎1 在华为工作和在创业公司工作最大的差别是什么呢…

如何解决由于找不到d3dx9_43.dll导致游戏启动失败?这里是如何解决的完整指南

遇到“由于找不到d3dx9_43.dll”错误时&#xff0c;很多用户可能会感到困惑和无助。这个问题通常发生在尝试启动游戏或使用基于DirectX的应用程序时。d3dx9_43.dll是Microsoft DirectX软件的一部分&#xff0c;专门用于处理复杂的图形计算&#xff0c;缺少它意味着某些图形功能…

Matlab2022b安装MinGW64

1 问题引入 能找到这个问题的&#xff0c;一定就是在matlab中用mex这个编译命令的时候出现下面的错误&#xff0c;才会来找解决的办法。 首先在网上众多资料中一定是让你先去matlab窗口的这个Add-Ons进行添加&#xff0c;但是很多情况下因为大家装的版本问题&#xff0c;都会…

低代码可视化-uniapp开关选择组件-低码生成器

开关&#xff08;Switch&#xff09;选择组件是一种用户界面元素&#xff0c;允许用户在两种状态&#xff08;通常是开/关、是/否、启用/禁用等&#xff09;之间进行切换。这种组件在移动应用、桌面软件、网页以及物联网设备中广泛应用。以下是对开关Switch选择组件的详细介绍&…

蓝桥杯每日真题 - 第11天

题目&#xff1a;&#xff08;合并数列&#xff09; 题目描述&#xff08;14届 C&C B组D题&#xff09; 解题思路&#xff1a; 题意理解&#xff1a;给定两个数组&#xff0c;目标是通过若干次合并操作使两个数组相同。每次合并操作可以将数组中相邻的两个数相加&#xff…

【2024软考架构案例题】你知道什么是 RESTful 风格吗?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

面试经典 150 题:20、2、228

20. 有效的括号 参考代码 #include <stack>class Solution { public:bool isValid(string s) {if(s.size() < 2){ //特判&#xff1a;空字符串和一个字符的情况return false;}bool flag true;stack<char> st; //栈for(int i0; i<s.size(); i){if(s[i] ( |…

NFS-Ganesha 核心架构解读

NFSv4 简要概述 NFS 这个协议( NFSv2 )最初由 Sun Microsystems 在 1984 年设计提出&#xff0c;由于存在一些不足&#xff0c;因此在随后由几家公司联合推出了 NFSv3。到了 NFSv4 时&#xff0c;开发完全由 IETF 主导&#xff0c;设计目标是&#xff1a; 提高互联下的 NFS 访…

由播客转向个人定制的音频频道(1)平台搭建

项目的背景 最近开始听喜马拉雅播客的内容&#xff0c;但是发现许多不方便的地方。 休息的时候收听喜马拉雅&#xff0c;但是还需要不断地选择喜马拉雅的内容&#xff0c;比较麻烦&#xff0c;而且黑灯操作反而伤眼睛。 喜马拉雅为代表的播客平台都是VOD 形式的&#xff0…