一键在自己的网站上添加一只会动的小宠物

原创JYeontu前端也能这么有趣2024-01-0300:00发表于广东

组件实现效果如下图:

图片包我们可以通过以下几种方式来获取:

会作图的同学可以自己画一套专属的图片包。

我们从动图或视频中截取关键帧,并将获取到的关键帧背景扣除,这样我们也可以得到一套自己喜欢的图片包。

其实网上也有很多的桌宠图片包资源,所以我们可以直接到网上搜索。

由于本人美术不行且想偷懒,所以果断地选择了第3种方式来获取到了可以使用的图片资源。

获取到一套图片包之后,一套图片包中可能包含多个动作行为,所以我们还需要对其进行分类,将不同行为的图片分类出来,为了方便我们后续代码的编写,我们可以先将图片根据动作的顺序进行编号命名。

如上图划分的4中行为动作,我们都按顺序对图片进行编号命名,那么我们后续引用的时候就可以根据序号来定义一个行为动作,如下图:

图片准备好并且处理好之后,我们便可以开始编写代码了。

我们需要完成一个配置表来将图片和行为关联起来,如下图:

我们需要对每个图包的每个动作进行一个简单的配置:

图片包的路径。

没有进行任何行为的时候的默认展示图片。

行为集合,每个集合的配置如下:

name:该行为的名称,后面会在行为菜单展示;

min:行为开始图片编号;

max:行为结束图片编号;

isMove:该行为是否要发生位移;

audio:触发该行为时的音频。

具体如下:

{"name":"run","min":1,"max":2,"isMove":true,"audio":"Pikachu.mp3"},2、组件参数配置name选择展示的图片包,目前已有图片包:皮卡丘,奇犽,白一护,橘一护,喵老师,蓝染,迪达拉,日向雏田。

触发可移动行为时每一次移动的距离,默认为20px。

桌宠的尺寸大小,默认为50px。

初始化时默认触发的行为,可从行为菜单中选择。

props:{name:{type:String,default:"皮卡丘",},step:{type:Number,default:20,},petSize:{type:String,default:"50px",},defaultAction:{type:String,default:"",},},3、配置数据初始化我们需要根据传入的name来选择相对应的配置,图片我们要通过require的方式来引入,不能直接使用相对路径字符串。

importconfigfrom"./config.json";initData(){this.webPetConfig=config[this.name];this.actionList=this.webPetConfig.actionList;this.imgRootPath=this.webPetConfig.imgRootPath;this.imgSrc=require("@/assets/img/"+this.webPetConfig.defaultImg);this.uid="j-web-pet-"+getUId();constlist=this.actionList.map((item)=>{returnitem.name;})||[];this.menuList=list;clearTimeout(this.isRunToTarget);this.isRunToTarget=null;this.menuShow=false;}4、页面初始化根据传入参数及对应的配置来进行页面初始化。

init(){this.nowAction=this.actionList.find((item)=>{returnitem.name==this.defaultAction;})||{};this.showImg=document.getElementById("showImg");this.showImg.style.width=this.petSize;this.showImg.style.height=this.petSize;this.showImg.style.right=this.petSize;this.showImg.style.top="50%";this.showImg.style.transform="";this.mouseEventListen();this.autoRunToTarget();},5、行为菜单栏我们需要有个行为菜单栏来对宠物的行为进行切换,所以我们可以制作一个简易菜单展示,为了防止菜单栏溢出视图窗口,我们可以对其弹出位置进行以下限定:

菜单顶部与宠物的顶部对齐,如下图:

菜单底部与宠物中心对齐,如下图:

菜单从宠物右边弹出,如下图:

菜单从宠物左边弹出,如下图:

实现代码如下:

showMenu(){constw=this.showImg.offsetWidth;consth=this.showImg.offsetHeight;constleft=this.showImg.offsetLeft;consttop=this.showImg.offsetTop;constinnerWidth=window.innerWidth;constinnerHeight=window.innerHeight;constinLeft=left

playImg(action,ind){if(!action||JSON.stringify(action)=="{}")return;letmin=action.min,max=action.max;if(!ind||indmax){ind=min;}this.showImg&&this.showImg.setAttribute("src",require("@/assets/img/"+this.imgRootPath+ind+".png"));clearTimeout(this.isRunToTarget);this.isRunToTarget=setTimeout(()=>{this.playImg(action,ind+1);},500);},7、宠物移动效果实现移动效果我们只需要在图片切换的同时对图片的定位进行修改,便可以简单实现宠物移动的效果,所以我们需要计算每次移动的时候图片的坐标变化量及角度的偏移量。

转化成这么一道数学题之后是不是觉得简单多了?我们只需要解开这道简单的三角函数题目即可:

我们可以通过点A和点B的坐标来求边BC和边AC的长度:

AC=|X2-X1|BC=|Y2-Y1|知道了这两边的长度之后我们便可以求得角θ的度数了。

首先我们应该先了解一下反正切arctan,如果tanθ=y,我们可以得出arctan(y)=θ,所以我们可以通过反正切来求得角θ的大小

但是我们计算的时候两边的长度永远是正的,所以求得的角度区间应该是[0,π/2],所以在下面这种情况(目标点x坐标大于宠物x坐标)的时候,我们应该对其进行一个y轴镜像翻转。

转化成代码如下:

autoRunToTarget(action=this.nowAction,x="",y=""){if(action.isMove){if(!x)x=getRandomNum(0,window.innerWidth);if(!y)y=getRandomNum(0,window.innerHeight);this.runToTarget(action,action.min,x,y,()=>{this.autoRunToTarget(action);});}else{this.playImg(action);}},9、宠物拖动有的时候宠物可能会遮挡到页面内容,我们需要将其拖动移开,这里我们可以对鼠标移动事件和点击事件进行监听处理。

我们需要先点击宠物后使其进入可拖动状态才能开始拖动宠物。

clickPet(e){this.canDrag=true;//设置可拖动状态clearTimeout(this.isRunToTarget);this.startClickX=e.pageX-window.scrollX;this.startClickY=e.pageY-window.scrollY;window.addEventListener("mouseover",this.mouseoverHandler,false);window.addEventListener("mouseup",this.mouseupHandler,false);},2、根据鼠标坐标更新宠物坐标判断当前是否进入可拖动状态,可拖动时根据鼠标坐标更新宠物坐标。

mouseoverHandler(e){if(!this.canDrag)return;constw=this.showImg.offsetWidth/2;consth=this.showImg.offsetHeight/2;this.showImg.style.left=e.pageX-window.scrollX-w+"px";this.showImg.style.top=e.pageY-window.scrollY-h+"px";this.showImg.style.right="";this.showImg.style.bottom="";},3、区分点击事件和拖动事件鼠标抬起时判断是点击事件还是拖动事件,这里我使用拖拽开始位置和拖拽结束位置来做一个简单的判断,拖拽结束后注意清除鼠标的监听事件。

mouseupHandler(e){constendClickX=e.pageX-window.scrollX;constendClickY=e.pageY-window.scrollY;const{target}=e;if(target==this.showImg&&(Math.abs(this.startClickX-endClickX)<10||Math.abs(this.startClickY-endClickY)<10)){this.showMenu();}else{this.menuShow=false;this.autoRunToTarget();}this.canDrag=false;window.removeEventListener("mouseover",this.mouseoverHandler,false);window.removeEventListener("mouseup",this.mouseupHandler,false);},10、播放音频根据配置表获取当前行为的音频,有配对的音频则随机播放音频。

如有侵权,可以联系删除。

目前实现的只是一个简单组件版,后面会继续完善,增加更多的交互功能或交互小游戏,提高组件可配置性,后续还有两个改动方向:

有图片包资源的同学可以赞助下有什么其他好的建议也都可以提出来

当前组件已发布到npm,可以查看组件文档进行引入并配置。

引入后即可直接使用。

Gitee源码:/zheng_yongt…[3]

这里是JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球,平时也喜欢写些东西,既为自己记录,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解,写错的地方望指出,定会认真改进,在此谢谢大家的支持,我们下文再见。

THE END
1.Petshop5.0详解+源代码(微软官方宠物商店5.0源码)petshop for framework 3.5(petshop 5.0)2008-07-27 20:59简介 基于.NET Framework 3.5的Petshop, 使用LINQ to SQL改进数据访问层 PetShop.Model.DataContext.MSPetShop4DataContext 继承System.Data.Linq.DataContext PetShop.Model.ProductInfo与PetShop.Model.CategoryInfo实体类分别映射数据库表 PetShop.Model....https://www.iteye.com/resource/zfzxw12-8644569
2.宠物对战脚本攻略:全面解决战斗技巧脚本编写与优化问题2. 编写战斗逻辑,包含宠物选择、战斗策略等。 3. 编写宠物技能释放逻辑,确信在战斗中能够发挥更大优势。 ### 3.3 编写示例 以下是一个简单的宠物对战脚本示例: ```python # 导入宠物对战API import pet_battle_api # 宠物选择 def choose_pet(): http://www.slrbs.com/jrzg/aizhishi/472410.html
3.圣伯纳犬类宠物(stbernarddoganimalspet)图片图库爱给网提供海量的高清图库资源素材免费下载, 本次作品为jpg 格式的圣伯纳犬类宠物(st-bernard-dog-animals-pet), 本站编号43251966, 该高清图库素材大小为3m, 分辨率为4374 x 2916, 更多精彩高清图库素材,尽在爱给网。 浏览本次作品的您可能还对 动物 感兴趣。https://www.aigei.com/item/st_bernard_dog_3.html
4....1.定义一个描述宠物的抽象类Pet,包含重量(weight)和年龄(age...根据题意,利用面向对象程序设计的思想完成如下代码设计: 1.定义一个描述宠物的抽象类Pet,包含重量(weight)和年龄(age)两个成员变量和显示宠物资料的showInfo方法以及获取宠物资料的getInfo方法 ; 2.设计一个可吃的接口Eatable,包含一个被吃(beEatted)的方法 ; 3https://m.ppkao.com/wangke/daan/b979677cf11946dd8b8788209425c153
5.基于ssm框架的宠物领养系统毕业论文.docx本系统实现了宠物信息的管理、领养申请等功能。本系统可以提高宠物领养机构的管理效率和信息透明度,方便用户进行领养申请和机构进行管理。同时,本系统还可以帮助机构进行数据统计和分析,为机构决策提供支持。本系统的开发和应用具有重要的实际意义和社会价值。关键词:SSM框架;宠物领养系统;Mysql A Pet Adoption System ...https://m.book118.com/html/2023/0827/8016100007005125.shtm
6.亚马逊宠物类产品和旅行户外用品中,什么卖得好亚马逊宠物类产品、旅行用品和户外产品中,Poop Bags、Pet Hair Remover、行李箱、防晒霜等产品卖得很好。 一、Pet Supplies(宠物用品) 蓝海亿观网了解到,根据APPA(American Pet Products Association 美国宠物用品协会)所做的一项National Pet Owners Survey(全国宠物主人调查),67%的美国家庭(约8500万个家庭)拥有宠物...https://www.egainnews.com/article/12675
7.宠物快跑(RunningPet)游戏下载宠物快跑手机版下载宠物快跑是一款让玩家控制着各种道具去进行对决冒险的动作跑酷休闲游戏,在游戏之中多种玩法随便进行选择畅玩,在这里玩家还能轻松获得各种资源,感兴趣的小伙伴赶紧下载试试吧。 宠物快跑说明 1、拥有多种可爱的宠物角色,采用精美的宠物设计。 2、带给你畅快的奔跑体验,体验与宠物一起快乐奔跑的乐趣。 3、展现了不同宠...http://m.opdown.com/danji/410695.html
8.宠物领养(PETADOPTION)本业务场景为: PET_ADOPTION。 L ext_key String 是 否 是 订单详情地址 key。固定为merchant_order_link_page,一笔订单同步过程中需要保持一致。 L ext_value String 是 否 是 商户小程序对应的订单详情页路径地址 value。仅需传入小程序页面路径即可。 L ext_key String 是 否 否 ...https://opendocs.alipay.com/mini/04v89b
9.PETEMO—宠物的天堂!自从养了狗狗后PETEMO—宠物的天堂!自从养了狗狗后,每次出门的目标之一,就是给它带些好吃的好玩的回来。 这次先介绍这家位于东京台场的AQUA CITY内的大型宠物超市PETEMO。其实AC里不止这家宠物用品店,但他确实是这里面最大,种类最齐全的一家。 狗玩具、狗用品、狗粮、零食应有尽有!逛得我这个铲屎官心花怒放如果你是铲屎官一...https://m.dianping.com/review/689758215
1.python毕设宠物之家程序+论文python毕设宠物之家程序+论文 本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。 系统程序文件列表 开题报告内容 一、选题背景 关于宠物相关系统的研究,现有研究主要以宠物领养或宠物综合平台的部分功能为主,专门针对集宠物售卖、服务、医疗以及宠物与主人相关多种功能于...https://blog.csdn.net/sheji303/article/details/143721795
2.Web3优秀案例收集整理(附带源码):80+项目创意和案例等待你的...如何编写和部署NFT? https://ethereum.org/en/developers/tutorials/how-to-write-and-deploy-an-nft/ 创建一个基于区块链的技能验证系统 ...创建一个基于Flow链的NFT宠物商店 https://nftschool.dev/tutorial/flow-nft-marketplace/#prerequisites 使用Moralis复制rarible NFT交易平台 ...https://maimai.cn/article/detail?fid=1744128853&efid=0ZU5e9Hff_sR0HEXROq_Iw
3.编写程序模拟“主人”喂养“宠物”的嘲,利用多态的思想...提示1: 主人类:Master 宠物类:Pet 宠物类子类:Dog、Cat、YingWu 提示2: 主人应该有喂养的方法:feed() 宠物应该有吃的方法:eat() 只要主人喂宠物,宠物就吃。 要求:主人类中只提供一个喂养方法feed(),要求达到可以喂养各种类型的宠物。 编写测试程序: 创建主人对象 创建各种宠物对象 调用主人的喂养方法feed()...https://cloud.tencent.com/developer/article/2182538
4.mypet经典英语教案(精选6篇)学生的积极性比较高。不足之处在于,将本课的难点没有很好的突破,以至于学生在描述自己宠物的环节中显得有些困难。 my pet 经典英语教案 2 一、教学目标 学生能够掌握与宠物相关的常见单词,如 pet(宠物)、dog(狗)、cat(猫)、turtle(乌龟)、parrot(鹦鹉)、goldfish(金鱼)等,并正确发音。https://mip.cnfla.com/jiaoan/847052.html
5.请用java代码对宠物进行类描述java创建一个宠物类我们两种宠物有很多相同的属性和方法,所以我们创建一个Pet类作为它们的子类。改进后类图 1.2 类代码 1.2.1 Pet类代码 package petShop; public class Pet { private String name;//成员变量 private int health; private int love; public Pet() { https://blog.51cto.com/u_14402/8920847
6.java多态实现电子宠物系统java4、宠物类,Pet:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public class Pet { private int health; public int getHealth() { return health; } public void setHealth(int health) { this.health = health; if(this.health>100){ this.health=100; ...https://www.jb51.net/article/238702.htm
7.Django模型(数据库)及DjangoQuery常用方法需求二:编写宠物管理系统 宠物系统文件树形图 petForm.py # -*- coding: utf-8 -*- from django.forms import Form,widgets,fields class petInfo(Form): petName = fields.CharField(max_length=10,) petId = fields.CharField(max_length=4) gender = fields.CharField(initial = '雄性', widget = ...https://www.jianshu.com/p/25b5a9663100
8.PPet下载PPet正式版下载[桌面小宠物]PPet正式版是一款专用于PC电脑桌面的小宠物工具,PPet最新版酷炫好玩,让您的电脑桌面出现一个萌妹看板娘,桌面看板娘随机显示文字对话框,PPet软件还支持鼠标点击角色显示对话内容,角色右侧显示小工具可以使用,十分的可爱。 官方简介 你的电脑桌面是不是就只是一片青青草原那种普通的桌面?或者说时髦一点就是会动的电脑...http://downza.cn/soft/292203.html
9.魔兽世界宏命令怎么使用魔兽世界宏命令编写教程@目标判定,p 自己,pet宠物,focus焦点,target目标,targettarget目标的目标,mouseover鼠标指向,cursor光标位置,form姿态(相比stance少2字符),party1队伍框架1,arena1竞技场敌方框架1,partypet1队伍框架1的宠物,arenapet1竞技场敌方框架1的宠物 注意:focus焦点,敌方死亡自动取消焦点,仍可以再次焦点尸体,友方死亡不会取消焦...https://www.vqs.com/article/158.html
10.小小宠物园中文版下载有趣的宠物养成手游。应用截图应用介绍 小小宠物园是一款非常有趣的宠物养成游戏,在游戏中,有着许许多多不同的角色,你需要根据它们的生活习惯来喂养它们。还要陪它们玩耍,只有这样才能让它们长的更好哦!觉得这款游戏还不错的小伙伴快来下载吧! 游戏简介 它是传统意义的养成类游戏,该作品与前作《彩虹小马》风格...https://www.qqtn.com/azgame/340430.html
11.益生菌治疗宠物细菌性腹泻概述益生菌能够帮助宠物抵御致病菌并缓解细菌性腹泻的研究已较为明确,但其作用机制有多种且较为复杂,因此本文归纳总结了目前益生菌作用机制的研究进展情况。如图2所示,益生菌防止致病菌对胃肠道造成损害的作用机制主要分为3大类,分别是直接拮抗、免疫调节和排斥作用。图...http://journals.im.ac.cn/html/actamicrocn/2020/10/20201002.htm
12.IsPet品牌介绍IsPet宠物服装狗链IS PET作为E&B Group Limited的旗舰品牌,创始于2005年,目前IS PET已在全球19个国家拥有630多家经销商。IS PET的设计集当季流行元素于一身,设计风格虽然每个时期各有不同,却同样坚持着剪裁细腻,设计精巧、简约等大方向,兼带着永恒的舒服和品质。 宠物是我们的家庭成员之一,我们应该像照顾家人一样照顾和关爱它们。https://m.maigoo.com/brand/136548.html
13.PetFoster:PetXu**pn上传3.64MB文件格式zip 宠物寄养 PET_FOSTER>从宠物收集数据以供收养的应用程序 (0)踩踩(0) 所需:1积分 一份不知道哪里来的第十五届国赛模拟...家谱程序 编写家谱是一项富有意义和价值的任务 2024-11-02 00:07:47 积分:1 学校的编译原理课设成果 2024-11-01 16:39:30 ...https://www.coder100.com/index/index/content/id/2328580