vue3个人网站电子宠物
预览


具体代码
Attack.gif

Attacked.gif

Static.gif

Walk.gif

Attack.gif

Static.gif

Attacked.gif

Walk.gif

<template><div class="pet-container" ref="petContainer"><p class="pet-msg">{{ pet.msg }}</p><img ref="petRef" @click="debounce(attckPet, 150)()" class="pet" :src="pet.src" alt="" srcset=""></div>
</template><script setup lang="ts">
import { reactive, onMounted, ref } from 'vue'
import { debounce } from 'lodash'
const imgSrc = {Static: import('../../../assets/images/pet/Static.gif'),Attack: import('../../../assets/images/pet/Attack.gif'),Attacked: import('../../../assets/images/pet/Attacked.gif'),Walk: import('../../../assets/images/pet/Walk.gif'),
}
const pet = reactive({msg: '打我啊',src: imgSrc.Static,
})
const petContainer = ref<HTMLElement | null>()
const petRef = ref<HTMLElement | null>()
const mousePosition = reactive({x: 0,y: 0,
})
const petPosition = reactive({x: 0,y: 0,
})
const deg = ref<number>(0)
const deg_y = ref<number>(0)
const count = ref<number>(0)
const speed = 50
let timer = null
let isListenMouseMove = false
onMounted(async () => {changeSrc('Static', '打我啊')
})const changeSrc = async (key, msg) => {let res = await imgSrc[key];pet.src = res.defaultpet.msg = msg
}const attckPet = () => {if (isListenMouseMove) returnchangeSrc('Attacked', '啊!!!')window.addEventListener('mousemove', listenMouseMove)isListenMouseMove = truepetPosition.x = petContainer.value?.offsetLeftpetPosition.y = petContainer.value?.offsetTopsetTimeout(() => {changeSrc('Walk', '我和你拼了')timer = setInterval(() => {move()}, 10);}, 300);
}const listenMouseMove = (e: MouseEvent) => {// 需要移动的x轴距离 = 当前鼠标位置-距离浏览器左边的距离-宠物相对于浏览器页面宽度/2(宽的中心位置)mousePosition.x = e.x - petContainer.value.offsetLeft - petContainer.value.clientWidth / 2;mousePosition.y = e.y - petContainer.value.offsetTop - petContainer.value.clientHeight / 2;let speed = Math.ceil((Math.pow(mousePosition.x, 2) + Math.pow(mousePosition.y, 2)) / 1000);// 需要的旋转角度计算deg.value = 360 * Math.atan(mousePosition.y / mousePosition.x) / (2 * Math.PI);// 这里的event.clientX 返回当事件被触发时鼠标指针相对于浏览器页面(或客户区)的水平坐标。// 这里有关于图片位置的设置,注意你的gif图的方向,原图方向向左,那么这里就是小于,原图方向向右,这里就是大于。// 翻转图片if (petContainer.value.offsetLeft > e.clientX) {deg_y.value = - 180;} else {deg_y.value = 0;}//这里每一次移动鼠标都要重新计算距离,所以这里的count需要清零count.value = 0;
}const move = () => {if (count.value < speed) {petPosition.x += mousePosition.x / speedpetPosition.y += mousePosition.y / speedpetRef.value.style.transform = "rotateZ(" + deg.value + "deg) rotateY(" + deg_y.value + "deg)"petContainer.value.style.left = petPosition.x + "px"petContainer.value.style.top = petPosition.y + "px"count.value++} else {window.removeEventListener('mousemove', listenMouseMove)changeSrc('Attack', '打死你')setTimeout(() => {changeSrc('Static', '打我啊')timer = clearInterval(timer);count.value = 0;isListenMouseMove = false;}, 1000);}
}
</script><style scoped lang="scss">
.pet-container {position: fixed;top: calc(100% - 100px);left: 0;.pet {width: 50px;height: 65px;cursor: pointer;}.pet-msg {padding: 5px;background: #8f8888;color: #fff;}
}
</style>
参考博客
参考博客
相关文章:
vue3个人网站电子宠物
预览 具体代码 Attack.gif Attacked.gif Static.gif Walk.gif Attack.gif Static.gif Attacked.gif Walk.gif <template><div class"pet-container" ref"petContainer"><p class"pet-msg">{{ pet.msg }}</p><img re…...
2.22 作业
顺序表 运行结果 fun.c #include "fun.h" seq_p create_seq_list() {seq_p L (seq_p)malloc(sizeof(seq_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->len 0; bzero(L,sizeof(L->data)); return L; } int seq_empty(seq_p L) {i…...
office word保存pdf高质量设置
1 采用第三方pdf功能生成 分辨率越大质量越好...
微服务设计模式
微服务在过去十年中已经发展到现在非常成熟的水平。许多模式被演变以适应不同的需求。 架构模式 分层图案 2层三层n层客户端服务器 一个服务器和多个客户端大多数在线应用程序,例如电子邮件、银行应用程序等。分开演示 模型-视图-控制器 (MVC) 模型——包含核心功能和数据查看…...
10.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏发送数据的操作
内容参考于:易道云信息技术研究院VIP课 上一个内容:接管游戏连接服务器的操作 码云地址(master 分支):染指/titan 码云版本号:00820853d5492fa7b6e32407d46b5f9c01930ec6 代码下载地址,在 ti…...
将SU模型导入ARCGIS,并获取高度信息,多面体转SHP文件(ARCMAP)
问题:将Sketchup中导出的su模型,导入arcgis并得到面shp文件,进而获取各建筑的高度、面积等信息。 思路: (1)导入arcgis得到多面体 (2)转为面shp文件 (3)计算高度/面积等 1、【3D Analyst工具】【转换】【由文件转出】【导入3D文件】(在此步骤之间,建议先建立一个…...
【电子通识】为什么单片机芯片上会有多组VDD电源?
在单片机芯片规格书中,我们经常能看到多个组VDD的设计,如下红框所示管脚都是VDD管脚。 为什么需要这样设计?只设置一个VDD管脚,把其他的VDD管脚让出来多做几个IO或是其他复用功能不好吗?接下来我们从单片机内部的电路结…...
跟我学C++中级篇——单实例和静态化
一、单实例模式 在设计模式中,单实例模式几乎是所有语言中都非常常用的一种设计模式。它在实际的应用中也非常广泛,在很多的开源框架中,都可以看到单实例的影子。单实例,简单的就可以看做在整个应用周期中,只有一个对…...
下载 axios.js 文件到本地【linux】
方式一 npm install axios在$NODE_PATH/node_modules/axios/dist路径下即可找到axios.js。 方式二 1、百度搜索 GitHub 官网:https://github.com/ 2、搜索 axios 3、点击 axios/axios 4、下载到本地 5、解压,进入到 dist 文件夹** 参考&#x…...
一些matlab的常用用法。在MATLAB中,如何实现数据的导入和导出?
一些matlab的常用用法。 MATLAB(Matrix Laboratory)是一款广泛使用的数值计算环境和编程语言,主要用于算法开发、数据可视化、数据分析以及数值计算等。以下是一些MATLAB的常用用法: 创建矩阵: 使用方括号 [] 创建矩阵…...
数学建模【插值与拟合】
一、插值与拟合简介 在数学建模过程中,通常要处理由试验、测量得到的大量数据或一些过于复杂而不便于计算的函数表达式,针对此情况,很自然的想法就是,构造一个简单的函数作为要考察数据或复杂函数的近似。插值和拟合就可以解决这…...
汽修专用产品---选型介绍 汽修示波器 汽车示波器 汽车电子 汽修波形 汽车传感器波形 汽车检测
为了满足汽车电子用户的测量需求,我司特推出汽修专用版示波器,一键测量,轻松找出汽车问题。 LOTO各种型号的示波器其实都可以用作汽车传感器信号波形的检测。汽修应用中,工程师对示波器的性能要求对于LOTO产品来说不算高。 在我们…...
如何将简历项目部署到自己的域名下
通过上一篇文章我们得知如何在Github上Fork项目到自己账号下,还有学会配置好简历项目并部署上线,接下来我们就来看一下该项目是如何部署到自己的域名下的 👇 在项目文档中可以看到该简历项目是部署在Vercel上的,首先打开Vercel的官…...
Redisson - 实现Java的Redis分布式和可扩展解决方案
Redisson - 实现Java的Redis分布式和可扩展解决方案 引言: 在现代的分布式系统中,缓存和数据存储扮演着至关重要的角色。Redis作为一种高性能的键值存储数据库,被广泛用于缓存、消息队列、实时数据分析等场景。然而,原生的Redis…...
如何利用EXCEL批量插入图片
目录 1.excel打开目标表格; 2.点开视图-宏-录制宏,可以改宏的名字或者选择默认; 3.然后点开视图-宏-查看宏 4.点编辑进去 5.修改代码: (1)打开之后会显示有一堆代码 (2)将这个…...
django rest framework 学习笔记-实战商城3
01用户模块模型定义_哔哩哔哩_bilibili 本博客借鉴至大佬的视频学习笔记 用户模块及商品数据表结构设计 from ckeditor.fields import RichTextField # pip install django-ckeditor from django.db import models# Create your models here. # from wx.richtext import Ri…...
WPF真入门教程29--MVVM常用框架之MvvmLight
1、MVVM模式回顾 关于mvvm模式的基础知识,请看这2个文章: WPF真入门教程23--MVVM简单介绍 WPF真入门教程24--MVVM模式Command命令 做过VUE开发或微信小程序开发的伙伴,就知道MVVM模式,核心就是数据驱动控件,全栈开…...
QT-Day4
思维导图 作业: 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMessageBox> #include <QTimerEvent>//定时器事件类 #include <QTime> #include <QDebug> #include <QPushButton> #include <QT…...
代码随想录算法训练营第三天
● 自己看到题目的第一想法 203.移除链表元素 方法一: 思路: 设置虚拟头节点 dummyhead 设置临时指针 cur 遍历 整个链表 循环: 如果 cur !nullptr &&cur->next !nullptr 则 遍历链表 否则结束遍历 如果 cur->next val 则…...
蓝桥杯刷题1
目录 1. 平方和 2. 门牌制作 3. 卡片 4. 分数 5. 星期一 6. 顺子日期 1. 平方和 题目描述:小明对数位中含有2、0、1、9 的数字很感兴趣,在1 到40 中这样的数包 括1、2、9、10 至32、39 和40,共28 个,他们的和是574&#x…...
SQL中如何获取所有列的数据:SELECT -星号用法与性能影响
能用但多数时候不该用——它会解析全部列元数据、传输冗余字段、阻碍执行计划优化,易引发列名冲突、ORM映射错乱等问题,仅限调试或结构极小稳定时使用。SELECT * 在真实查询中到底能不能用能用,但多数时候不该用——不是语法错误,…...
别再手动写卷积了!用Matlab FDA插件+Verilog快速搞定FPGA FIR滤波器(附4MHz低通/100MHz带通完整代码)
从Matlab到FPGA:可视化FIR滤波器设计全流程实战 在数字信号处理领域,FIR滤波器因其稳定性、线性相位特性而广受欢迎。但传统手工计算系数的方式不仅耗时耗力,还容易出错。本文将展示如何利用Matlab的Filter Designer & Analysis工具快速生…...
【ROS2实战笔记-8】Agnocast:ROS 2跨进程零拷贝的工程实现与取舍
“零拷贝”在ROS 2语境下是一个经常被讨论的概念。许多开发者听说过Fast DDS的共享内存、Iceoryx或者Node Composition,但对于它们之间真正的差异、各自的边界条件以及为什么需要一个叫Agnocast的新方案,未必有一个清晰的认知。本文从Autoware在自动驾驶…...
1.4 大白菜磁盘分区扩容(C盘为例)
前置条件:启动盘制作完成,插入U盘,BIOS选择U盘启动1.选择“启动Win10 X64 PE”2.等待一会3.等待一会4.双击桌面“分区工具”5.可以看到C盘扩容前为41GB,D盘为19GB6.右键点击“本地磁盘(C:)”,选择“扩容分区”7.点击“…...
018、多智能体协作(一):通信协议与协同机制
上周调试一个多机器人调度系统时,遇到了一个经典问题:两个智能体同时向对方发送任务请求,结果互相等待对方响应,直接死锁在通信层。查了一下午日志才发现,是我们的自定义消息协议没处理好并发请求的序列化。这个坑让我意识到,多智能体系统的核心往往不在算法本身,而在那…...
Intv_AI_MK11前端设计赋能:基于AI的UI/UX原型自动生成与评审
Intv_AI_MK11前端设计赋能:基于AI的UI/UX原型自动生成与评审 1. 效果亮点预览 Intv_AI_MK11正在重新定义前端设计工作流程。这个智能助手能在几分钟内将产品需求文档转化为可交互的UI原型,同时提供专业级的CSS样式建议和设计评审意见。我们测试了从电商…...
Python argparse实战:5分钟教你为自动化脚本添加可配置参数(比如定时备份、文件处理)
Python argparse实战:5分钟为自动化脚本添加可配置参数 每次修改脚本里的硬编码路径时,我都忍不住想:要是能像Linux命令那样通过参数动态配置该多好。上周维护服务器时,一个简单的日志清理脚本因为目录变更被迫改了三次代码——这…...
用Python搞定电力系统潮流计算?手把手教你用PyPower跑通第一个OPF算例
从零开始用Python实现电力系统潮流计算:PyPower实战指南 电力系统潮流计算是电力工程师的必备技能之一。想象一下,你刚接手一个电网优化项目,领导要求你快速评估不同运行方案下的电压分布和功率流动。传统方法可能需要依赖商业软件ÿ…...
用强化学习优化CI/CD流水线:部署效率提升300%实录
测试工程师的困境与智能化的曙光在现代软件开发的快节奏战场上,持续集成与持续部署(CI/CD)流水线已成为保障软件质量与加速交付的生命线。对于软件测试从业者而言,这套流程的每一次构建、测试与部署,都是我们捍卫产品质…...
避坑指南:Windows下WhisperX安装全流程(解决cudnn.dll报错和HuggingFace连接超时)
Windows下WhisperX实战安装指南:从环境配置到语音转文字全流程 最近在折腾语音转文字工具时,发现WhisperX这个基于OpenAI Whisper的增强版项目确实让人眼前一亮。它不仅保留了原版的识别准确度,还通过批量推理和音素对齐等技术大幅提升了处理…...
