react+three打造支持键盘和声音输出的三维汉堡架子鼓弹奏效果代码

代码语言:html

所属分类:三维

代码描述:react+three打造支持键盘和声音输出的三维汉堡架子鼓效果代码,从面包汉堡拆封成架子鼓动画后,点击鼠标或键盘即可进行弹奏,有声音输出

代码标签: 键盘 声音 输出 三维 汉堡 架子 弹奏 效果

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>

 
<meta charset="UTF-8">

 
 
 
<style>
@import url("https://fonts.googleapis.com/css2?family=Metal+Mania&display=swap");
.App {
 
text-align: center;
 
display: flex;
 
width: 100%;
 
height: 100%;
}

.component-carousel {
 
position: absolute;
 
top: 20px;
 
right: 20px;
 
flex-direction: column;
 
display: flex;
 
align-items: center;
 
justify-content: center;
 
color: white;
 
text-decoration: none;
 
transition: transform 0.2s ease-in-out;
}

.component-carousel img {
 
width: 187px;
 
margin-top: 10px;
}

.component-carousel:hover {
 
text-decoration: underline;
}

.component-carousel:hover img {
 
transform: translate(2px, 2px);
}

html
, body {
 
width: 100%;
 
height: 100%;
 
overflow: hidden;
 
margin: 0;
 
padding: 0;
 
display: flex;
 
align-items: center;
 
justify-content: center;
 
color: white;
 
background-color: #142522;
 
font-family: sans-serif;
}

.burger-drum {
 
overflow: hidden;
 
position: relative;
}

.burger-drum .container {
 
width: 100vw;
 
max-width: 1800px;
 
height: 60vw;
 
min-height: 400px;
 
max-height: 100vh;
}

.info {
 
position: absolute;
 
bottom: 40px;
 
left: 40px;
 
width: 40vw;
 
max-width: 500px;
 
display: flex;
 
justify-content: center;
 
align-items: flex-start;
 
flex-direction: column;
 
transform: translateX(-50vw);
 
transition: transform 0.5s ease-in-out;
}

.presents {
 
margin-bottom: 20px;
}

.burger .info {
 
transform: translateX(0);
}

h1
{
 
font-family: "Metal Mania", cursive;
 
font-size: clamp(40px, 6vw, 100px);
 
letter-spacing: 5px;
 
margin: 0;
 
white-space: nowrap;
}

p
{
 
text-align: left;
 
font-size: 20px;
 
margin-bottom: 40px;
 
/* letter-spacing: 0.03em; */
 
line-height: 130%;
}

button
{
 
margin-right: 40px;
 
background-color: rgba(0, 0, 0, 0.3);
 
padding: 10px 30px;
 
border: solid 1px white;
 
color: white;
 
font-size: 30px;
 
/* text-transform: uppercase; */
 
letter-spacing: 3px;
 
font-family: "Metal Mania", cursive;
 
cursor: pointer;
 
outline: solid 1px transparent;
 
outline-offset: 0px;
 
transition-property: background-color, outline-offset, outline;
 
transition-duration: 0.1s;
 
transition-timing-function: ease-in-out;
}

button:hover:not(:disabled) {
 
background-color: darkred;
 
outline: solid 1px white;
 
outline-offset: 2px;
}

button:disabled {
 
opacity: 0.3;
}

.controls {
 
position: absolute;
 
bottom: 40px;
 
right: 40px;
 
width: calc(100% - 80px);
 
display: flex;
 
justify-content: space-between;
 
align-items: flex-end;
 
transform: translateY(200%);
 
transition: transform 0.5s ease-in-out;
}

.drums .controls {
 
transform: translateY(0%);
}

.loader {
 
position: absolute;
 
top: 50%;
 
left: 50%;
 
font-size: 50px;
 
font-family: "Metal Mania", cursive;
 
transform: translate(-50%, -50%);
 
pointer-events: none;
 
opacity: 0;
 
transition: opacity 0.2s ease-in-out;
}

.loading .loader {
 
opacity: 10;
}

.controls span {
 
text-transform: uppercase;
 
padding: 2px;
 
display: inline-block;
 
border: 2px solid white;
 
border-bottom: 4px solid white;
 
border-radius: 6px;
 
width: 20px;
 
height: 20px;
 
margin-left: 10px;
}
</style>




</head>

<body >
 
<div id="root"></div>
 
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/babel.min.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/react.production.17.1.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/react-dom.production.17.1.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/gsap.3.5.2.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/MotionPathPlugin.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/three.126.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/GLTFLoader.js"></script>
     
<script  type="text/babel">

 const {useEffect, useRef, useState } = React;
//import React, { useEffect, useRef, useState } from 'https://cdn.skypack.dev/react@17';
//import ReactDOM from 'https://cdn.skypack.dev/react-dom@17';
//import gsap from "https://cdn.skypack.dev/gsap@3.6.1";
//import { MotionPathPlugin } from "https://cdn.skypack.dev/gsap@3.6.1/MotionPathPlugin";
//import * as THREE from "https://cdn.skypack.dev/three@0.129.0";
//import { GLTFLoader } from 'https://cdn.skypack.dev/three@0.129.0/examples/jsm/loaders/GLTFLoader.js';

const FILES = {
  drum: "//repo.bfw.wiki/bfwrepo/threemodel/drums.glb",
  burger: "//repo.bfw.wiki/bfwrepo/threemodel/burger.glb",
  snare: "//repo.bfw.wiki/bfwrepo/sound/drums/snare.mp3",
  bass: "//repo.bfw.wiki/bfwrepo/sound/drums/bass.mp3",
  tom1: "//repo.bfw.wiki/bfwrepo/sound/drums/tom-1.mp3",
  tom2: "//repo.bfw.wiki/bfwrepo/sound/drums/tom-2.mp3",
  tom3: "//repo.bfw.wiki/bfwrepo/sound/drums/tom-3.mp3",
  cymbal1: "//repo.bfw.wiki/bfwrepo/sound/drums/cymbal-1.mp3",
  cymbal2: "//repo.bfw.wiki/bfwrepo/sound/drums/cymbal-2.mp3" };


gsap.registerPlugin(MotionPathPlugin);

function App() {
  return /*#__PURE__*/(
    React.createElement("div", { className: "App" }, /*#__PURE__*/
    React.createElement(BurgerDrum, null), /*#__PURE__*/
));



}

function BurgerDrum() {

  const mount = useRef();
  const [view, setView] = useState('loading');
  const [manager, setManager] = useState(null);

  const init = () => {
    if (mount.current)
    {
      const stage = new Stage(mount.current);
      const _manager = new Manager(stage, view, setView);

      setManager(_manager);

      return () => {
        stage.destroy();
        _manager.fire();
      };
    }
  };

  const toggleView = () => {setView(view === 'burger' ? 'drums' : 'burger');};

  useEffect(init, [mount]);
  useEffect(() => {if (manager) manager.updateView(view);}, [view, manager]);

  return /*#__PURE__*/(
    React.createElement("div", { className: `burger-drum ${view}` }, /*#__PURE__*/
    React.createElement("div", { className: "container", ref: mount }), /*#__PURE__*/
    React.createElement("div", { className: "info" }, /*#__PURE__*/
    React.createElement("p", { className: "presents" }, "Buns N' Roses presents:"), /*#__PURE__*/
    React.createElement("h1", null, "Beat Burger"), /*#__PURE__*/
    React.createElement("p", null, "Our signature burger, inspired by legendary drummer ", /*#__PURE__*/React.createElement("i", null, "[your favorite drummer here]"), ". Order online now ", /*#__PURE__*/React.createElement("i", null, "(or don't because this is all pretend)"), " or transform this burger into a drum kit and play some sweet beats!"), /*#__PURE__*/
    React.createElement("div", { className: "buttons" }, /*#__PURE__*/
    React.createElement("button", { disabled: true }, "Order now"), /*#__PURE__*/
    React.createElement("button", { onClick: toggleView }, "Play"))), /*#__PURE__*/


    React.createElement("div", { className: "controls" }, /*#__PURE__*/
    React.createElement("button", { onClick: toggleView }, "Back"), /*#__PURE__*/
    React.createElement("div", .........完整代码请登录后点击上方下载按钮下载查看

网友评论0