当前位置: 首页 > article >正文

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

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 distance
        let angle
        const 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.kler.cn/news/283713.html

相关文章:

  • 解决linux每次打开新终端都要重新source ~/.bashrc问题
  • word文档转html(只支持段落和表格)
  • git 拉取或推送到指定分支
  • IPython 使用技巧整理
  • nginx启动报错:worker_connections exceed open file resource limit: 1024
  • ES6基础----Map的使用
  • 【问题分析】CtsWindowManagerDeviceAnimations【Android15】
  • SpringBoot中@SchedulerLock注解实现定时任务中分布式锁的使用
  • CTFhub通关攻略-SSRF篇【1-5关】
  • windows安装Docker的步骤
  • 内联函数与动态内存分配
  • URP custompasscustom render objects
  • c++多线程交替输出
  • 启动盘如何复原
  • 【一文详解】内外网文件摆渡系统,解决网间数据安全传输问题
  • 【Python进阶(十二)】——自然语言处理
  • 《华为云 AI:开启智能未来的钥匙》
  • zsh 的补全系统
  • 数字芯片设计验证经验分享(第三部分):将ASIC IP核移植到FPGA上——如何确保性能与时序以完成充满挑战的任务!
  • 【FRP 内网穿透】
  • 【问题分析】SetupWizard退出动画卡住【Android15】
  • 【零知识证明】Groth16
  • GAMES202——作业3 Screen Space Ray Tracing
  • 创建型设计模式-构建器(builder)模式-python实现
  • 35. 交错动画 导航列表项的悬停和聚焦效果
  • Linux下UDP编程
  • InternVL 多模态模型部署微调实践
  • 物联网平台组件2: 平台校验规则
  • 如何构建社区康养养老系统:Java SpringBoot与Vue实战养老管理系统
  • uniapp的锁屏上文字的显示与隐藏