唉~

唉!

唉~

这里我是封装成一个组件了,可以直接CV

<template><div id="joystick"><div id="stick"></div></div>
</template>
<script setup>
import { onMounted } from "vue";
onMounted(() => {// 标识当前触摸时的IDlet ID: number | null;// 获取虚拟轮杆和轮杆的DOM元素let joystick = document.getElementById("joystick");let stick = document.getElementById("stick");// 计算虚拟轮杆和轮杆的尺寸和位置参数let joystickSize = joystick.offsetWidth; // 获取虚拟轮杆的宽度let stickSize = stick.offsetWidth; // 获取轮杆的宽度let maxDistance = joystickSize / 2 - stickSize / 2; // 计算轮杆最大可移动距离let centerX = joystickSize / 2; // 计算虚拟轮杆的中心点横坐标let centerY = joystickSize / 2; // 计算虚拟轮杆的中心点纵坐标let currentX = centerX; // 初始化轮杆的当前横坐标为中心点横坐标let currentY = centerY; // 初始化轮杆的当前纵坐标为中心点纵坐标let angle = 0; // 初始化轮杆的当前角度为0let distance = 0; // 初始化轮杆和中心点的距离为0let degrees = 0; // 初始化需要展现的角度// 更新轮杆的位置和角度function updateStickPosition(x, y) {// 计算轮杆和中心点的距离和角度let dx = x - centerX; // 计算轮杆和中心点的横向距离let dy = y - centerY; // 计算轮杆和中心点的纵向距离distance = Math.min(Math.sqrt(dx * dx + dy * dy), maxDistance); // 计算轮杆和中心点的距离,取最小值angle = (Math.atan2(dy, dx) * 180) / Math.PI; // 计算轮杆和中心点的角度,转换为角度值// 计算轮杆的当前位置currentX = centerX + distance * Math.cos((angle * Math.PI) / 180); // 计算轮杆的当前横坐标currentY = centerY + distance * Math.sin((angle * Math.PI) / 180); // 计算轮杆的当前纵坐标// 移动轮杆到当前位置stick.style.transform = "translate(" + (currentX - centerX) + "px, " + (currentY - centerY) + "px)"; // 移动轮杆到当前位置if (angle < 0) {degrees = Math.floor((angle * 180) / Math.PI + 360);} else {degrees = Math.floor((angle * 180) / Math.PI);}console.log(degrees);}// 鼠标按下事件处理函数joystick.addEventListener("mousedown", function (e) {e.preventDefault(); // 阻止默认事件const rect = joystick.getBoundingClientRect(); // 获取相对于视口信息updateStickPosition(e.clientX - rect.left, e.clientY - rect.top);//更新轮杆的位置和角度document.addEventListener("mousemove", onMouseMove); // 添加鼠标移动事件监听器document.addEventListener("mouseup", onMouseUp); // 添加鼠标松开事件监听器});// 触摸屏按下事件处理函数joystick.addEventListener("touchstart", function (e) {e.preventDefault(); // 阻止默认事件let touch = e.changedTouches[0]; // 获取第一个触摸点const rect = joystick.getBoundingClientRect();// 获取相对于视口信息updateStickPosition(touch.clientX - rect.left, touch.clientY - rect.top);//更新轮杆的位置和角度document.addEventListener("touchmove", onTouchMove); // 添加触摸屏移动事件监听器document.addEventListener("touchend", onTouchEnd); // 添加触摸屏松开事件监听器});// 鼠标移动事件处理函数function onMouseMove(e) {e.preventDefault(); // 阻止默认事件const rect = joystick.getBoundingClientRect(); // 获取相对于视口信息updateStickPosition(e.clientX - rect.left, e.clientY - rect.top);//更新轮杆的位置和角度}// 鼠标松开事件处理函数function onMouseUp(e) {e.preventDefault(); // 阻止默认事件document.removeEventListener("mousemove", onMouseMove); // 移除鼠标移动事件监听器document.removeEventListener("mouseup", onMouseUp); // 移除鼠标松开事件监听器updateStickPosition(centerX, centerY); // 将轮杆移动回中心点}// 触摸屏移动事件处理函数function onTouchMove(e) {e.preventDefault(); // 阻止默认事件for (let i = 0; i < e.changedTouches.length; i++) {// 获取触摸点let touch = e.changedTouches[i];// 查早当前的出点if (touch.identifier == ID) { // 获取相对于视口信息const rect = joystickDom.value.getBoundingClientRect();//更新轮杆的位置和角度updateStickPosition(touch.clientX - rect.left, touch.clientY - rect.top);}}let touch = e.changedTouches[0]; const rect = joystick.getBoundingClientRect();updateStickPosition(touch.clientX - rect.left, touch.clientY - rect.top);}// 触摸屏松开事件处理函数function onTouchEnd(e) {e.preventDefault(); // 阻止默认事件document.removeEventListener("touchmove", onTouchMove); // 移除触摸屏移动事件监听器document.removeEventListener("touchend", onTouchEnd); // 移除触摸屏松开事件监听器updateStickPosition(centerX, centerY); // 将轮杆移动回中心点ID = null; // 清除当前触摸的ID}
});
</script>
<style scoped>
#joystick {position: relative;width: 200px;height: 200px;border-radius: 50%;background-color: #ccc;
}#stick {position: absolute;top: 50%;left: 50%;width: 50px;height: 50px;margin-top: -25px;margin-left: -25px;border-radius: 50%;background-color: #f00;
}
</style>

虚拟轮杆实现触摸屏模拟游戏手柄相关推荐

  1. 问答| 在四轮驱动机器人(SSMR)运动学模型中,左右虚拟轮的线速度vl和vr如何得到?

    关注同名微信公众号"混沌无形",有趣好文! 原文链接:https://mp.weixin.qq.com/s/Fzrpn5_3TB6apqG2Ds1v5Q(包含原文PDF百度云下载链 ...

  2. Android 手机模拟游戏手柄(USB,C#,winio)

    Android 手机模拟游戏手柄(USB,C#,winio) 使用的知识点:Android服务器通过USB连接PC端,winio发送键盘消息,Socket编程,线程,Android多点触控 先说下思路 ...

  3. Android 模拟游戏手柄按键(跨进程 KeyEvent 事件)实践方案

    Android 模拟游戏手柄按键(跨进程 KeyEvent 事件)实践方案

  4. RoboGUIDE v2.3.1-ISO 1CD(自控软件,一款使用虚拟机器人控制技术的机器人模拟软件)

    RTI.ScopeTools.v4.0c.CP1.for.VxWorks-ISO 1CD VMware.VirtualCenter.v2.0-ISO 1CD(虚拟架构管理软件) VMware.Work ...

  5. 2020 CCF非专业级别软件能力认证第一轮(LGR-10)洛谷模拟试题试卷

    2020 CCF非专业级别软件能力认证第一轮 (LGR-10)洛谷模拟试题试卷 认证时间:2020年10月8日09:30-11:30 一.单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正 ...

  6. 微信 小程序 之PC端 不支持 wx.previewMedia 方法 故用自定义轮播图进行 模拟照片视频的播放

    微信小程序 自带的方法 wx.previewMedia 预览图片和视频. 图片 wx.previewImage 支持PC端可以进行播放, 视频没有找到对应的方法 在真机和手机端都可以进项展示,PC端不 ...

  7. 三菱fx3u plc程序自己写的三菱fx3u程序 有伺服定位控制 触摸屏 模拟量 FB模块 编程方式很清楚明了

    三菱fx3u plc程序自己写的三菱fx3u程序 有伺服定位控制 触摸屏 模拟量 FB模块 编程方式很清楚明了 适合初学者学习 :828668626283056工控老司机

  8. linux虚拟arm环境环境,Ubuntu 模拟ARM开发环境

    为了简化开发和测试过程,Ubuntu从9.10开始提供静态的ARM虚拟功能,可以直接在PC机上建立ARM机器的chroot环境,既可以编译,也可以测试程序.相比于交叉编译而言,这种方法虽然编译速度较慢 ...

  9. 虚拟蜜罐:从信息模拟到实现虚拟蜜罐技术

    前言:虚拟蜜罐是由一台计算机模拟的系统,但是可以响应发送给虚拟蜜罐的网络流量,今天我们来浅析一下虚拟蜜罐. 蜜罐可以运行任何操作系统和任意数量的服务.蜜罐根据交互程度(Level ofInvolvem ...

最新文章

  1. serverlet 区别_Servlet中/和/*的区别
  2. 项目发布错误的解决方法
  3. 对 C++ 历史的个人观点
  4. SpringBoot启动流程是怎样的
  5. xss 全编码两次_XSS进阶
  6. sql2008 服务器未响应,sql配置管理器,SQL server (MSSQLSERVER)开启不了,请求失败或服务器未响应....
  7. poj3159 Candies
  8. 推荐系统笔记二、矩阵分解协同过滤
  9. sina微博登录框和twitter的比较
  10. java代码性能优化
  11. Blender源代码编译(VS2019、win64_vc15)
  12. CSS:字体设置~笔记
  13. matlab eemd输出,如何使用eemd工具包
  14. linux沙箱隔离_linux沙箱技术
  15. 生活点滴记录-- 两点一线
  16. 西门子S7-1200控制V90伺服
  17. 华为交换机S5720S-52P-SI-AC配置web管理端IP地址
  18. 团队管理29--沟通理解层次图
  19. 压缩png命令cmd_PNG图片文件大小怎么改变
  20. 如何快速提升自己的能力?

热门文章

  1. 苹果审核上传附件上传不上去
  2. 新神魔大陆服务器维护,《新神魔大陆》8月20日合服维护公告
  3. 优思学院|怎么把DPMO/不良率换算成六西格玛水平?
  4. bugku sodirty
  5. 浅谈什么是保险生命表
  6. Logistic回归:成本函数
  7. 关于numpy的astype(bool)和astype(int)等等
  8. 跑步戴什么耳机比较好,五款专业运动的耳机排行
  9. Windows 工具集
  10. 谈谈AGV小车价格受什么因素影响