原生js实现祖玛青蛙吐珠子游戏代码
代码语言:html
所属分类:游戏
代码描述:原生js实现祖玛青蛙吐珠子游戏代码,游戏的主角是一只石青蛙,石青蛙会吐出各种颜色的珠子,珠子造型美丽,色彩鲜艳,环绕着石青蛙的是承载珠子的轨道,各种颜色的珠子沿着轨道往前滑动,石青蛙必需遏止珠子滚进轨道终点的洞穴。石青蛙吐出的珠子与轨道上的珠子相结合,颜色相同即可消失得分,当轨道上的所有珠子被消除干净时即取得游戏的胜利。
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <link href="https://fonts.googleapis.com/css2?family=Josefin+Sans:wght@400;500;600;700&display=swap" rel="stylesheet"> <style> * { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; font-family: inherit; box-sizing: border-box; } *[hidden] { display: none; } body { line-height: 1; } menu, ol, ul { list-style: none; } blockquote, q { quotes: none; } blockquote:before, blockquote:after, q:before, q:after { content: ""; content: none; } table { border-collapse: collapse; border-spacing: 0; } html, body { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; background-image: radial-gradient(circle at center, #002129, #000); overflow: hidden; font-family: "Josefin Sans", sans-serif; } .container { position: relative; background-image: url("//repo.bfw.wiki/bfwrepo/svg/zuma/bg.svg"); } .container::before { content: ""; display: block; width: 1287.709px; height: 1004.262px; background-image: url("//repo.bfw.wiki/bfwrepo/svg/zuma/bg-leaf.svg"); position: absolute; top: -55px; left: -80px; } .container .leaf { position: absolute; z-index: 10; } .container .leaf-01 { width: 290.296px; height: 197.981px; background-image: url("//repo.bfw.wiki/bfwrepo/svg/zuma/bg-leaf.svg"); transform-origin: top left; top: -10px; left: -50px; animation: leaf 8s -2s infinite; } .container .leaf-02 { width: 130.828px; height: 131.056px; background-image: url("//repo.bfw.wiki/bfwrepo/svg/zuma/bg-leaf.svg"); transform-origin: top right; top: -60px; right: 325px; animation: leaf 10s -3s infinite; } .container .leaf-03 { width: 214.618px; height: 225.252px; background-image: url("//repo.bfw.wiki/bfwrepo/svg/zuma/bg-leaf.svg"); transform-origin: top right; top: 60px; right: -60px; animation: leaf 5s -2s infinite; } .container .leaf-04 { width: 303.2px; height: 356.908px; background-image: url("//repo.bfw.wiki/bfwrepo/svg/zuma/leaf-04.svg"); transform-origin: bottom left; bottom: -60px; left: 0px; animation: leaf 7s -1s infinite; } .container .leaf-05 { width: 253.153px; height: 292.861px; background-image: url("//repo.bfw.wiki/bfwrepo/svg/zuma/leaf-05.svg"); transform-origin: bottom right; bottom: -110px; right: 660px; animation: leaf 9s -3s infinite; } .container .leaf-06 { width: 269.787px; height: 346.454px; background-image: url("//repo.bfw.wiki/bfwrepo/svg/zuma/leaf-06.svg"); transform-origin: bottom right; bottom: -75px; right: -40px; animation: leaf 15s -5s infinite; } .container svg { opacity: 0; pointer-events: none; } .container .player { width: 175px; height: 175px; position: absolute; top: 0; left: 0; z-index: 11; } .container .player::before { content: ""; display: block; width: 2px; height: 600px; margin-left: -1px; position: absolute; left: 50%; bottom: 30px; background-image: linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.5)); z-index: 1; } .container .player::after { content: ""; display: block; width: 100%; height: 100%; position: relative; background-size: contain; background-image: url("//repo.bfw.wiki/bfwrepo/svg/zuma/frog.svg"); z-index: 2; } .container .player .marble-1, .container .player .marble-2 { position: absolute; z-index: 3; } .container .player .marble-1 { width: 60px; height: 60px; border-radius: 100px; top: -10px; left: 50%; transform: translateX(-50%); } .container .player .marble-2 { width: 20px; height: 20px; border-radius: 100px; left: 50%; border: solid 5px #83be7c; } .container .player .marble-2:nth-child(2) { top: 85px; transform: translateX(calc(-50% - 30px)); } .container .player .marble-2:nth-child(3) { width: 25px; height: 25px; top: 105px; transform: translateX(-50%); } .container .player .marble-2:nth-child(4) { top: 85px; transform: translateX(calc(-50% + 30px)); } .container .start-hole { width: 100px; height: 100px; border-radius: 100px; background-color: black; position: absolute; transform: translate(-50%, -50%); } .container .final-hole { width: 100px; height: 100px; border-radius: 100px; background-color: rgba(0, 0, 0, 0.5); position: absolute; transform: translate(-50%, -50%); } .marble { background-color: rgba(0, 0, 0, 0.5); border-radius: 100px; position: absolute; top: 0; left: 0; z-index: 2; } .shadow { width: 100%; height: 100%; position: absolute; top: 0; left: 0; background-image: radial-gradient(circle at center, rgba(0, 33, 41, 0), rgba(0, 0, 0, 0.8)); z-index: 20; pointer-events: none; } .shadow::before { content: ""; display: block; width: 100%; height: 100%; background-image: url("//repo.bfw.wiki/bfwrepo/image/5dfd8574f13f0.png"); position: absolute; opacity: 0.1; } .github { width: 50px; height: 50px; border-radius: 100px; position: absolute; top: 40px; right: 40px; background-color: rgba(255, 255, 255, 0.5); } .github a { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; color: #002129; font-size: 30px; font-weight: bold; text-decoration: none; } .score { position: absolute; bottom: 40px; right: 40px; color: #fff; text-align: right; } .score .title { font-size: 16px; } .score .num { font-size: 90px; } .popup-container { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; color: #002129; position: absolute; top: 0; left: 0; z-index: 19; pointer-events: none; } .popup-container .popup { min-width: 300px; padding: 50px 40px 30px; border-radius: 30px; opacity: 0; background-color: rgba(255, 255, 255, 0.8); position: absolute; transform: translateY(20px); transition: 0.2s; pointer-events: none; z-index: 1; } .popup-container .popup::after { content: ""; display: block; width: calc(100% - 20px); height: calc(100% - 20px); border: solid 5px #002129; border-radius: 30px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); pointer-events: none; } .popup-container .popup .title { font-size: 30px; text-align: center; font-weight: 700; margin-bottom: 20px; letter-spacing: 1px; } .popup-container .popup .info { font-size: 16px; color: #002129; text-align: center; } .popup-container .popup .info ul { list-style-type: disc; padding-left: 1em; text-align-last: left; } .popup-container .popup .info ul li { margin-top: 10px; } .popup-container .popup .info .num { font-size: 24px; font-weight: bold; } .popup-container .popup .button-container { display: flex; flex-direction: column; justify-content: center; align-items: center; align-content: center; margin-top: 30px; } .popup-container .popup .button-container .button { font-size: 20px; font-weight: 500; color: #fff; font-size: 16px; text-align: center; letter-spacing: 1px; background-color: #002129; border-radius: 100px; padding: 15px 30px 10px; cursor: pointer; } .popup-container .popup .button-container .button.button-2 { padding: 0; margin-top: 15px; font-size: 14px; font-weight: bold; color: #002129; background-color: transparent; } .popup-container .popup.active { opacity: 1; transform: translateY(0px); pointer-events: auto; } .popup-container .popup.active ~ .mask { opacity: 1; } .popup-container .mask { width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); position: absolute; top: 0; left: 0; opacity: 0; transition: 0.5s; pointer-events: none; } @keyframes leaf { 0% { transform: rotate(0deg); } 50% { transform: rotate(10deg); } 100% { transform: rotate(0deg); } } </style> </head> <body > <div class="shadow"></div> <div id="score" class="score"> <div class="title">SCORE</div> <div class="num">0</div> </div> <div class="popup-container"> <div id="start" class="popup active"> <div class="title">HELLO !</div> <div class="info"> <ul> <li>LEFT CLICK TO SHOOT MARBLE</li> <li>PRESS "SPACE" TO SWITCH THE MARBLE COLOR</li> <li>PRESS "ESC" TO STOP</li> </ul> </div> <div class="button-container"> <div class="button">START</div> </div> </div> <div id="stop" class="popup"> <div class="title">HELLO !</div> <div class="info"> YOOOOU JUSSSSSST NEED A BRRRRRRREAK ! </div> <div class="button-container"> <div id="start-btn" class="button">START</div> <div id="reset-btn" class="button button-2">RESTART</div> </div> </div> <div id="final" class="popup"> <div class="title">HELLO !</div> <div class="info"> YOU GOT <span class="num"></span> SCORES ! </div> <div class="button-container"> <div class="button">RESTART</div> </div> </div> <div class="mask"></div> </div> <script > "use strict"; const OneFrameTime = 17; const createDiv = (classList, children = []) => { const div = document.createElement("div"); div.classList.add(...classList); children.forEach((ele) => { div.appendChild(ele); }); return div; }; const createElementNS = (name, attr) => { const xmlns = "http://www.w3.org/2000/svg"; const elementNS = document.createElementNS(xmlns, name); Object.keys(attr).forEach((key) => { elementNS.setAttributeNS(null, key, attr[key]); }); return elementNS; }; class Marble { constructor({ color = `#ff2244` }) { this.ID = `${(~~(Math.random() * 1000000000)) .toString(16) .toLocaleUpperCase()}`; this.DOM = createDiv(["marble"]); this.Color = color; this.DOM.style.backgroundColor = this.Color; this.DOM.style.width = `${Marble.Size}px`; this.DOM.style.height = `${Marble.Size}px`; } setPosition(x, y) { this.x = x; this.y = y; if (this.DOM) { this.DOM.style.transform = `translate(calc(${this.x}px - 50%), calc(${this.y}px - 50%))`; } return this; } appendTo(parent) { this.parent = parent; parent.appendChild(this.DOM); return this; } remove() { if (!this.parent) { return this; } this.parent.removeChild(this.DOM); this.parent = null; return this; } overlap(marble) { let r = Marble.Size - Math.sqrt((this.x - marble.x) ** 2 + (this.y - marble.y) ** 2); return r; } } Marble.Size = 60; class Player { constructor({ x = 0, y = 0 }) { this.Marble = createDiv(["marble-1"]); this.NextMarbleList = [ createDiv(["marble-2"]), createDiv(["marble-2"]), createDiv(["marble-2"]) ]; this.DOM = createDiv(["player"], [this.Marble, ...this.NextMarbleList]); this.X = x; this.Y = y; this.DOM.style.transform = `translate(calc(${this.X}px - 50%), calc(${this.Y}px - 50%)) rotate(0deg)`; } lookAt(x, y) { if (!this.parent) { return this; } this.lookX = x; this.lookY = y; const rect = this.DOM.getBoundingClientRect(); const innerX = rect.left + (rect.right - rect.left) / 2; const innerY = rect.top + (rect.bottom - rect.top) / 2; this.rotate = (Math.atan2(this.lookY - innerY, this.lookX - innerX) * 180) / Math.PI + 90; this.DOM.style.transform = `translate(calc(${this.X}px - 50%), calc(${this.Y}px - 50%)) rotate(${this.rotate}deg)`; return this; } appendTo(parent) { this.parent = parent; this.parent.appendChild(this.DOM); return this; } setMarbleColor(color) { this.Marble.style.backgroundColor = color; return this; } setNextMarbleColor(color) { this.NextMarbleList.forEach((dom) => { dom.style.backgroundColor = color; }); return this; } getVector() { const innerRotate = this.rotate - 90; return { x: Math.cos((innerRotate * Math.PI) / 180) * 30, y: Math.sin((innerRotate * Math.PI) / 180) * 30 }; } } class Zuma { constructor(data) { this.AllMarbleLength = 100; this.InitMarbleLength = 20; this.Container = createDiv(["container"], [ createDiv(["leaf", "leaf-01"]), createDiv(["leaf", "leaf-02"]), createDiv(["leaf", "leaf-03"]), createDiv(["leaf", "leaf-04"]), createDiv(["leaf", "leaf-05"]), createDiv(["leaf", "leaf-06"]) ]); this.Path = createElementNS("path", {}); this.moveSpeed = 4; this.autoAddMarbleCount = 0; this.marbleDataList = []; this.marbleBoomList = []; this.marbleColorCount = {}; this.moveTimes = 0; this.isStart = false; this._isInit = false; this._isFinal = false; this.windowEventList = []; this.checkDeleteAfterTouchData = {}; this.playerMarble = { now: null, next: null }; this._score = 0; this.width = data.width; this.height = data.height; const svg = createElementNS("svg", { x: "0px", y: "0px", width: `${data.width}px`, height: `${data.height}px`, viewBox: `0 0 ${data.width} ${data.height}` }); svg.appendChild(this.Path); this.Path.setAttributeNS(null, "d", data.path); this.PathLength = this.Path.getTotalLength(); const startHolePos = this.Path.getPointAtLength(0); const finalHolePos = this.Path.getPointAtLength(this.PathLength); const startHole = createDiv(["start-hole"]); const finalHole = createDiv(["final-hole"]); startHole.style.left = `${startHolePos.x}px`; startHole.style.top = `${startHolePos.y}px`; finalHole.style.left = `${finalHolePos.x}px`; finalHole.style.top = `${finalHolePos.y}px`; this.Container.appendChild(startHole); this.Container.appendChild(finalHole); this.Container.style.width = `${data.width}px`; this.Container.style.height = `${data.height}px`; this.Container.style.transform = `scale(${data.scale || 1})`;.........完整代码请登录后点击上方下载按钮下载查看
网友评论0