nipplejs(虚拟游戏操作杆)跟fabric(canvas缩放、旋转)

ops/2024/10/22 12:34:06/

nipplejs

nipplejs 是由 Yoann Moinet 创建的一个轻量级JavaScript库,它提供了虚拟摇杆的实现,特别适用于触摸屏设备上的交互式应用,如游戏或硬件控制面板。通过这个库,开发者可以轻松地在Web页面上集成可操作的虚拟操纵杆。

npm:https://www.npmjs.com/package/nipplejs

实现需求:使用操作杆控制物体上下左右进行移动

效果如下: 

代码如下: 

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Clip Image to Irregular Polygon</title><style>.front {background-color: #fff !important;}.back {background-image: url('./j.png') !important;background-size: cover !important;}</style>
</head><body><div id="joystick-container" style="width: 300px; height: 300px; position: relative;"></div><div id="moving-div" style="width: 50px; height: 50px; background-color: red; position: absolute;"></div><script src="https://cdn.jsdelivr.net/npm/nipplejs@latest/dist/nipplejs.min.js"></script><script>const options = {zone: document.getElementById('joystick-container'),mode: 'static',size: 100,position: {left: '50%',top: '50%'},color: '#999999',};const manager = nipplejs.create(options);const movingDiv = document.getElementById('moving-div');let posX = 0;let posY = 0;let distancelet angleconst speedFactor = 0.05;let autoMoveInterval = null;const stopAutoMove = () => {if (autoMoveInterval) {clearInterval(autoMoveInterval);autoMoveInterval = null;}};const startAutoMoveRight = () => {if (!autoMoveInterval) {autoMoveInterval = setInterval(() => {posX += Math.cos(angle) * distance;posY += Math.sin(angle) * distance;movingDiv.style.transform = `translate(${posX}px, ${-posY}px)`;}, 10);}};manager.on('start', () => console.log('Start'));manager.on('move', (evt, data) => {console.log(data.distance, data.angle.radian)if (data && data.direction) {distance = data.distance * speedFactor;angle = data.angle.radian;posX += Math.cos(angle) * distance;posY += Math.sin(angle) * distance;movingDiv.style.transform = `translate(${posX}px, ${-posY}px)`;if (data.distance >= 5) {startAutoMoveRight();}}});manager.on('end', () => {console.log('End');stopAutoMove();// posX = 0;// posY = 0;// movingDiv.style.transform = `translate(${posX}px, ${posY}px)`;});</script></body></html>

fabric

Fabric.js是一个可以简化Canvas程序编写的库。 Fabric.js为Canvas提供所缺少的对象模型

官网地址:Fabric.js Javascript Canvas Library

实现需求:可以控制渲染在Canvas内图片缩放、移动跟旋转

效果如下:

代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Clip Image to Irregular Polygon</title><script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.6/fabric.min.js"></script><style>canvas {border: 1px solid #000;}</style>
</head><body><script>const canvasElement = document.createElement('canvas');canvasElement.id = 'myCanvas';canvasElement.width = 300;canvasElement.height = 300; document.body.appendChild(canvasElement);const canvas = new fabric.Canvas(canvasElement);// 加载图像并设置裁剪路径fabric.Image.fromURL('./640.png', function (img) {img.set({left: 0,top: 0,scaleX: 1,scaleY: 1,angle: 0});canvas.add(img);});</script>
</body></html>

或者

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Clip Image to Irregular Polygon</title><script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.6/fabric.min.js"></script><style>canvas {border: 1px solid #000;}</style>
</head><body><canvas id="canvasID" width='500' height='500'></canvas><script>const canvas = new fabric.Canvas('canvasID');// 加载图像并设置裁剪路径fabric.Image.fromURL('./640.png', function (img) {img.set({left: 0,top: 0,scaleX: 1,scaleY: 1,angle: 0});canvas.add(img);});</script>
</body></html>


http://www.ppmy.cn/ops/103851.html

相关文章

ORACLE 统计信息的备份与恢复

备份 --需要先创建统计信息基础表 exec dbms_stats.create_stat_table(USER1,STAT_TIMESTAMP); --导出某个用户的所有统计信息 exec dbms_stats.export_schema_stats(USER1,STAT_TIMESTAMP);--测试(插入100条&#xff0c;更新统计信息&#xff0c;略) select num_rows,last_ana…

《黑神话:深度探索与攻略指南》——虎先锋隐藏门在哪里

在《黑神话悟空》这款扣人心弦的游戏中&#xff0c;探索隐藏区域和发现秘密宝箱是许多玩家的乐趣所在。特别是戌狗地窖中那个神秘的宝箱&#xff0c;它不仅藏有泡酒物虎舍利等珍贵道具&#xff0c;更是对玩家探索能力的一次考验。然而&#xff0c;不少玩家在寻找虎先锋隐藏门时…

[java][web]javaWeb中获取路径

Thread.currentThread().getContextClassLoader().getResource("") String targetDirrequest.getSession().getServletContext().getRealPath("/upload");提供的两行代码涉及到Java中的类加载器和Web应用上下文路径的使用。 Thread.currentThread().getCon…

element的el-date-picker组件实现只显示年月日时分,不显示秒

需求&#xff1a;使用element的el-date-picker组件&#xff0c;只显示时分&#xff0c;不消失秒 效果&#xff1a; 解决方法&#xff1a; <el-date-pickerv-model"ruleForm.startTime"type"datetime"placeholder"开始时间"format"yyyy-…

AI安全立法:加州新法案的争议与未来影响

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【三十四】springboot+easyRule初识规则引擎

代码场景&#xff1a;厂里有几个员工&#xff0c;现在厂长颁布了新的厂规关于薪资发放&#xff0c;如下&#xff1a; 1、加班时长超过80小时的&#xff0c;一个小时10块钱&#xff1b;不满80小时的&#xff0c;不算加班。2、上班打卡迟到3次以下的不扣钱&#xff0c;3次以上的一…

【MySQL】字节跳动MySQL连环40问(网图)

本文首发于 ❄️慕雪的寒舍 字节MySQL连环40问&#xff0c;网图 虽然感觉这玩意和字节跳动没关系&#xff0c;但是管他的&#xff1f;直接开始回答&#xff01; 1.MySQL中有哪几种锁&#xff1f; 会的不全&#xff0c;所以查的GPT MySQL中有多种类型的锁&#xff0c;主要包括以…

C++:引用

引用就是某一变量的一个别名。 引用必须要初始化。 引用可以代替地址传参&#xff0c;而且在C中常用引用而不是地址传参。 引用没有空间&#xff0c;没有指针&#xff0c;没有多级引用。 指针有引用。 引用的格式为&#xff1a;类型标识符&引用名目标变量名 例如&…