相信大家都玩过王者荣耀吧,那么王者荣耀在html中要怎么实现呢?

话不多说,上代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>王者地图</title><script src="./three.min.js"></script><script src="./MOBAControls.js"></script><script src="./DRACOLoader.min.js"></script><script src="./GLTFLoader.min.js"></script><script src="./nipplejs.min.js"></script><script src="./vconsole.min.js"></script><script src="https://cdn.bootcss.com/tween.js/r14/Tween.min.js"></script>
</head>
<style>html, body, #output{width: 100%;height: 100%;padding: 0;margin: 0;overflow: hidden;}#layer{width: 100%;height: 100%;position: absolute;background-color: rgba(211, 226, 226, 0.4);top: 0;left: 0;}.loading{position: absolute;top: 50%;left: 50%;transform: translateX(-50%) translateY(-50%);z-index: 10;width: 60px;height: 40px;margin: 0 auto;}.loading span{display: inline-block;width: 8px;height: 100%;border-radius: 4px;background: lightgreen;-webkit-animation: load 1s ease infinite;}@-webkit-keyframes load{0%,100%{height: 40px;background: lightgreen;}50%{height: 70px;margin: -15px 0;background: lightblue;}}.loading span:nth-child(2){-webkit-animation-delay:0.2s;}.loading span:nth-child(3){-webkit-animation-delay:0.4s;}.loading span:nth-child(4){-webkit-animation-delay:0.6s;}.loading span:nth-child(5){-webkit-animation-delay:0.8s;}.tip{position: absolute;top: 50%;left: 50%;transform: translateX(-50%) translateY(20px);z-index: 10;}.tip span{color: #0ff}
</style>
<body><div id="layer"><div class="loading"><span></span><span></span><span></span><span></span><span></span></div><div class='tip'><span>开启屏幕旋转可以横置屏幕</span></div></div><div id="output"></div>
</body>
<script>// 'dev' / 'prod'// const evirenment = 'dev'const evirenment = 'prod'if(evirenment == 'dev'){new VConsole()}window.onload = () => {let name = evirenment == 'dev'? '汤圆skr狠人': prompt('请给自己角色取个名字,碰撞检测已暂时被注释', '如: 王xx')name = name || '王xx'let scenelet cameralet rendererconst init = (dom) => {scene = new THREE.Scene()let ambientLight = new THREE.AmbientLight( 0xffffff)scene.add(ambientLight)let light = new THREE.DirectionalLight( 0xffffff)light.castShadow = truelight.shadow.camera.left = light.shadow.camera.bottom = -300light.shadow.camera.right = light.shadow.camera.top = 300light.position.set(10, -50, 100)scene.add(light)size = {width: dom.offsetWidth,height: dom.offsetHeight}camera = new THREE.PerspectiveCamera(45, size.width / size.height, 0.5, 20000)evirenment == 'dev'? camera.position.set(30, 30, 30): camera.position.set(30, 30, 30)camera.up.set(0, 0, 1)renderer = new THREE.WebGLRenderer({antialias: true,alpha: true})renderer.setSize(size.width, size.height)renderer.setClearColor(0x000000)renderer.setPixelRatio(window.devicePixelRatio)dom.appendChild(renderer.domElement)renderer.gammaFactor = 2renderer.gammaOutput = truerenderer.shadowMap.enabled = true}var dom = document.querySelector('#output')init(dom)let controlslet loader = new THREE.GLTFLoader().setPath( evirenment == 'dev' ? './model/': 'https://xiongtongzi.oss-cn-shanghai.aliyuncs.com/model/');THREE.DRACOLoader.setDecoderPath(  evirenment == 'dev' ? './model/': 'https://xiongtongzi.oss-cn-shanghai.aliyuncs.com/model/' );loader.setDRACOLoader( new THREE.DRACOLoader() )class LevelBlood{constructor(name, options){this.color = options.color || 0x0000ff // 血条颜色this.totalBlood = options.totalBlood|| 500// 总血量this.currentBlood = options.currentBlood || 500 //即时血量this.totalBlue = options.totalBlue|| 100// 总蓝量this.currentBlue = options.currentBlue || 100 //即时蓝量this.level = options.level || 1//初始等级this.bloodCellNumber = options.cellNumber || 100//单刻度值this.backgroundColor = options.backgroundColor || '#001'//整个背景色this.bloodColor = options.bloodColor || '#0f0' //血条颜色this.blueColor = options.blueColor || '#00f' //蓝条颜色this.totalInLevel = options.totalInLevel || 100 //级内总进度this.inLevel = options.inLevel || 0 //级内进度this.name = namethis.init()this.draw()}init(){this.canvas = document.createElement('canvas')this.canvas.width = 512this.canvas.height = 128this.ctx = this.canvas.getContext('2d')}config(options){this.color = options.color || this.color// 血条颜色this.totalBlood = options.totalBlood|| this.totalBlood// 总血量this.currentBlood = options.currentBlood || this.currentBlood //即时血量this.totalBlue = options.totalBlue|| this.totalBlue// 总蓝量this.currentBlue = options.currentBlue || this.currentBlue //即时蓝量this.level = options.level || this.level//初始等级this.bloodCellNumber = options.cellNumber || this.bloodCellNumber//单刻度值this.backgroundColor = options.backgroundColor || this.backgroundColor//整个背景色this.bloodColor = options.bloodColor || this.bloodColor //血条颜色this.blueColor = options.blueColor || this.blueColor //蓝条颜色this.totalInLevel = options.totalInLevel || this.totalInLevel //级内总进度this.inLevel = options.inLevel || this.inLevel //级内进度this.draw()}draw(){this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)// 绘圆this.ctx.fillStyle = this.backgroundColorlet halfHeight = this.canvas.height / 2let r = halfHeight * .8this.ctx.arc(halfHeight, halfHeight, r, 0, Math.PI * 2)this.ctx.fill()// 绘矩形let rectHeight = 50let marginTop = (this.canvas.height - rectHeight) * .5let marginBottom = (this.canvas.height + rectHeight) * .5this.ctx.fillStyle = this.backgroundColorthis.ctx.beginPath()this.ctx.moveTo(halfHeight, marginTop)this.ctx.lineTo(this.canvas.width, marginTop)this.ctx.lineTo(this.canvas.width, marginBottom)this.ctx.lineTo(halfHeight, marginBottom)this.ctx.lineTo(halfHeight, marginTop)this.ctx.fill()this.ctx.closePath()//级内经验占位this.ctx.strokeStyle = '#000'this.ctx.lineWidth = 5this.ctx.beginPath()this.ctx.arc(halfHeight, halfHeight, r * 0.8, 0, Math.PI * 2)this.ctx.stroke()this.ctx.closePath()//级内经验this.ctx.strokeStyle = '#ff7f00'this.ctx.lineWidth = 5this.ctx.beginPath()this.ctx.arc(halfHeight, halfHeight, r * 0.8, - Math.PI * .5, this.inLevel / this.totalInLevel * Math.PI * 2 - Math.PI * .5)this.ctx.stroke()this.ctx.closePath()// 绘制等级this.ctx.font = 'bold 40px Arial'this.ctx.textAlign = 'center'this.ctx.fillStyle = '#fff'this.ctx.textBaseline ="middle"this.ctx.fillText(this.level, halfHeight, halfHeight)//绘制名称this.ctx.font = 'bold 40px Arial'this.ctx.textAlign = 'center'this.ctx.fillStyle = '#fff'this.ctx.textBaseline ="top"this.ctx.fillText(this.name, (this.canvas.width - this.canvas.height) * .5 + this.canvas.height, 0)let offsetY = 8let offsetX = 8let totalHeight = rectHeight - offsetY * 3let blueBloodStart = halfHeight + rlet bloodBlueTotalLength = this.canvas.width - offsetX - blueBloodStart//绘制蓝条let blueCurrentLength = blueBloodStart + this.currentBlue / this.totalBlue * bloodBlueTotalLengththis.ctx.fillStyle = this.blueColorthis.ctx.beginPath()this.ctx.moveTo(blueBloodStart, marginBottom - totalHeight * .2 - offsetY)this.ctx.lineTo(blueCurrentLength, marginBottom - totalHeight * .2 - offsetY)this.ctx.lineTo(blueCurrentLength, marginBottom - offsetY)this.ctx.lineTo(blueBloodStart, marginBottom - offsetY)this.ctx.lineTo(blueBloodStart, marginBottom - totalHeight * .2 - offsetY)this.ctx.fill()this.ctx.closePath()//绘制血条let bloodCurrentLength = blueBloodStart + this.currentBlood / this.totalBlood * bloodBlueTotalLengththis.ctx.fillStyle = this.bloodColorthis.ctx.beginPath()this.ctx.moveTo(blueBloodStart, marginTop + offsetY)this.ctx.lineTo(bloodCurrentLength, marginTop + offsetY)this.ctx.lineTo(bloodCurrentLength, marginTop + totalHeight * .8 + offsetY)this.ctx.lineTo(blueBloodStart, marginTop + totalHeight * .8 + offsetY)this.ctx.lineTo(blueBloodStart, marginTop + offsetY)this.ctx.fill()this.ctx.closePath()//血量刻度this.ctx.strokeStyle = this.backgroundColorthis.ctx.lineWidth = 6let splitNumber = this.totalBlood / this.bloodCellNumberlet step = (this.canvas.width - offsetX - blueBloodStart) / splitNumberfor(let i = 0; i < splitNumber; i ++){let length = 12if(i % 5 == 0){length = 20}this.ctx.beginPath()this.ctx.moveTo(blueBloodStart + i * step, marginTop + offsetY)this.ctx.lineTo(blueBloodStart + i * step, marginTop + offsetY + length)this.ctx.stroke()this.ctx.closePath()}}test(id){// 测试输出用let dom = document.querySelector(id)dom.appendChild(this.canvas)}}var mixer, action;let ssxObject, ssxOriginRotationlet clock = new THREE.Clock()let deltalet spritelet levelBloodconst speedNumber = evirenment == 'dev' ? 1 : 0.2let speed = new THREE.Vector2()//设置站立const setStand = () => {speed.set(0, 0)action && action.stop()}const go = (x, y) => {speed.set(x, y)action && action.play()}loader.load( 'model.gltf', function ( gltf ) {gltf.scene.rotation.x = Math.PI * .5gltf.scene.rotation.y = -Math.PI * .25gltf.scene.traverse((item) => {if(item.material){item.material = new THREE.MeshBasicMaterial({map: item.material.map, transparent: true, alphaTest: 0.9})}if(item.children.length > 0 && (item.name.includes('地') || item.name.includes('路'))){item.traverse((child) => {child.receiveShadow = true})}})scene.add(gltf.scene)let tl = new THREE.TextureLoader()tl.setPath( evirenment == 'dev' ? './model/': 'https://xiongtongzi.oss-cn-shanghai.aliyuncs.com/model/')loader.load('ssx.gltf', (ssx) => {ssx.scene.rotation.x = Math.PI * .5ssx.scene.rotation.y = Math.PI * 1.5ssxOriginRotation = ssx.scene.rotation.clone()ssx.scene.scale.set(4, 4, 4)ssx.scene.position.set(218.27291759843078, -4.683324102610722, 0)ssx.scene.traverse((obj) => {if(obj.material){let name = obj.nameobj.material.map = tl.load(name + '.png')obj.castShadow = true}})scene.add(ssx.scene)ssxObject = ssx.scenecontrols = new MOBAControls( camera, {dom: renderer.domElement,target: ssxObject})mixer = new THREE.AnimationMixer(ssx.scene)action = mixer.clipAction(ssx.animations[0])levelBlood = new LevelBlood(name + '', {inLevel: 49})levelBlood.test('#output')sprite = new THREE.Sprite(new THREE.SpriteMaterial({map: new THREE.CanvasTexture(levelBlood.canvas),transparent: true,alphaTest: 0.6}))sprite.scale.set(8, 2, 1)scene.add(sprite)document.querySelector('#layer').style.display = 'none'let manager = nipplejs.create({zone: dom,multitouch: true,maxNumberOfNipples: 1,color: 'black'})let position = new THREE.Vector2()manager.on('start', (evt, data) => {let {x, y} = data.positionposition.set(x, y)})let pointerRaycaster = new THREE.Raycaster()manager.on('move', (evt, data) => {let {x, y} = data.positionlet offset = position.clone()let length = offset.sub(new THREE.Vector2(x, y)).length()// 限制最小响应if(length < 20){setStand()return}if(data.angle){let degree = data.angle.radian - Math.PI * .25let {x, y, z} = ssxOriginRotationssxObject.rotation.set(x, y + degree, z)go(- Math.cos(degree), - Math.sin(degree))// let {x: posx, y: posy} = ssxObject.position// // 射线判断// pointerRaycaster.set(new THREE.Vector3(posx, posy, 1), new THREE.Vector3(- Math.cos(degree), - Math.sin(degree), 0).normalize())// let raycasterGet = pointerRaycaster.intersectObjects(gltf.scene.children, true)// // console.log(raycasterGet)// if(raycasterGet.length > 0){//     let one = raycasterGet[0]//     if(one.distance < 1){//         speed.set(0, 0)//         console.log('停止')//     }// }}else{setStand()}})manager.on('end', (evt, data) => {setStand()position.set(0, 0)})})})//  nipple.js全面替代键盘操作// const keyDown = (e) => {//     e.preventDefault()//     let keyCode = e.keyCode//     if(!ssxObject) return//     if(keyCode == 87 || keyCode == 38){//w//         speed.y = -1//     }//     if(keyCode == 65 || keyCode == 37){//a//         speed.x = 1//     }//     if(keyCode == 83 || keyCode == 40){//s//         speed.y = 1//     }//     if(keyCode == 68 || keyCode == 39){//d//         speed.x = -1//     }// }// const keyUp = (e) => {//     e.preventDefault()//     let keyCode = e.keyCode//     if(!ssxObject) return//     if(keyCode == 87 || keyCode == 38){//         speed.y = 0//     }//     if(keyCode == 65 || keyCode == 37){//         speed.x = 0//     }//     if(keyCode == 83 || keyCode == 40){//         speed.y = 0//     }//     if(keyCode == 68 || keyCode == 39){//         speed.x = 0//     }// }const render = () => {controls && controls.update()delta = clock.getDelta()if(ssxObject){if(speed.length() > 0){let {x, y} = speed.clone().normalize().multiplyScalar(speedNumber)ssxObject.position.y += yssxObject.position.x += xlevelBlood.currentBlue > 0 && levelBlood.config({currentBlue: levelBlood.currentBlue - 0.2})levelBlood.currentBlood > 0 && levelBlood.config({currentBlood: levelBlood.currentBlood - 0.1})}else{levelBlood.currentBlue < levelBlood.totalBlue && levelBlood.config({currentBlue: levelBlood.currentBlue + 0.1})levelBlood.currentBlood < levelBlood.totalBlood && levelBlood.config({currentBlood: levelBlood.currentBlood + 0.05})}sprite.material.map.image = levelBlood.canvassprite.material.map.needsUpdate = true}sprite && sprite.position.copy(ssxObject.position).add(new THREE.Vector3(0, 0, 9))mixer && mixer.update( delta );renderer.render(scene, camera)requestAnimationFrame(render)}render()let mouse = new THREE.Vector2()let raycaster = new THREE.Raycaster()const move = (e) => {mouse.x = ((e.clientX - dom.getBoundingClientRect().left) / dom.offsetWidth) * 2 - 1mouse.y = -((e.clientY - dom.getBoundingClientRect().top) / dom.offsetHeight) * 2 + 1raycaster.setFromCamera( mouse, camera )let intersects = raycaster.intersectObjects(scene.children, true)if(intersects.length > 0){console.log(intersects[0])}}dom.addEventListener('click', move, false)const resize = () => {var size = {width: dom.offsetWidth,height: dom.offsetHeight}renderer.setSize(size.width, size.height)camera.aspect = size.width / size.heightcamera.updateProjectionMatrix()}window.addEventListener('resize', resize, false)// const FullScreen = () => {//     let isFullscreen = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen//     if(!isFullscreen){//进入全屏,多重短路表达式//         (document.requestFullscreen && document.requestFullscreen())||//         (document.mozRequestFullScreen && document.mozRequestFullScreen())||//         (document.webkitRequestFullscreen && document.webkitRequestFullscreen())||//         (document.msRequestFullscreen && document.msRequestFullscreen());//     }else{    //退出全屏,三目运算符//         document.exitFullscreen ? document.exitFullscreen()://         document.mozCancelFullScreen ? document.mozCancelFullScreen()://         document.webkitExitFullscreen ? document.webkitExitFullscreen():'';//     }// }const orientationchange = () => {if(window.innerHeight < window.innerWidth){console.log('full')// document.body.requestFullscreen && document.body.requestFullscreen()}else{console.log('exist')// document.exitFullscreen && document.exitFullscreen()}resize()}// window.addEventListener('orientationchange', orientationchange, false);// window.addEventListener('keydown', keyDown, false)// window.addEventListener('keyup', keyUp, false)}</script>
</html>

代码片段不全

全部代码加我VX :lingyuwuhongyuan领取

html 做王者荣耀相关推荐

  1. css html制做王者荣耀网站,css3配合js做王者荣耀3D旋转购买英雄效果以及源码展示...

    展示gif效果图 注:为了让大家可以直接pc端复制粘贴代码,不用自己敲,这里直接给大家上代码了! ******里面js部分运用一些很牛的算法促使运动之后有运动痕迹,这样有用缓冲效果! html: cs ...

  2. 貂蝉待你玩转Java王者荣耀

    相信很多小伙伴都玩游戏,而对于王者荣耀大家更是不陌生了.虽然王者荣耀在网上的不评论很不好,但是大多数还是逃不过真香定律,边吐槽边玩. 人类已经很难阻止<王者荣耀>前进的步伐了,进入2017 ...

  3. 《王者荣耀》爆红带动手游创业发展

    5月份开始,腾讯在港交所的股价经历了一轮持续上涨,市值一举突破了3000亿美元.而这波行情背后,离不开一个叫<王者荣耀>的手游.下至小学生,上至四十多岁的中年人,在闲时杀一局"王 ...

  4. Java项目你们期待的热门游戏-王者荣耀

    相信很多小伙伴都玩游戏,而对于王者荣耀大家更是不陌生了.虽然王者荣耀在网上的不评论很不好,但是大多数还是逃不过真香定律,边吐槽边玩. 人类已经很难阻止<王者荣耀>前进的步伐了,进入2017 ...

  5. 玩游戏学Java王者荣耀

    想起大学时期的我,也是这款游戏的狂热爱好者,没错,这款游戏就是王者荣耀!!! 该项目拥有完整视频教程和配套源码及学习资料,大家可以边学习边练手. 相信很多小伙伴都玩游戏,而对于王者荣耀大家更是不陌生了 ...

  6. 抖音里王者荣耀游戏视频搞怪的配音怎么做

    抖音里王者荣耀游戏视频搞怪的配音怎么做? 2020-10-13 17:06 来源:二喵的鱼 原标题:抖音里王者荣耀游戏视频搞怪的配音怎么做? 盘点抖音视频爆品类型,不知不觉中搞笑的游戏视频竟已冲出了一 ...

  7. Python环境下用中文做了个《王者荣耀》AI脚本

    <王者荣耀>AI最早的巅峰应该是在2018年 "AI(人工智能)"VS"人类明星战队" 以此为目标在python环境下开发了AI脚本自动打<王 ...

  8. JAVA有没有moba游戏_网易这款原创MOBA游戏,做了《王者荣耀》没有做的事情!

    大渣好,我叫呆毛哥,是爱搞事情的小爆哥的家庭老湿,不!是家庭老师. 提到MOBA手游,相信大家第一反应就是<王者荣耀>,甚至有一些人会把两者做等号,由此可见<王者荣耀>的统治地 ...

  9. 王者荣耀国际服怎么服务器未响应,游戏策划坦言:王者荣耀国际服想做也做了,但阻力太大,难以实现...

    原标题:游戏策划坦言:王者荣耀国际服想做也做了,但阻力太大,难以实现 昨晚(10月29日),游戏策划donny"空降"QGhappy前教练Gemini的直播间.而在Gemini的直 ...

  10. 用Java做爬虫爬取王者荣耀的英雄头像

    大家好,今天我和大家分享一下用Java做爬虫爬取王者荣耀的英雄头像. 首先我们需要王者荣耀的网址,然后获取连接,通过IO读取网页的源代码,用正则表达式筛选我们需要的代码,在每个筛选对象(图片的地址)前 ...

最新文章

  1. 实战域树部署,Active Directory系列之十九
  2. Socket、Tcp、Udp 概念区分
  3. 前端学习(1917)vue之电商管理系统电商系统之绘制面包屑导航和卡片视图调用api获取数据
  4. c++primer plus笔记
  5. MVVM模式的一个小例子
  6. java常用的正则表达式
  7. java面试准备---JSF系统学习知识点总结---随时更新
  8. 为什么我加了过滤器然后就登不进去了_布隆过滤器过时了,未来属于布谷鸟过滤器?...
  9. clickhouse Aggregatingmergetree表引擎
  10. Expression Blend实例中文教程(5) - 布局控件快速入门StackPanel,ScrollViewer和Border
  11. Flume 1.8.0 用户指南(Flume 1.8.0 User Guide)
  12. win10鼠标灵敏度怎么调_和平精英,灵敏度到底怎么调?小编视频来教你!
  13. gsp计算机管理系的功能,医药系统的GSP管理
  14. 通俗理解动态库与静态库区别
  15. 前沿重器[26] | 预训练模型的领域适配问题
  16. Python excel数据处理之公式---openpyxl
  17. fckeditor文档库
  18. PYNQ yocto运行python
  19. SQLSERVER数据库质疑解决方案
  20. 频谱、频谱密度、功率谱密度、能量谱密度

热门文章

  1. 可以运行的Oracle Advanced Queue的例子
  2. 深入了解mysql 5.5分区功能增强_深入了解MySQL 5.5分区功能增强
  3. python自定义事件event的含义_pyqt自定义事件学习出现问题
  4. vue强制刷新组件_Vue强制组件重新渲染
  5. linux内存管理方式,简要概括Linux内存管理的方式
  6. 深度学习神经网络中的梯度检查
  7. 通过tf的tensorboard可视化训练进度
  8. 浅谈Redis底层数据结构(sdshdr-redisObject)
  9. 2021年 考研数学一 第17题
  10. 基于Springboot实现销售团队管理系统