一个小的画布Canvas页面,记录点的轨迹

news2024/10/7 14:24:18

Hello大家好,好久没有更新了,最近在忙一些其他的事,今天说一下画布canvas,下面是我的代码,实现了一个点从画布的(0,0)到(canvas.width,canvas.height)的一个实现其中我在canvas里面加了一个背景,你们只需要把你们的图片放在上面即可实现一小段代码的运行,好久没有说知识点了!!慢慢会来的。打算更一些计网和数据库,暑假说吧!我是:

爱吃鸡爪zi!

话不多说,代码如下:建议从draw函数看起走

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <style>
    body {
      display: flex;
      justify-content: center;
      align-items: center;
      height: 100vh;
      margin: 0;
    }
    .container {
      text-align: center;
      font-family: Arial, sans-serif;
      border: 2px solid #000;
      padding: 20px;
      border-radius: 10px;
      box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
      height: 80vh;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
    }
    canvas {
      border: 1px solid #000;
      width: 80%;
      height: 50%;
    }
    .buttons {
      margin-top: 20px;
    }
    button {
      margin: 0 10px;
      padding: 10px 20px;
      font-size: 16px;
      cursor: pointer;
    }
  </style>
</head>
<body>
  <div class="container">
    <h1>路径安全活动展示</h1>
    <canvas id="myCanvas"></canvas>
    <div class="buttons">
      <button id="backButton">返回上一级</button>
      <button id="refreshButton">刷新</button>
      <button id="stopButton">停止动画</button>
    </div>
  </div>

  <script>
    var canvas = document.getElementById('myCanvas');
    var ctx = canvas.getContext('2d');
   
    // 设置画布的宽度和高度
    canvas.width = 400;
    canvas.height = 400;
    // 创建一个新的Image对象
    var backgroundImage = new Image();
    // 设置Image对象的src属性为你的图片URL
    backgroundImage.src = '../img/bg1.png';

    // 在图片加载完成后,绘制图片到画布上
    backgroundImage.onload = function() {
      ctx.drawImage(backgroundImage, 0, 0, canvas.width, canvas.height);
    };
    // 在图片加载完成后,绘制图片到画布上
    backgroundImage.onload = function() {
      ctx.drawImage(backgroundImage, 0, 0, canvas.width, canvas.height);
    };
    var obstacles = [
      {x:100 ,y:0 , size:15},
      { x: 50, y: 50, size: 10 },
      { x: 100, y: 100, size: 10 },
      {x:180 ,y:100 , size:15},
      { x: 150, y: 150, size: 10 },
      {x:170 ,y:210 , size:15},
      {x:250 ,y:210 , size:15},
      {x:250 ,y:260 , size:15},
      {x:380 ,y:260 , size:15}
    ];

    var redCircle = {
      x: 10,
      y: 10,
      speed: 0.6,
      direction: 'right'
    };

    var animationRunning = true;
    var redCircleVisible = true;

    function drawObstacles() {
      for (var i = 0; i < obstacles.length; i++) {
        var obstacle = obstacles[i];
        ctx.fillStyle = 'black';
        ctx.fillRect(obstacle.x, obstacle.y, obstacle.size, obstacle.size);
      }
    }

    function drawRedCircle() {
      if (redCircleVisible) {
        ctx.fillStyle = 'red';
        ctx.beginPath();
        ctx.arc(redCircle.x, redCircle.y, 10, 0, Math.PI * 2);
        ctx.fill();
      }
    }

    function updateRedCirclePosition() {
      if (redCircle.direction === 'right') {
        redCircle.x += redCircle.speed;
        if (redCircle.x >= canvas.width - 10) {
          redCircle.x = canvas.width - 10;
          redCircle.direction = 'down';
        }
      } else if (redCircle.direction === 'down') {
        redCircle.y += redCircle.speed;
        if (redCircle.y >= canvas.height - 10) {
          redCircle.y = canvas.height - 10;
          redCircleVisible = false;
          animationRunning = false;
          alert("红色点已到达右下角!");
        }
      }

      for (var i = 0; i < obstacles.length; i++) {
        var obstacle = obstacles[i];
        if (
          redCircle.x < obstacle.x + obstacle.size &&
          redCircle.x + 10 > obstacle.x &&
          redCircle.y < obstacle.y + obstacle.size &&
          redCircle.y + 10 > obstacle.y
        ) {
          if (redCircle.direction === 'right') {
            redCircle.direction = 'down';
          } else if (redCircle.direction === 'down') {
            redCircle.direction = 'right';
          }
        }
      }
    }

    function draw() {
        
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      ctx.drawImage(backgroundImage, 0, 0, canvas.width, canvas.height);
      drawObstacles();
      drawRedCircle();
      updateRedCirclePosition();
    }

    function animate() {
      if (animationRunning) {
        draw();
        requestAnimationFrame(animate);
      }
    }

    animate();
    // 按钮事件处理函数
    document.getElementById('backButton').addEventListener('click', function() {
      window.history.back();
    });

    document.getElementById('refreshButton').addEventListener('click', function() {
      window.location.reload();
    });

    document.getElementById('stopButton').addEventListener('click', function() {
      animationRunning = false;
      alert("动画已停止");
    });
  </script>
</body>
</html>

其中,没有使用什么算法,// 设置Image对象的src属性为你的图片URL
    backgroundImage.src = '../img/bg1.png';把这个的src换为自己的即可。下面是我的运行截图:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MYSQL数据库下载和安装(详细)

1.点击MySQL官网(后续照着图走) 2.软件下载完点击进入安装 设置要安装的路径然后点击OK,后面点击下一步 再点击下一步 MySQL推荐使用最新的数据库和相关客户端&#xff0c;mysql8换了加密插件&#xff0c;所以如果选第一种方式&#xff0c;很可能导致你的navicat等客户端连不上…

手把手教你,怎么用手机开发一个H5整蛊小游戏

前言&#xff1a; 相信在大家的认知里&#xff0c;做软件&#xff0c;做应用肯定都是通过电脑来进行开发的吧。但是你听说过用手机也可以开发软件吗&#xff1f;今天就教大家如何用手机轻松的开发出一款整蛊的H5小游戏。 首先我们需要借助一个工具CodeFlying&#xff0c;它能够…

为什么要分析电商用户数据?详解两大用户数据分析维度

零售电商行业的蓬勃发展带来了海量的客户数据&#xff0c;这些数据不仅记录了消费者的每一次点击、浏览、购买行为&#xff0c;还蕴含着巨大的商业价值。如何从这些数据中提炼出有价值的信息&#xff0c;成为电商企业提升竞争力、优化客户体验、实现可持续发展的关键。本文将深…

跟着AI学AI_08 NumPy 介绍

NumPy&#xff08;Numerical Python&#xff09;是一个用于科学计算的基础库&#xff0c;它为 Python 提供了支持大规模多维数组和矩阵 NumPy 介绍 NumPy&#xff08;Numerical Python&#xff09;是一个用于科学计算的基础库&#xff0c;它为 Python 提供了支持大规模多维数…

异常体系及自定义路径

异常( Exception) 定义&#xff1a; 异常代表程序出现的问题 图来自黑马程序员 分类&#xff1a; 运行时异常&#xff1a;RuntimeException以及其子类&#xff0c;编译阶段不会出现异常提醒&#xff0c;运行时出现的异常&#xff08;如数组越界异常&#xff09;编译时异常&am…

C++ 11 之 参数传递

c11参数传递.cpp #include <iostream> using namespace std;void swap1(int a, int b) {int temp a;a b;b temp;cout << "函数的a: " << a << endl;cout << "函数的b: " << b << endl; }void swap2(int *a,…

JUC并发编程第十一章——Synchronized与锁升级机制

1 入门知识介绍 synchronized锁&#xff0c;是不是默认实现了锁升级。代码中只需要直接使用synchronized&#xff0c;至于怎么从偏向锁升级为轻量锁再升级为重量级锁&#xff0c;这些底层jvm已经实现了。不需要程序员担心。 是的&#xff0c;Java 8中的synchronized关键字确实默…

为什么代理IP很难做到100%可用性?

在当今高度互联的网络环境中&#xff0c;代理IP已成为许多网络活动的重要支撑工具&#xff0c;从数据收集到业务推广&#xff0c;无所不包。然而&#xff0c;代理IP在很多场景中发挥着重要作用&#xff0c;却很难实现100%的可用性。 这种情况并非偶然&#xff0c;而是受到多重复…

如何给自己的项目实现在线测试的接口文档knife4j

配置实现Knife4j在线接口测试文档 为什么要是实现这个东西呢&#xff1f;肯定是对我们有用的&#xff0c;后端主要编写的就是接口&#xff0c;然后我们将接口编写好了之后肯定还是需要进行调试看是否能够正常使用且按照规范返回对应的数据。相信大家测试都是基本上使用的是一些…

JavaScript的数组(一维数组、二维数组、数组常用的方法调用)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Java MyBatis实战:QueryWrapper中的and和or拼接技巧

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、引言 在Java Web开发中&#xff0c;MyBatis是一个非常流行的持久层框架。它通过XML或注解的方式将Java对象与数据库表进行映射&#xff0c;从而实现数据的增删改查操作。在使用MyBatis的过程中&#xff0c;经常…

景联文科技:打造亿级高质量教育题库,赋能教育大语言模型新未来

随着人工智能技术的持续进步&#xff0c;从广泛的通用大语言模型到针对各行业的垂直大语言模型&#xff0c;已成为人工智能大语言模型技术深化演进的必然趋势。 教育大语言模型是适用于教育场景、具有庞大规模参数、融合了广泛的通用知识和专业知识训练形成的人工智能模型。能为…

【牛客面试必刷TOP101】Day31.BM65 最长公共子序列(二)和BM66 最长公共子串

文章目录 前言一、BM65 最长公共子序列(二)题目描述题目解析二、BM66 最长公共子串题目描述题目解析总结 前言 一、BM65 最长公共子序列(二) 题目描述 描述&#xff1a; 给定两个字符串str1和str2&#xff0c;输出两个字符串的最长公共子序列。如果最长公共子序列为空&#xf…

外星人Aurora R15 intel版 原厂Windows11oem系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

Django之文件上传(二)

一、自定义上传文件重命名 重名名好处: 重命名文件也可以避免文件名冲突的问题可以根据自己情况,针对性增加描述信息1.1、生成文件名方法 import os from uuid import uuid4 # 生成文件的名称 def generate_filename(filename):# filename: 上传文件的名称ext = os.path.spl…

通配符(泛域名)SSL证书怎么申请?在哪能能申请到?

通配符SSL证书的申请过程可以概括为以下几个关键步骤&#xff0c;以确保条理清晰、通俗易懂且步骤尽量精简&#xff1a; 选择CA机构&#xff1a; 选择一个受信任的证书颁发机构&#xff08;Certificate Authority&#xff0c;简称CA&#xff09;&#xff0c;如JoySSL、DigiCe…

跟着AI学AI_09 PyTorch 简介

PyTorch 简介 PyTorch 是一个开源的深度学习框架&#xff0c;由 Facebook 的人工智能研究团队&#xff08;FAIR&#xff09;开发。它提供了灵活且高效的张量计算功能&#xff0c;并支持动态计算图。PyTorch 的易用性和灵活性使其成为深度学习研究和生产应用中广泛使用的工具。…

shell条件测试和if语句

“C:\Users\Jessica\Desktop\6.12.assets\image-20240612094159578.png”# shell条件测试和if语句 一、条件测试 1、$? 返回码 判断命令或者脚本是否执行成功&#xff08;最近的一条&#xff09; 0 true 为真就是成功 成立 非0 false 失败或者异常 2、test命令 可以进行…

python实现高斯(Gauss)迭代自动计算

实现高斯&#xff08;Gauss&#xff09;迭代自动计算 输入系数矩阵mx、值矩阵mr、迭代次数n&#xff0c;即可得到答案。本人在原博主的代码基础上优化了数据输出形式&#xff0c;原文链接&#xff1a;python实现高斯(Gauss)迭代法_python中gausspp-CSDN博客 运算结果如下图&am…

小程序必看:https证书强制使用攻略

为了提升网络安全性和用户数据保护&#xff0c;自2017年1月1日起&#xff0c;微信小程序要求所有的网络请求必须通过HTTPS协议进行。这意味着小程序在与服务器进行数据交互时&#xff0c;必须使用HTTPS加密连接&#xff0c;以确保数据传输的安全性。这样做可以防止数据在传输过…