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

原创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.萌宠热门爆款游戏推荐——解锁休闲乐趣的新方式首先,不得不提的便是《宠我一生》。这款游戏以其丰富的宠物种类和独特的社交系统受到了玩家们的一致好评。在这里,你不仅可以与小企鹅、小仓鼠、小猫咪等邻居们一起快乐成长,还能享受各种日常社交的乐趣。 第三段: 除了《宠我一生》之外,还有《神武》、《马尔斯》、《魔兽世界》和《永恒之塔》等多款热门宠物养成...https://news.17173.com/z/yxtj1/content/11152024/215708824.shtml
2.你不干有的是宠物干!网络热门捉宠建造类游戏盘点!相较于前作,蓝色星原在游戏的制作方面跨度极大,并没有继续保持原先的2D创作,而是大胆引入了"大世界+宠物养成+模拟经营"的融合玩法,让我们在这片未知的星原中,开启一场奇波之旅! 在这片奇幻大陆中,战斗不再是唯一主题,游戏中的宠物系统也是本作中的重点!PV中出现的每个场景都少不了宠物"奇波"的身影,它们也是...https://a.4399.cn/gg/47093461_225756.html
3.让孩子爱上阅读的100种方法很多双职工家庭的父母回到家都很累了,有时就懒得讲故事,这样不利于孩子阅读习惯养成。 11、给孩子准备便利贴 帮孩子学会建立阅读索引,贴标签的形式是帮助孩子梳理自己思维、提纲挈领的过程。 12、把阅读和户外活动联系起来 带孩子在帐篷里、在吊床上、在小船上读书,一切能给孩子新鲜有趣体验的阅读活动都是孩子想要的...https://www.jianshu.com/p/422e878b8e2a
4.宠物派对今天小狗狗的主人要带领小狗去参加宠物派对,很可能还会遇到其它的异性小狗哦!为了使自己家的小狗成为派对上的最可爱的宠物,也使主人脸面生光,快来给它打扮一下,展现它的魅力吧! 游戏目标 打扮小狗,如果扮得漂亮,别忘了把图片发在页面下面的作品中跟大家一起分享! https://www.doyo.cn/flash/game/632322
5.小一班逻辑狗5《我们的宠物》4:通过观察乌龟身上的图案,比较图案的异同,发展观察能力。(背面迷宫游戏)鼓励孩子大胆尝试目测复杂的线路,发展手眼协调性。 00:00 《我们的宠物》5:观察每个小动物,借助已有生活经验判断出它们生活的场所,感知小动物与家的关系,发展幼儿的推理能力。 https://www.meipian.cn/234suphw
1.迷你城独角兽之家游戏下载迷你城独角兽之家是一款适合儿童玩的休闲益智类小游戏,游戏主角采取了儿童心目中最想拥有的宠物——独角兽这一形象,吸引了一众小粉丝,玩家在游戏中可以扮演小独角兽去生活成长,也可以和其他的独角兽一起玩耍游戏。游戏里还会提供一些生活小常识,满足了小玩家想要“过家家”的心理,是一款能够让儿童们安静下来的益智游戏,...https://app.3dmgame.com/android/171539.html
2....史上最难排位—科帕奇7座SUV最后两个座位安排给谁?雪佛兰7座科帕奇是小刘本次出行的座驾,这款车长4690mm,轴距2707mm的7座SUV,车型来说不大不小正合适。但目前市场上绝大部分7座SUV的第三排空间确实不尽人意,我想这也是本次排位作业的缘由。看了咱们之家的众多测评作业以及横向对比,了解了雪佛兰7座科帕奇这款车的基本特点。在调整好所有人舒适的乘坐位后,第三...https://club.autohome.com.cn/bbs/PartyRegisterList-o-200226-61890001.html
3.生活之游戏中的心理学大战我的两个小生活之游戏中的心理学 游戏中的心理学(一):认知失调 游戏业属于服务业,而我们服务的对象就是玩家。我们想要做好一款游戏,除了必要的专业知识,对服务对象的了解程度也非常重要。 笔者最近自学了一点心理学的皮毛,在这里尝试用心理学知识来分析玩家的心理和行为,今天先说说“认知失调理论”。https://blog.csdn.net/sauphy/article/details/50749327/
4.淘宝app怎么玩捉猫猫游戏?手机软件软件教程【脚本之家合作内推渠道,注册就能看!】 最近淘宝又推出了一款小游戏叫做捉猫猫,很多朋友还不是很清楚这个游戏怎么玩?今天小编就为大家带来淘宝捉猫猫游戏教程,跟着小编一起来捉猫猫吧! 淘宝(淘宝网客户端) v10.36.10 最新安卓版 类型:生活服务 大小:70.5MB ...https://www.jb51.net/softjc/558017.html
5.奥比岛手游宠物的家怎么解锁奥比岛手游宠物的家解锁方法近日奥比岛手游即将开启公测,同时开放了很多全新的玩法,宠物就是其中一项,那么奥比岛手游宠物的家怎么解锁,就跟小编一起来看看奥比岛手游宠物的家解锁方法吧。 奥比岛手游宠物的家怎么解锁 一、如何开启宠物的家? 当小奥比的岛建等级达到16级时,便可解锁特殊建筑宠物的家。宠物的家最多可容纳50只宠物,这是它们生活、...https://m.ali213.net/news/gl2207/871483.html
6.远离游戏作文(精选36篇)游戏是最让小孩子们所喜爱的,每当考完试以后,总是能听到其他同学说:“这下解放了,终于可以通宵玩游戏了。”我心想,难道游戏真像他们说的那么好玩,那么令人着迷吗?我决定亲自体验一下,没有想到,我从此以后就被卷入了这个黑洞之中。 那天放学,我刚回到家,便拿起手机下载了一个游戏——跳一跳,这是一个微信小程...https://www.ruiwen.com/zuowen/youxi/5351016.html
7.仙剑奇侠传五手游仙剑奇缘仙剑奇缘答案汇总106. 在《仙剑奇侠传5手游》中,首个剧情小游戏《潜入酒窖》中的使用角色是 答案:姜云凡 107. 在《仙剑奇侠传5手游》中,法宝的主要来源是 答案:竹林秘境...192. 《仙剑奇侠传二》中,提到江湖之中的两大势力“南林北沈”,其中的“北沈”沈家堡的堡主是 答案:沈青锋 193. 南林北沈退隐后,江湖之中唯欧阳,...https://www.qqtn.com/article/article_200763_1.html