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

原创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.宠物交易app排行榜前十名偏玩手游盒子分享十大宠物交易app排行榜前十名手机应用,编辑为您推荐手机宠物交易app排行榜第一名到前5名到前十名的应用。找宠物交易app有哪些、宠物交易app哪个好用,上偏玩手游盒子https://www.pianwan.com/s/zj-1483013
2.狗市场网—买狗卖狗看狗选狗来狗市场!专业的买狗卖狗网上狗市,小狗宠物狗交易平台-狗市场(Goushichang.com)为您提供最新的狗狗价格,狗狗图片,狗狗新闻资讯,狗狗血统查询,宠物狗品种大全,宠物狗价格大全等栏目内容.狗市场力求构建国内规模最大、品种最全、更新最快、影响最广的网上狗市!http://www.goushichang.com/
3.天猫Tmall.com由于该网站的robots.txt文件存在限制指令(限制搜索引擎抓取),系统无法提供该页面的内容描述https://www.tmall.com/
4.宠物100宠物猫鱼可以吗,猫可以吃宠物鱼吗? 精品排行榜 宠物在线购买,北单网上买的 宠物店是什么沐浴露,狗狗用什么沐浴露? 普通宠物鸟,小宠物鸟 宠物青蛙品种大全图片大全,蛙种大全 狗狗喝宠物羊奶可以吗,宠物狗可以喝羊奶吗? 宠物狐狸三个月好养吗,如何养三个月的狐狸? http://www.pet100.cn/
1.如何在网上购买可爱的猫咪(从宠物选择到交付方式)养宠知识在现代社会,越来越多的人选择在网上购买宠物。尤其是在疫情期间,更多人开始考虑网购猫咪。但是,对于初次尝试网购的人来说,这可能是一项有挑战性的任务。本文将为您提供有关如何在网上购买猫咪的详细信息。 了解你的宠物 在选择猫咪之前,你需要了解你所要承担的责任和决定。这包括了解猫咪的品种、性别、年龄、性格和...https://www.pettb.cn/article-24999-1.html
2.休闲太阳系中哪个巨行星因为自转快被称为“灵活的胖子”想要购买债券基金,以下哪一种风险相对较低 A、短期纯债基金 B、中长期纯债基金 解析:因为短债基券期限较短,债券违约的风险相对较小,而且债券利率波动对其影响相对较小。中长期纯债基金因为投资的债券期限较长,违约风险较大,对利率波动更为敏感,以致基金净值的波动幅度较大,因此风险也相对较高。 https://blog.csdn.net/qq_41539778/article/details/135125608
3.买宠物是宠物店好还是网上好宠物店买宠物要看什么→MAIGOO知识摘要:随着人们生活水平的提高,很多人都会购买宠物来陪伴自己。购买宠物的渠道有很多,即可以去宠物店购买,也可以去网上店铺购买。实际上,相对来说宠物店购买会靠谱一点,因为你可以自己判断宠物的情况。去宠物店买宠物,可以通过看宠物的呼吸、体温、牙齿、排泄物、鼻子等等部位来判断宠物好不好,接下来就和小编一起来看看...https://m.maigoo.com/goomai/215686.html
4.小猫十元一只网站摘要:网上抢购宠物新风尚:揭秘小猫十元一只的背后故事 在这个信息爆炸的时代,网络平台成为了我们日常生活中不可或缺的一部分。从购物到娱乐,从学习到社交,无处不在。近年来,一种新的网络趋势悄然兴起,那就是“小猫十元一只网站”。这些网站声称可以通过各种优惠活动,让用户以极低廉的价格购买到家中的宠物——小猫。https://www.wazxzpm.cn/chong-wu-zi-xun/489574.html
5.7个美国购买宠物药品宠物用品的网站(附最新优惠+最高30%返利...大家都知道美国人工费特别贵,不管是给人看病还是给宠物治疗,费用都是极其昂贵的。所以如果宠物宝宝们只是简单普通的日常生病,主人们又特别清楚买哪种药的话,直接在网上购买,既便宜又方便呢!那如果是需要处方的药品能在网上购买到吗?只要你能提供有效的处方,大部分网站是可以购买到的。具体操作:在购买网站上上传宠物...https://www.extrabux.cn/chs/guide/3980490
6.网上购宠有风险谨防“托运”变诈骗日前,有群众汤先生向警方报警,称其在网上购买宠物时,对方以办理宠物托运为由指引其登录一家名为“顶X快递”的托运网站办理托运。该网站客服先让其支付了运费,然后又以操作失误、款项冻结、需“解冻”为由,骗取汤先生多次转账,最终汤先生被骗15000元。无独有偶,事主梁小姐在某社交平台上购买宠物,同样也被不法分子...https://gaj.zhanjiang.gov.cn/jwzx/jfts/content/post_1310.html
7.魔兽世界灵魂商人宠物能买什么要在魔兽世界荷兰服网上购买幽灵虎,您可以通过200元以内步骤接受:1.然后打开魔兽世界荷兰服官方网站或直接登录游戏客户端。2.在游戏中找不到附近的战宠商人或宠物训练师,可以在用游戏地图或再询问那些玩家来找到他们的位置。3.与战宠商人或宠物训练师对话,从他们那里可以购买宠物。4.搜索有关宠物商店或拍卖行是否有幽...https://www.qinhesu.com/articles/1370.html
8.网上买活体狗狗靠谱吗?小编来为你揭晓!网上买活体狗狗靠谱吗?小编来为你揭晓! 现如今在网上买宠物狗的人们越来越多了,因为在网上购买宠物狗非常简单方便,不过在网上买宠物狗也是有一些弊端,比如说大家购买到星期狗,这样的问题真的是非常头疼的。那么,网上买活体狗狗靠谱吗?接下来就让我们一起来了解下相关内容吧!https://www.chongwugo.cn/1084.html
9.宠物也能买医保你会给你的宠物买医保吗?在泉州经营了十几年宠物医院的陈先生介绍道,他们目前在宠物保险方面不仅与网上平台有合作,也与线下的保险公司合作。“大部分人购买宠物医保还是通过线上渠道比较多,线下保险公司主要是以赠送为主。”陈先生说,目前泉州宠物医保的普及率并不高,愿意给宠物购买保险的人并不多。他们合作的这家保险公司一般是将宠物保险作...https://m.qzwb.com/gb/content/2023-03/24/content_7189977.htm
10.印度渐起养宠物之风,宠物用品在网上热销随着电子商务的兴起,印度宠物爱好者经常上网购买宠物用品。相较于当地实体店产品种类稀少,宠物的吃的、穿的、用的在网上应有尽有,而且价格也很优惠,所以宠物爱好者经常在网上购买宠物饰品,衣服,食品,美容用品,印度宠物用品网店销量也因此上涨。 雨果网从《印度时报》获悉:印度北方邦首府勒克瑙居住了许多宠物爱好者。随...https://m.cifnews.com/article/15039
11.目标1100多亿,韩国宠物市场到了超乎想象的地步?随着线上电商渠道的不断发展,宠物主们更喜欢选择在线上购买宠物用品和食品,这为宠物市场提供了新的增长机会。 政府政策的支持 韩国政府出台了一系列政策来支持宠物产业的发展,如简化宠物食品进口程序、加强宠物医疗保健服务等,这些政策为宠物市场提供了良好的发展环境。 https://www.huxiu.com/article/3519837.html
12.全国12315平台热线办理进度查询 请登录 2024年11月21日星期四 投诉公示 企业服务 您购买商品或接受服务 认为经营者侵犯您的合法权益 我要投诉 您发现违反 市场监管法律法规的行为 我要举报 您需要了解 市场监管有关法律法规 我要咨询https://www.12315.cn/
13.2018年4月自考电子商务案例分析考试真题自考(2)根据网上消费者的四种消费心理,Rover网站提供的服务如下: ①网上消费者对消费满足感的要求更高,追求个性化的消费心理。(2分)宠物爱好者能“出租”自己的照料服务。对于希望寄养宠物(以狗为例)的用户,他们需要提交狗狗的资料,给它创建页面,包括图片和描述;按日期、地点、价位来搜索与筛选提供照料服务的人。(2分...https://www.educity.cn/zikao/19713.html