css+js完成黑洞吞噬小球成长功能

2023-11-07 16:59

本文主要是介绍css+js完成黑洞吞噬小球成长功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 介绍
  • 原理
  • 完整代码
  • 总结

介绍

因为最近比较闲,就想着能不能自己做个h5游戏出来,所以先做个小东西试试手,既然要做游戏当然就要涉及到很多的运动轨迹以及碰撞后事件效果等问题,所以就做了这个小demo出来

原理

说起来原理其实也很简单的,想做一个黑洞吞噬效果的话首先我们至少需要两个物体

  • 黑洞
    这个的话比较简单,其实就是往中间放一个黑色的小球而已,可以根据我们需要稍微做一点样式上的优化
<style>#blackhole {width: 40px;height: 40px;background: radial-gradient(black, transparent, transparent);/* radial-gradient是渐变色方法的一种使用三个颜色作为渐变可以直接使用transparent设置透明色这样就可以得到一个带有散射效果的黑色小球 */position: absolute;left: calc(50% - 20px);top: calc(50% - 20px);}
</style>
<div id="blackhole"></div>

喏,大概就长这个样子
在这里插入图片描述

  • 小球
    小球的话可能稍微复杂一些,我这里是通过鼠标点击然后在鼠标点击位置生成一个红色小球,然后这个小球会在创建好之后向着黑洞的位置移动,代码如下
<style>
.block {width: 30px;height: 30px;position: absolute;background: radial-gradient(red, transparent, transparent);border-radius: 10px;
}
</style>
<body id="body">
</body>
<script>
/* 通过tagname直接获取body有点问题
所以选择添加id后通过byId方式获取dom元素 */
let body = document.getElementById('body')
body.addEventListener('click',e=>{let a = document.createElement('div')a.className = 'block'body.appendChild(a)
}
</script>

这部分代码很好理解,就是在点击body时创建一个红色的小球然后添加进body,接下来的话再对小球的位置进行修正

body.addEventListener('click',e=>{let a = document.createElement('div')a.className = 'block'//首先获取到鼠标点击时的坐标位置let x = e.clientXlet y = e.clientY/* 因为小球本身时带有高度和宽度的所以在进行位置判断的时候需要先减去小球宽高的一半 */let ballX = x - 10let ballY = y - 10a.style.left = ballX + 'px'a.style.top = ballY + 'px'body.appendChild(a)
}

现在小球已经有了,位置也对了,接下来就要让小球动起来了,小球运动的话就需要进行刷新了,也就是说我们需要用到 setInterval() 这个方法来进行小球位置的刷新,刷新频率的话一般30ms就够了,大家都知道运动距离等于运动速度乘以运动时间,运动速度可以理解为单位事件内运动的距离,现在刷新事件已经有了,也就是30ms 所以只需要再设定一个单位距离作为速度即可。

/* 在上边我把黑洞的位置设到了屏幕正中心
所以小球的运动轨迹应该是向着正中心位置偏移 */
let h = window.innerHeight
let w = window.innerWidth
/* 速度的生成建议通过下边这种方式来进行生成
这样生成的速度本身是带有正负的
所以就不需要判断点击时小球是在中心点之上还是之下了 */
let speedX = (x - w/2)/30
let speedY = (y - h/2)/30
body.appendChild(a)
a.style.left = ballX + 'px'
a.style.top = ballY + 'px'
let itv = setInterval(()=>{//每30ms刷新一次位置ballY -= speedYballX -= speedXa.style.left = ballX + 'px'a.style.top = ballY + 'px'
},30)

现在小球的运动已经完成了,但是还有一个问题,小球在运动到黑洞位置时不会消失,还会一直运动直到飞出屏幕之外(因为body设置了overflow:hidden属性,所以看不到了,但其实还在),所以接下来需要做一个判断,在小球运动到黑洞位置时让它消失

/* 这几行代码建议放在点击事件之外
因为他们本身不需要频繁创建
可以节省开销 */
let b = document.getElementById('blackhole')
let bw = b.clientHeight
let bh = b.clientWidth
let bt = b.offsetTop
let bl = b.offsetLeft
/* 这里的判断条件看起来很复杂,稍微解释一下
因为小球本身是基于中心点运动的
而且因为小数点等问题的缘故也是无法直接让小球坐标等于中心点的
所以应该是在小球运动到某一区间值时进行操作
小球的left应该介于黑洞的左右边界之间,即
ballX < (bl + bw - 20) && ballX > (bl - 10)
top介于黑洞的上下边界之间
ballY < (bt + bh - 20) && ballY >  (bt - 10) */
if((ballX < (bl + bw - 20) && ballX > (bl - 10))&&
(ballY < (bt + bh - 20) && ballY >  (bt - 10))){clearInterval(itv) //清除计时器body.removeChild(a)
}

现在小球已经可以到达指定位置,然后消失了,但是距离我们想要的效果还差那么一点点,我们还要黑洞会随着吞噬小球的多少而进行成长

//首先,在最外部声明一个小球成长比例的参数
let p = 1
//然后在小球碰撞到黑洞后,调整黑洞的大小及位置
p += 0.1
b.style.width = bw * p + 'px'
b.style.height = bh * p + 'px'
b.style.top = 'calc(50% - '+ bh * p/2 +'px)'
b.style.left = 'calc(50% - '+ bw * p/2 +'px)'

OK,大功告成
在这里插入图片描述

完整代码

<style type="text/css">body, html{height: 100%;width: 100%;margin: 0;overflow: hidden;}.block {width: 30px;height: 30px;position: absolute;background: radial-gradient(red, transparent, transparent);border-radius: 10px;}#blackhole {width: 40px;height: 40px;background: radial-gradient(black, transparent, transparent);position: absolute;left: calc(50% - 20px); top: calc(50% - 20px);}
</style>
<body id="body"><div class="blackhole" id="blackhole"></div><script type="text/javascript">let body = document.getElementById('body')let b = document.getElementById('blackhole')let h = window.innerHeightlet w = window.innerWidthlet bw = b.clientHeightlet bh = b.clientWidthlet bt = b.offsetToplet bl = b.offsetLeftlet p = 1body.addEventListener('click',e=>{let a = document.createElement('div')a.className = 'block'let x = e.clientXlet y = e.clientYlet ballX = x - 10let ballY = y - 10let speedX = (x - w/2)/30 //每次运动点击位置到中心点的1/30距离let speedY = (y - h/2)/30body.appendChild(a)a.style.left = ballX + 'px'a.style.top = ballY + 'px'let itv = setInterval(()=>{//每30ms刷新一次位置ballY -= speedYballX -= speedXa.style.left = ballX + 'px'a.style.top = ballY + 'px'if((ballX < (bl + bw - 20) && ballX > (bl - 10))&&(ballY < (bt + bh - 20) && ballY >  (bt - 10))){clearInterval(itv)body.removeChild(a)p += 0.1b.style.width = bw * p + 'px'b.style.height = bh * p + 'px'b.style.top = 'calc(50% - '+ bh * p/2 +'px)'b.style.left = 'calc(50% - '+ bw * p/2 +'px)'}},30)})</script>
</body>
w * p + 'px'b.style.height = bh * p + 'px'b.style.top = 'calc(50% - '+ bh * p/2 +'px)'b.style.left = 'calc(50% - '+ bw * p/2 +'px)'}},30)})</script>
</body>

总结

相对来说,整个制作都是很简单的,但是也稍微有了那么一点游戏的意思,代码本身并不难重点还是需要搞清楚自己的思路吧

这篇关于css+js完成黑洞吞噬小球成长功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365026

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧