首页 > 其他分享 >H5 雪碧图 移动的机器猫

H5 雪碧图 移动的机器猫

时间:2022-12-21 15:22:18浏览次数:54  
标签:animIndex currSprite doraemon H5 spriteInterval let 雪碧图 机器猫 ev

精灵图(英语:Sprite),又被称为雪碧图或拼合图。在计算机图形学中,当一张二维图像 集成进场景中,成为整个显示图像的一部分时,这张图就称为精灵图。

本文中用的就是这张,来自爱给网。

img

效果

img

操作

键盘上下左右控制移动

document.addEventListener("keydown", (ev) => {
  let x = 0,
    y = 0;
  if (ev.code === "ArrowUp") y = -1;
  if (ev.code === "ArrowDown") y = 1;
  if (ev.code === "ArrowLeft") x = -1;
  if (ev.code === "ArrowRight") x = 1;
  if (x || y) move(x, y);
});

动画

通过判断不同状态来展示不同动画

function sprite() {
  /** @type {{x:number,y:number}[]} */
  let anim = anims[currSprite];
  let animIndex = 0;
  let render = () => {
    let curr = anim[animIndex];
    let currX = Math.round(curr.x * 25); // 25 指单个小图的宽度
    let currY = Math.round(curr.y * 38); // 38 指单个小图的高度

    backgroundPosition = `background-position: ${currX}px ${currY}px;`;
    doraemon.setAttribute("style", `${transform}${backgroundPosition}`);
    animIndex++;
    if (anim.length === animIndex) animIndex = 0;
  };
  render();
  return setInterval(render, 200); // 200 是指每帧渲染间隔0.2s
}

源码

没有进行精简,属于粗略的代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <style>
      .doraemon {
        width: 25px;
        height: 38px;
        position: relative;
        background-image: url("./assets/doraemon.png");
      }

      .doraemon .name {
        position: absolute;
        top: -14px;
        left: 50%;
        transform: translateX(-50%);
        font-size: 12px;
        text-align: center;
        white-space: nowrap;
      }
    </style>
  </head>

  <body>
    <div class="doraemon">
      <div class="name">哆啦A梦</div>
    </div>

    <script>
      // 写一下 doraemon 移动

      // 操作元素
      let doraemon = document.querySelector(".doraemon");
      // 当前位置
      let pos = { x: 0, y: 0 };
      // 移动速度
      let speed = 2;
      // 当前动画
      let currSprite = "idle";

      // 默认
      let idleSprite = [{ x: 2, y: 0 }];
      // 向下
      let downSprite = [
        { x: 1, y: 0 },
        { x: 2, y: 0 },
        { x: 3, y: 0 },
      ];
      // 向上
      let upSprite = [
        { x: 1, y: 1 },
        { x: 2, y: 1 },
        { x: 3, y: 1 },
      ];
      // 向左
      let leftSprite = [
        { x: 1, y: 3 },
        { x: 2, y: 3 },
        { x: 3, y: 3 },
      ];
      // 向右
      let rightSprite = [
        { x: 1, y: 2 },
        { x: 2, y: 2 },
        { x: 3, y: 2 },
      ];
      // 动画集
      let anims = {
        idle: idleSprite,
        down: downSprite,
        up: upSprite,
        left: leftSprite,
        right: rightSprite,
      };
      // 当前操作的位置
      let backgroundPosition = "";
      // 当前的位移
      let transform = "";
      // 初始动画
      let spriteInterval = sprite();
      // 延迟默认
      let idleTimeout = 0;

      document.addEventListener("keydown", (ev) => {
        let x = 0,
          y = 0;
        if (ev.code === "ArrowUp") y = -1;
        if (ev.code === "ArrowDown") y = 1;
        if (ev.code === "ArrowLeft") x = -1;
        if (ev.code === "ArrowRight") x = 1;
        if (x || y) move(x, y);
      });

      function sprite() {
        /** @type {{x:number,y:number}[]} */
        let anim = anims[currSprite];
        let animIndex = 0;
        let render = () => {
          let curr = anim[animIndex];
          let currX = Math.round(curr.x * 25);
          let currY = Math.round(curr.y * 38);

          backgroundPosition = `background-position: ${currX}px ${currY}px;`;
          doraemon.setAttribute("style", `${transform}${backgroundPosition}`);
          animIndex++;
          if (anim.length === animIndex) animIndex = 0;
        };
        render();
        return setInterval(render, 200);
      }

      /**
       * 元素移动
       * @param {number} x
       * @param {number} y
       */
      function move(x, y) {
        clearTimeout(idleTimeout);

        idleTimeout = setTimeout(() => {
          clearInterval(spriteInterval);
          currSprite = "idle";
          spriteInterval = sprite();
        }, 500);

        x *= speed;
        y *= speed;

        pos.x += x;
        pos.y += y;

        if (x > 0 && currSprite != "right") {
          clearInterval(spriteInterval);
          currSprite = "right";
          spriteInterval = sprite();
        }
        if (y > 0 && currSprite != "down") {
          clearInterval(spriteInterval);
          currSprite = "down";
          spriteInterval = sprite();
        }
        if (x < 0 && currSprite != "left") {
          clearInterval(spriteInterval);
          currSprite = "left";
          spriteInterval = sprite();
        }
        if (y < 0 && currSprite != "up") {
          clearInterval(spriteInterval);
          currSprite = "up";
          spriteInterval = sprite();
        }
        transform = `transform: translate(${pos.x}px,${pos.y}px);`;

        doraemon.setAttribute("style", `${transform}${backgroundPosition}`);
      }
    </script>
  </body>
</html>

地址

https://github.com/linyisonger/H5.Examples

标签:animIndex,currSprite,doraemon,H5,spriteInterval,let,雪碧图,机器猫,ev
From: https://www.cnblogs.com/linyisonger/p/16996338.html

相关文章

  • H5--性能测试(PageSpeed Insights )
    中文网站(不需要FQ): http://www.googlespeed.cn 主要可实现:1、测试手机与电脑打开的速度对比。2、详细的测试结果3、直观的统计数据,查看页面的共xx个请求、总共......
  • H5 WebSQL每日成语
    有一天看到同事发的类似这种成语填空一样的内容。================惟利()视为德()终质非文()()追耗子================烂漫天()()则改之,无则嘉勉得()之作......
  • H5 导航栏示例
    本文是通过:hover更新元素样式,通过递归树形菜单渲染到页面。效果源码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X......
  • asp.net c#开发 微信派发现金红包/H5网页抢红包功能
    临近节日,公司里为了给广大老客户赠福利,以及来一波拉新活动:搞了一个营销活动,大概活动规则如下:1、老客户通过网页抢红包,中奖会派发微信支付的红包;2、新客户只要关注后就可以中......
  • h5预览docx文档
    1.需要使用docx-preview依赖cnpmidocx-preview--save2.sample<template> <button@click="previewDocx">资治通鉴</button> <viewclass="docWrap"> <!-......
  • CH57x/CH58x OTA讲解
    例程中提供的两种OTA就不过多介绍了,在BLE目录下有一个PDF专门讲解:WCH蓝牙空中升级(BLEOTA)方式一是带库升级,整个codeflash分成四个区域,JumpIAP,APP,OTA,IAPJumpIAP为4K,这......
  • 浙里办H5对接单点登录
    准备工作vue.config中设置 publicPath:'./',    outputDir:'build',路由改为Hash模式       准备好key值  ,问申请组件的人要   a......
  • 2022-12-13 h5跳转小程序时传递参数报错:errMsg: openapi.urlscheme.generate:fail inv
    原因:参数格式错误。我的传参中包含了一些中文字符,这在微信的文档里可以看到是不允许的,见下文:通过scheme码进入小程序时的query,最大1024个字符,只支持数字,大小写英文以......
  • 我花了一夜用数据结构给女朋友写个H5走迷宫游戏
    文章目录​​起因​​​​分析​​​​画线(棋盘)​​​​画迷宫​​​​方块移动​​​​结语​​先看效果图(在线电脑尝试地址http://biggsai.com/maze.html):起因又到深......
  • H5如何调用手机摄像头?
    本文仅简单叙述一下,调用的方式。请看代码:<inputtype="file"accept="image/*"capture="camera"> 下面是开发时遇到的问题和疑问:如何调用前置摄像头?如何只能选择vi......